3

数日間、高低を問わず検索しましたが、Twitter API への POST を正しく動作させることができませんでした。リクエスト トークンを正常に取得してアクセス トークンと交換することはできますが、statuses/update への POST を実行すると、401 エラーが発生します。

ヘッダーの Authorization 部分が、Twitter OAuth Tool を使用したときに受け取るものと完全に一致することを確認しました。

私の問題は、Web リクエストの本文にステータスを追加する方法にあると思います。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。

4

1 に答える 1

1

だから私の問題は、署名鍵を作成するときの秘密鍵でした。Twitter のアプリケーションから秘密鍵をハードコーディングしました。これが、ヘッダーが常に一致する理由ですが、リンクされたユーザー アカウントを使用してテストを実行すると、要求が通過しませんでした。この話の教訓は、秘密鍵をハードコーディングしないことです。秘密鍵は何のためにあるのだろうとずっと思っていました。今私は知っている。

また、使用する URL はベース URL のみです: https://api.twitter.com/1/statuses/update.json。URL パラメータを追加する必要はありません。最後に、http リクエスト ボディを作成するときは、単純に「status=UrlEncode(tweetToBeMade)」です。

于 2012-08-09T03:40:34.593 に答える