PHP + Twitter API : 資格情報の確認と アプリケーションに割り当てられた My Access Token

  目的



2010/05/29

1) JSON の結果を見やすくしました
2) HTTP のやりとりが解るように、debug.txt と ret_header.txt を出力するようにしました


これ自体、認証データが正しく使えるものかどうかチェックするのに使えますが、他の API のテストをする前に
これを単独でテストしておけば、問題をできる限り回避できると思います。

そもそも、認証プロセスを最初からテストしようとすると煩雑なので、
アプリケーションに最初から割り当てられている Access Token を利用します

このトークンは、使用すると自分のアカウントに登録されますが、解除するとアクセス
トークンはリセットされるので注意して下さい。


Twitter の画面の一番下
▼現在

▼以前の場合
Twitter_mytoken1


ログインしている状態でページ上部
Twitter_mytoken2


自分のアプリケーションを選択
Twitter_mytoken3


右サイドバーに My Access Token
Twitter_mytoken4


登録済アクセストークン
Twitter_mytoken5



  verify_credentials.php



Twitter のOAuth のライブラリはいくつか見ましたが、どれもクラス化されている為に、本来の仕様と照らしあわせるのが困難でした。内容としては非常に単純な手順であるのにも関わらず、ソースコードを追っていくのは結構面倒でした。

url_rfc3986 の内部関数にしても、今後結構重要なので裏付けも取りました。しっかりと仕様を原文で押さえてはいませんが、既存のコードやインターネット上の情報を総合するとPHP 5.3.x 以降では rawurlencode で問題無いものと思われます。

チルダの変換は実際両方で実行して比較しましたし、また、スペースが %20 になるのは元々で、既存のコードによっては、+ を %20 に変換していたものもありましたが、rawurlencodeでは無く、urlencode や http_build_query の場合に必要になるはずです。

この API を使うに当たって一番重要なのは、左辺と右辺は全て rfc3986 の パーセントエンコーディングが必要であるという事ですが、結果的に本来の状態に対して適用するものなので、QueryString や POST の本文内は2重にパーセントエンコーディングされる事になります。( この verify_credentials ではそのような対象文字列はありません )

001.<?
002.// **********************************************************
003.// 資格情報の確認 ( verify_credentials )
004.// **********************************************************
005.header( "Content-Type: text/html; Charset=utf-8" );
006.header( "pragma: no-cache" );
007.header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
008.header( "Cache-control: no-cache" );
009. 
010.// **********************************************************
011.// OAuth 用の urlencode 関数
012.// **********************************************************
013.function url_rfc3986( $str ) {
014.    // php 5.3.x ~ ではこの変換は必要無く、rawurlencode で OK
015.    return str_replace('%7E', '~', rawurlencode($str));
016.}
017. 
018.// **********************************************************
019.// API
020.// **********************************************************
021.$twitter_url = 'https://api.twitter.com/1/account/verify_credentials.json';
022. 
023.// **********************************************************
024.// 認証データ
025.// **********************************************************
026.$oauth_consumer_key = "Consumer key";
027.$oauth_consumer_secret = "Consumer secret";
028.$oauth_token = "Access Token";
029.$oauth_secret = "Access Token Secret";
030. 
031.// 毎回変化するランダムな文字列
032.$mt = microtime();
033.$rand = mt_rand();
034.$oauth_nonce = md5($mt . $rand);
035. 
036.$oauth_signature_method = "HMAC-SHA1";
037.$oauth_timestamp = mktime();
038.$oauth_version = "1.0";
039. 
040.// *********************************************************
041.// シグネチャ用ベース文字列作成
042./*
043.  httpMethod + "&" +
044.  url_encode(  base_uri ) + "&" +
045.  sorted_query_params.each  { | k, v |
046.      url_encode ( k ) + "%3D" +
047.      url_encode ( v )
048.  }.join("%26")
049.*/
050.// *********************************************************
051.$base_string = "GET";
052.$base_string .= "&" . url_rfc3986($twitter_url);
053.$base_string .= "&";
054. 
055.$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
056.$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
057.$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
058.$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
059.$base_string .= url_rfc3986("oauth_token")."%3D".url_rfc3986($oauth_token)."%26";
060.$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);
061. 
062.// *********************************************************
063.// シグネチャ作成
064./*
065.url_encode( consumer_secret ) + "&" +
066.url_encode( oauth_token_secret || nil )
067.*/
068.// *********************************************************
069.$oauth_signature =
070.base64_encode( hash_hmac(
071.    "sha1",
072.    $base_string,
073.    url_rfc3986($oauth_consumer_secret) . "&" . url_rfc3986($oauth_secret),
074.    true
075.));
076. 
077.// *********************************************************
078.// curl 処理
079.// *********************************************************
080.$curl = curl_init();
081.curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
082.curl_setopt($curl, CURLOPT_HEADER, false);
083.curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
084.curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
085.curl_setopt($curl, CURLOPT_URL, $twitter_url);
086. 
087.// *********************************************************
088.// http ヘッダ作成
089.// *********************************************************
090.$header = array();
091.$header[] = 'Expect:';
092.$header[] = 'Authorization: OAuth '.
093.url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
094.url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
095.url_rfc3986("oauth_token")."=\"".url_rfc3986($oauth_token)."\",".
096.url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
097.url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
098.url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\",".
099.url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\"";
100. 
101.curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
102. 
103.// *********************************************************
104.// https 用
105.// *********************************************************
106.curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
107.curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
108. 
109.// *********************************************************
110.// 送信
111.// *********************************************************
112.curl_setopt($curl, CURLOPT_VERBOSE, true);  // デバッグ
113.$handle = fopen("./debug.txt", "w");
114.curl_setopt($curl, CURLOPT_STDERR, $handle);
115.$handle2 = fopen("./ret_header.txt", "w");
116.curl_setopt($curl, CURLOPT_WRITEHEADER, $handle2);
117.$result = curl_exec($curl);
118. 
119. 
120.// *********************************************************
121.// 結果
122.// *********************************************************
123.print "<br>";
124. 
125.if($result === false) {
126.    $json = 'Curl error: ' . curl_error($curl);
127.}
128.else {
129.    echo 'Operation completed without any errors';
130.    $json = json_decode($result);
131.}
132.curl_close($curl);
133.fclose($handle2);
134.fclose($handle);
135. 
136.//print "<pre>";
137.//var_dump($json);
138.//print "</pre>";
139. 
140.print "<pre>";
141.print_r($json);
142.print "</pre>";
143. 
144. 
145.?>













   SQLの窓    create:2010/05/18  update:2018/02/18   管理者用(要ログイン)





フリーフォントWEBサービス

SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ