【问题标题】:Twitter API: 401 on POST, GET works fineTwitter API:POST 401,GET 工作正常
【发布时间】:2012-08-02 10:13:10
【问题描述】:

我已经搜索了几天,无论高低,都无法将 POST 发送到 twitter API 以正常工作。我能够成功获取请求令牌并将其交换为访问令牌,但是当我对状态/更新执行 POST 时,我收到 401 错误。

我已验证标头的授权部分与我在使用 Twitter OAuth 工具时收到的内容完全匹配。

我相信我的问题是我将状态添加到网络请求正文的方式。 url 必须是https://api.twitter.com/1/statuses/update.json,还是应该是https://api.twitter.com/1/statuses/update.json?status=MyTweetHere

我的代码如下:

        public string UpdateStatus(string requestMethod, string baseUrl, string consumerKey, string consumerSecret, string accessToken, OAuthRequestType requestType, string status)
    {
        //baseUrl = https://api.twitter.com/1/statuses/update.json
        const string signatureMethod = "HMAC-SHA1";
        const string oauthVersion = "1.0";

        var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1));
        var timestamp =  (int)timeSpan.TotalSeconds;

        var nonce = CreateNOnce(timestamp, consumerKey, baseUrl, accessToken);
        var signature = CreateSignature(requestMethod, baseUrl, consumerKey, consumerSecret, nonce, signatureMethod, timestamp, accessToken, oauthVersion, string.Empty, string.Empty, requestType, status);

        var bodyData = "status=" + UrlEncode(status);

        var webRequest = (HttpWebRequest)WebRequest.Create(baseUrl);
        webRequest.KeepAlive = true;
        webRequest.ServicePoint.Expect100Continue = false;
        webRequest.Method = requestMethod; //Send in as POST
        webRequest.Accept = "*/*";
        webRequest.UserAgent = "Renicorp.Social";

        webRequest.Headers["Authorization"] = "OAuth " + UrlEncode("oauth_consumer_key") + "=\"" + UrlEncode(consumerKey) + "\", " +
                                                         UrlEncode("oauth_nonce") + "=\"" + UrlEncode(nonce) + "\", " +
                                                         UrlEncode("oauth_signature") + "=\"" + UrlEncode(signature) + "\", " +
                                                         UrlEncode("oauth_signature_method") + "=\"" + UrlEncode(signatureMethod) + "\", " +
                                                         UrlEncode("oauth_timestamp") + "=\"" + UrlEncode(timestamp.ToString()) + "\", " +
                                                         UrlEncode("oauth_token") + "=\"" + UrlEncode(accessToken) + "\", " +
                                                         UrlEncode("oauth_version") + "=\"" + UrlEncode(oauthVersion) + "\"";

        string postData = bodyData;
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);

        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.ContentLength = byteArray.Length;

        using (Stream dataStream = webRequest.GetRequestStream())
        {
            dataStream.Write(byteArray, 0, byteArray.Length);
        }

        //Make the web call and return the response
        WebResponse response = webRequest.GetResponse();
        var responseBody = string.Empty;
        Stream stream = response.GetResponseStream();
        if (stream != null) responseBody = new StreamReader(stream).ReadToEnd();
        return responseBody;
    }

更新: 我现在已经编写了一个方法来为 account/verify_credentials.json 执行 GET,并且如果我使用我的应用程序帐户密钥,我能够验证帐户凭据,但是当我尝试使用单独的帐户并提供访问令牌时,我得到 401。

【问题讨论】:

  • 您是否尝试在写入流之前设置标头?
  • 好的,我修改了代码,在添加headers之后将数据添加到web请求的body中。我仍然收到 401。

标签: c# httpwebrequest twitter twitter-oauth http-status-code-401


【解决方案1】:

所以我的问题是创建签名密钥时的密钥。我已经在 twitter 中从我的应用程序中硬编码了我的密钥。这就是为什么我的标头总是匹配的原因,但是当我使用链接的用户帐户运行测试时,请求不会通过。故事的寓意是不要硬编码密钥。我一直在想密钥是干什么用的。现在我明白了。

此外,要使用的 url 只是基本 url:https://api.twitter.com/1/statuses/update.json。无需添加 url 参数。最后,在创建 http 请求正文时,它只是“status=UrlEncode(tweetToBeMade)”。

【讨论】:

  • 干得好!很高兴你解决了。这一个是一个艰难的!我正在处理一项类似的任务,即通过签名请求连接到 API,但尚未成功连接。这是一个该死的痛苦,所以,幸好你成功了。我因绝望而一次又一次地撞在该死的墙上。 :D 但我最终会做对的。如果有人感兴趣,我还收到了一篇关于这个主题的有用帖子:gist.github.com/smockle/5537203。 Twitter API 规范很长,有些人会说不错,但我相信有些部分可能会更好。我有时会迷失在其中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多