特定の条件で 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" }
誰かが私を正しい方向に向けるのに十分な詳細がここにあることを願っています!