2009-08-14 76 views
1

我正在尝试使用来自this page的信息与Google阅读器(无证/非官方)API进行交互。我的第一步是获得一个SID和令牌,这工作正常,但我似乎无法发布任何内容而不会发生401错误。为什么在发布到Google Reader API时收到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; 
     } 
    } 

,并生成一个cookie,并获得令牌:

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();

回答

1

原来我使用了错误的URL的谷歌阅读器的API感谢访问一些过时的文档!在谷歌阅读器添加标签(如2009年8月)正确的URL是 http://www.google.com/reader/api/0/subscription/edit?client=scroll 与POST参数 A =用户/ - /标签/ [您的标签] & S =养活/ [提要URL] & AC =编辑&ŧ = [代币]

+0

无论如何,你知道使用新变更订阅所需的网址吗?因为我仍然得到401错误,我猜它与网址有关 – ict1991 2011-12-29 12:21:13

1

你需要仔细检查你有一个用户代理设置。在我没有设置之前,我遇到了同样的问题。

例如:

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 Link

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;)"; 
相关问题