Почему я получаю сообщение об ошибке 401 (Unauthorized) при отправке POST в Google Reader API?

Я пытаюсь подключиться к API Google Reader (недокументированному/неофициальному), используя информацию из этого страница. Мой первый шаг - получить SID и токен, который отлично работает, но я не могу ничего отправить без ошибки 401.

Вот код, который я использую для получения своего SID и токена:

static string getSid()
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://www.google.com/accounts/ClientLogin?service=reader&Email=username&Passwd=password");
        req.Method = "GET";
        string sid;

        HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        using (var stream = response.GetResponseStream())
        {
            StreamReader r = new StreamReader(stream);
            string resp = r.ReadToEnd();

            int indexSid = resp.IndexOf("SID=") + 4;
            int indexLsid = resp.IndexOf("LSID=");
            sid = resp.Substring(indexSid, indexLsid - 5);

            return sid;
        }
    }

А чтобы сгенерировать куки и получить токен:

    static Cookie getCookie(string sid)
    {
        Cookie cookie = new Cookie("SID", sid, "/", ".google.com");
        return cookie;
    }

    static string getToken(string sid, Cookie cookie)
    {
        string token;
        string url = "http://www.google.com/reader/api/0/token";

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.CookieContainer = new CookieContainer();
        req.CookieContainer.Add(cookie);

        HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        using (var stream = response.GetResponseStream())
        {
            StreamReader r = new StreamReader(stream);
            token = r.ReadToEnd();
            return token;
        }
    }

Теперь, если я попытаюсь выполнить POST (в этом примере вставить новый тег), используя следующее, я получу ошибку 401.

    static void insertTag(string tag, Cookie cookie)
    {
        string result = "";
        string data = Uri.EscapeDataString("a="+tag+"&T=" + Program.token);

        byte[] buffer = Encoding.GetEncoding(1252).GetBytes(data);
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create
            ("http://www.google.com/reader/api/0/edit-tag?client=-");
        WebReq.Method = "POST";

        WebReq.Credentials = new NetworkCredential("username", "password");


        WebReq.ContentType = "application/x-www-form-urlencoded";
        WebReq.ContentLength = buffer.Length;

        Stream PostData = WebReq.GetRequestStream();

        PostData.Write(buffer, 0, buffer.Length);
        PostData.Close();

        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
        Stream Answer = WebResp.GetResponseStream();
        StreamReader _Answer = new StreamReader(Answer);
        result = _Answer.ReadToEnd();

        if (result.Length < 0)
            result = "";
    }

Ошибка возникает в строке Stream Answer = WebResp.GetResponseStream();


person Martin Doms    schedule 14.08.2009    source источник


Ответы (2)


Вам нужно дважды проверить, что у вас установлен пользовательский агент. Я сталкивался с этой же проблемой раньше, когда я не установил ее.

Например:

WebClient client = new WebClient();

client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

Или: ссылка MSDN

myHttpWebRequest=(HttpWebRequest)WebRequest.Create("http://www.contoso.com");
myHttpWebRequest.UserAgent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
person YetAnotherDeveloper    schedule 14.08.2009

Оказывается, я использовал неправильный URL-адрес для доступа к API Google Reader из-за устаревшей документации! Правильный URL-адрес для добавления меток в Google Reader (по состоянию на август 2009 г.): http://www.google.com/reader/api/0/subscription/edit?client=scroll с аргументами POST a=user/-/label/[ваш ярлык]&s=feed/[feed URL]&ac=edit&T=[токен]

person Martin Doms    schedule 15.08.2009
comment
случайно, вы не знаете URL-адрес, необходимый для подписки с использованием новых изменений, пожалуйста? потому что я все еще получаю ошибку 401, и я предполагаю, что это связано с URL-адресом - person ict1991; 29.12.2011