4

Twitter api 1.1 に変更したところ、ツイートが機能せず、「リモート サーバーがエラーを返しました: (400) 不正な要求」というエラーが返されます。これについて SO を調査すると、認証に関係があることが示唆されますが、ログイン ページから取得した accessToken とシークレットを送信しています。api 1.0 では問題なく動作しました。コードは -

    public void Tweet(Action<string> response, string message)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("POST&");
        sb.Append(Uri.EscapeDataString(_postUrl));
        sb.Append("&");

        string oauthNonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
        string timeStamp = MakeTimestamp();

        var dict = new SortedDictionary<string, string>
        {
            { "oauth_consumer_key", _oAuthConfig.ConsumerKey },
            { "oauth_nonce", oauthNonce },
            { "oauth_signature_method", "HMAC-SHA1" },
            { "oauth_timestamp", timeStamp },
            { "oauth_token", _accessToken },
            { "oauth_version", "1.0" },
        };

        foreach (var keyValuePair in dict)
        {
            sb.Append(Uri.EscapeDataString(string.Format("{0}={1}&", keyValuePair.Key, keyValuePair.Value)));
        }

        string encodedMessage = EscapeAdditionalChars(Uri.EscapeDataString(message));
        sb.Append(Uri.EscapeDataString("status=" + encodedMessage));

        string signatureBaseString = sb.ToString();


        // create the signature

        string signatureKey = Uri.EscapeDataString(_oAuthConfig.ConsumerSecret) + "&" + Uri.EscapeDataString(_accessTokenSecret);

        var hmacsha1 = new HMACSHA1(new ASCIIEncoding().GetBytes(signatureKey));

        string signatureString = Convert.ToBase64String(hmacsha1.ComputeHash(new ASCIIEncoding().GetBytes(signatureBaseString)));


        // create the headers

        string authorizationHeaderParams = String.Empty;

        authorizationHeaderParams += "OAuth ";
        authorizationHeaderParams += "oauth_consumer_key=\"" + _oAuthConfig.ConsumerKey + "\", ";
        authorizationHeaderParams += "oauth_nonce=\"" + oauthNonce + "\", ";
        authorizationHeaderParams += "oauth_signature=\"" + Uri.EscapeDataString(signatureString) + "\", ";
        authorizationHeaderParams += "oauth_signature_method=\"" + "HMAC-SHA1" + "\", ";
        authorizationHeaderParams += "oauth_timestamp=\"" + timeStamp + "\", ";
        authorizationHeaderParams += "oauth_token=\"" + _accessToken + "\", ";
        authorizationHeaderParams += "oauth_version=\"" + "1.0" + "\"";

        string messageToPost = EscapeAdditionalChars(SpacesToPlusSigns(message));


        // initialise the WebClient

        WebClient client = new WebClient();

        client.Headers [HttpRequestHeader.Authorization] = authorizationHeaderParams;

        client.UploadDataCompleted += (s, eArgs) =>
        {
            if (eArgs.Error == null)
                response(DefaultSuccessMessage());
            else
                response(eArgs.Error.Message);
        };

        try
        {
            Uri uri = new Uri(_postUrl);
            try
            {
                client.UploadDataAsync(uri, "POST", Encoding.UTF8.GetBytes("status=" + messageToPost));
            }
            catch (WebException e)
            {
                Log.Info("TwitterService->Tweet web error: " + e.Message);
                response(DefaultErrorMessage());
            }
            catch (Exception e)
            {
                // Can happen if we had already favorited this status
                Log.Info("TwitterService->Tweet error: " + e.Message);
                response(DefaultErrorMessage());
            }
        }
        catch (WebException e)
        {
            Log.Info("TwitterService->Tweet web error 2: " + e.Message);
            response(DefaultErrorMessage());
        }
        catch (Exception e)
        {
            Log.Info("TwitterService->Tweet error 2: " + e.Message);
            response(DefaultErrorMessage());
        }
    }

基本的には、Twitterizer などのサードパーティ製ライブラリを使用せずにツイートできるようにしたいと考えています (TweetStation でさえ api 1.1 で壊れているようです) - 確かにそれほど難しいことではありません!

現時点ではレンガの壁のように感じるので、どんな助けも大歓迎です-私はc#にもかなり慣れていませんが、役に立ちません...

以前は明確ではなかったコードを表示するように編集されました。

4

4 に答える 4

3

私はまったく同じ問題を抱えていました:

これはまさにここで行う必要があることです。

Twitter API 1.1 oAuth を使用してユーザーのタイムラインを認証および要求する

このためのプロジェクトを作成しました: https ://github.com/andyhutch77/oAuthTwitterTimeline

また、MVC、Web アプリ、およびコンソールのデモも含まれています。

于 2013-07-02T12:46:04.537 に答える
0

最近、私が構築しているアプリで、この問題、または少なくとも 1 つの驚くべき類似の問題 (初心者の観点から) に遭遇しました。(dev.twitter.comでツールを見た後)私にとってそれを解決したように見えたのは、単にパラメーター名の周りの引用符を取り除くことだったので、(あなたの場合):

実際、パラメーター名を引用符で囲んでいないことに気付きました。ただし、認証の詳細を2回送信すると混乱します(したがって、私の間違った投稿です)。これを行わなくても機能します。 27120、これは認証エラーを生成する問題である可能性があることを確認しています。

于 2013-07-01T20:40:33.693 に答える