5

特定の条件で Twitter のステータスを更新するための非常に単純なアプリケーションを作成しました。Twitter のドキュメントを使用して、OAuth 署名を作成するための要件と、Authorization ヘッダーを構造化する方法を理解しました。次に、PHP で cURL を使用してリクエストを送信します。

Twitter 開発サイトの OAuth ツールを使用して、署名のベース文字列と認証ヘッダーの両方を比較しましたが、どちらもまったく同じです。

署名ベース文字列

POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&oauth_consumer_key%3DYNxxxxxxxxxxxWnfI6HA%26oauth_nonce%3D31077a3c7b7bee4e4c7e2b5185041c12%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1340729904%26oauth_token%3D2991771-4csoiO2fxmWgSxxxxxxxxxxDjWj2AbyxATtiuadNE%26oauth_version%3D1.0%26status%3Dblah%2520test%2520blah.

承認ヘッダー

Authorization: OAuth oauth_consumer_key="YN4FLBxxxxxxxxxxI6HA", oauth_nonce="31077a3c7b7bee4e4c7e2b5185041c12", oauth_signature="M2cXepcxxxxxxxxxxAImeAjE%2FHc%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1340729904", oauth_token="2991771-4cxxxxxxxxxxSmRvjzMoooMDjWj2AbyxATtiuadNE", oauth_version="1.0"

明らかに、データを非表示にするために一部の文字を に置き換えましxたが、2 つの文字を文字ごとに比較すると、まったく同じ結果が得られます。参考までに、OAuth ツールが生成するタイムスタンプと nonce をハードコーディングして、チェックのために値が同じになるようにします。アクセス レベルは読み取りと書き込みに設定されています。同じページに最後の例があります。コマンド ラインで cURL を使用して実行するコマンドです。このコマンドを実行すると、完全に機能し、Twitter フィードに問題なく投稿されます。

それを念頭に置いて、これまでに作成したものはすべて問題ないと信じており、前述の詳細を生成するコードを投稿する意味はあまりないと思います. ただし、cURLを使用して呼び出しを行うために使用するコードが原因だと思いますが、理由はわかりません。

<?php
// ...
$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $baseUrl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: $header"));
curl_setopt($curl, CURLOPT_POSTFIELDS, array('status' => $status));
$result = json_decode(curl_exec($curl));
curl_close($curl);

var_dump($result);

とは、署名ベース文字列と認証ヘッダーの生成に使用される変数と同じであり、うまく一致していること$baseUrlに注意してください。$header$status

実行時のページの出力は次のとおりです。

object(stdClass)#1 (2) { ["error"]=> string(34) "Could not authenticate with OAuth." ["request"]=> string(23) "/1/statuses/update.json" }

誰かが私を正しい方向に向けるのに十分な詳細がここにあることを願っています!

4

2 に答える 2

3

apache_request_headers()私のデータは問題なく、問題が発生したのはcURLであるという概念をさらに検索、テストし、それに固執した後、cURLがContent-typeリクエストのを設定し、multipart/form-data;境界情報を追加していることに気付きました。明らかに長いContent-Lengthフィールドもあります。これは、ステータスが正しく送信されなかったことを意味します。不正な形式のmultipart/form-data;リクエストが原因だと思います。

解決策は、それを文字列として送信することでした。たとえば、これは機能します。

curl_setopt($curl, CURLOPT_POSTFIELDS, 'status='. rawurlencode($status));

しかし、もっと良い方法があることがわかりました(特に、配列を使用したい場合は、複数の値を使用します)。

$postfields = array('status' => $status);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postfields));

これは私見の方がはるかに見栄えがします。

于 2012-06-27T18:53:05.137 に答える
1

あなたのノンスだと思います。ドキュメントから:「oauth_nonceパラメーターは、アプリケーションが一意のリクエストごとに生成する必要がある一意のトークンです」(強調鉱山)。

警告: 私は OAuth 1 + PHP よりも OAuth 2 + Java または JavaScript に精通しています。

それ以外の場合 (またはそれだけではない場合)、実際の HTTP 要求 (たとえば、WireShark を使用) を、そのページに記載されているサンプル要求と比較できます。「ヘッダー文字列の構築」に関するメモも役立つ場合があります。

于 2012-06-26T20:03:27.313 に答える