6

Twitter OAuth を使用しようとしていますが、POSTリクエストが401( Invalid OAuth Request) エラーで失敗します。

たとえば、新しいステータスの更新を投稿したい場合は、次のパラメーターを使用して HTTPPOST要求をに送信https://twitter.com/statuses/update.jsonしています -

status=Testing&oauth_version=1.0&oauth_token=xxx&
oauth_nonce=xxx&oauth_timestamp=xxx&oauth_signature=xxx&
oauth_consumer_key=xxx&in_reply_to=xxx&oauth_signature_method=HMAC-SHA1`

私のGETリクエストはすべて正常に機能しています。メーリング リストを見ると、多くの人が同じ問題を抱えていましたが、どこにも解決策が見つかりませんでした。

oauth.pyPython ライブラリを使用しています。

4

6 に答える 6

4

Javaを使用してゼロからtwitter OAuth APIの実装を完了しました。リクエストの取得と投稿は正常に機能します。このページhttp://www.hueniverse.com/hueniverse/2008/10/beginners-gui-1.htmlを使用して、署名と HTTP ヘッダーを確認できます。キーとトークンを入力して、出力を確認するだけです。Twitter は、この投稿で説明されているとおりに機能しているようです。スペースと UTF-8 記号には注意してください。たとえば、Java はスペースを「+」としてエンコードしますが、OAuth には %20 が必要です

于 2009-04-17T05:14:54.307 に答える
3

私はJrgnsによる答えに二番目です。私はまったく同じ問題を抱えています。Twitter が提供する例を読むと、実際には明らかです。ただし、それらの疑似コードは誤解を招くものです。Pythonでは、これは私のために働いた:

def encodekeyval(key, val):
    key = urllib.quote(key, '')
    val = urllib.quote(val, '')
    return urllib.quote(key + '=' + val, '')

def signature_base_string(urlstr, oauthdata):
    sigstr = 'POST&' + urllib.quote(urlstr,'') + '&'
    # retrieve "post" data as dictionary of name value pairs
    pdata = oauthdata.getpdata()
    # need to sort parameters
    pstr = '%26'.join([encodekeyval(key, pdata[key]) for key in sorted(pdata.keys())])
    return sigstr + pstr
于 2011-01-02T22:21:17.727 に答える
3

アプリのアクセス タイプが読み取りと書き込みであることを確認してください。アプリの設定ページ (例: http://twitter.com/apps/edit/12345 ) には、次のようなラジオ ボタン フィールドがあります。

デフォルトのアクセス タイプ: 読み取りと書き込み / 読み取り専用

「読み取り専用」にチェックを入れると、ステータス更新 API は 401 を返します。

于 2010-03-19T19:59:17.910 に答える
2

基本文字列に対してパラメーターを2回エンコードする必要があることに気付くまで、同じ問題がありました。GET リクエストはすべて正常に機能しましたが、POST、特にステータスの更新は失敗しました。status直感で、パラメーターにスペースを入れずに POST を試してみたところ、うまくいきました。

PHP の場合:

function encode($input) {
    return str_replace('+', ' ', str_replace('%7E', '~', rawurlencode($input)));
}

$query = array();
foreach($parameters as $name => $value) {
    $query[] = encode($name) . '=' .encode($value);
}
$base = encode(strtoupper($method)) . '&' .encode($norm_url) . '&' . 
encode(implode('&', $query));

encodeパラメーターの名前と値の周りの関数と、クエリ文字列全体の周りの関数に注目してください。スペースは%2520、 だけでなく、として終了する必要があり%20ます。

于 2010-01-29T22:21:26.247 に答える
0

私は解決策を見つけました、そしてそれは私のために働きます、あなたはリクエストヘッダーに次のパラメータを追加しなければなりません、そしてそれは次のように見えるはずです(c#コード)、使用しないでください&sign、代わりにコンマ(、)記号でパラメータを分けてください。最初に「OAuth」という単語を追加する必要があります。

httpWebRequest.Headers [System.Net.HttpRequestHeader.Authorization] = "OAuth oauth_consumer_key = \" hAnZFaPKxXnJqdfLhDikdw \ "、oauth_nonce = \" 4729687 \ "、oauth_signature_method = \" HMAC-SHA1 \ "、oauth_timestamp = \" 1284821989 \ = \ "17596307-KH9iUzqTxaoa5576VjILkERgUxcqExRyXkfb8AsXy \"、oauth_version = \ "1.0 \"、oauth_signature = \ "p8f5WTObefG1N9%2b8AlBji1pg18A%3d \" ";

'status'などの他のパラメータは、リクエストの本文に記述する必要があります。

于 2010-10-23T11:12:33.903 に答える
-8

ほとんどの場合、署名は無効です。署名(正規化されたパラメーター、URLエンコード、およびcosumerSecret&oauthScret。これについては後で詳しく説明します)の生成方法については、OAuth仕様に従う必要があります。

于 2009-04-15T19:34:02.263 に答える