PHP : Twitter API 認証 : Access Token を取得する


  Twitterアプリケーション を登録して、Access Token を取得する手順




まず、Consumer key と Consumer secret を取得します。

この二つを使って順序良く取り出すだけです。リクエストは GET でも POST でも可能なようですが、
ドキュメントのサンプルが POST なのでそちらで実行しています。https が推奨との事で、その URL
を使用して、リクエストは ヘッダーと POST データとどちらでも動作しましたが、ヘッダーのほうが
よさそうなのでそちらを使っています。

以下の画像は、Acquiring.php を呼び出して最初に表示される画像で、最初のトークンをリクエストしています
( このトークンは呼び出す毎に変化する一時的なものです )

関連する記事

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


Twitter_api1

Acquiring.php
<?
session_start();
// **********************************************************
// Acquiring a request token
// **********************************************************
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// **********************************************************
// AOuth 用の urlencode 関数
// **********************************************************
function url_rfc3986( $str ) {
	// php 5.3.x 〜 ではこの変換は必要無い
	return str_replace('%7E', '~', rawurlencode($str));
}

// **********************************************************
// API ( SSL is recommended )
// **********************************************************
$twitter_url = 'https://api.twitter.com/oauth/request_token';

// **********************************************************
// 認証データ
// **********************************************************
$oauth_consumer_key = "Consumer key";
$oauth_consumer_secret = "Consumer secret";
$oauth_token = "";
$oauth_secret = "";

// 毎回変化するランダムな文字列
$mt = microtime();
$rand = mt_rand();
$oauth_nonce = md5($mt . $rand);

$oauth_signature_method = "HMAC-SHA1";
$oauth_timestamp = mktime();

$oauth_version = "1.0";

// コールバック url
$oauth_callback = "http://localhost/web/twitter_api/callback.php";

// *********************************************************
// シグネチャ用ベース文字列作成
/*
  httpMethod + "&" +
  url_encode(  base_uri ) + "&" +
  sorted_query_params.each  { | k, v |
      url_encode ( k ) + "%3D" +
      url_encode ( v )
  }.join("%26")
*/
// *********************************************************
$base_string = "POST";
$base_string .= "&" . url_rfc3986($twitter_url);
$base_string .= "&";

$base_string .= url_rfc3986("oauth_callback")."%3D".url_rfc3986(url_rfc3986($oauth_callback))."%26";
$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);

// *********************************************************
// シグネチャ作成
/*
url_encode( consumer_secret ) + "&" +
url_encode( oauth_token_secret || nil )
*/
// *********************************************************
$oauth_signature = 
base64_encode( hash_hmac(
	"sha1",
	$base_string,
	url_rfc3986($oauth_consumer_secret) . "&",
	true
));

// *********************************************************
// curl 処理
// *********************************************************
$curl = curl_init();
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $twitter_url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "");

// *********************************************************
// http ヘッダ作成
// *********************************************************
$header = array();
$header[] = 'Expect:';

$header[] = 'Authorization: OAuth '.
url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
url_rfc3986("oauth_callback")."=\"".url_rfc3986($oauth_callback)."\",".
url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\",".
url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\"";

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

// *********************************************************
// https 用
// *********************************************************
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);

// *********************************************************
// 送信
// *********************************************************
$result = curl_exec($curl);


// *********************************************************
// 結果
// *********************************************************
print "<br>";

if($result === false) {
	echo 'Curl error: ' . curl_error($curl);
}
else {
	echo 'Operation completed without any errors';
}
curl_close($curl);

print "<br>";

parse_str($result,$arr);
print "<pre>";
print_r( $arr );
print "</pre>";

$_SESSION['oauth_token_secret'] = $arr['oauth_token_secret'];

?>
<a href="https://api.twitter.com/oauth/authorize?oauth_token=<?= $arr['oauth_token'] ?>">Twitterで許可</a>










  "/oauth/authorize?oauth_token=最初に取得したトークン" へ移動




表示されたリンクをクリックすると、認証の為に Twitter へ移動します。
( これは、本来はリダイレクトで行います )

Twitter_api2

既にログイン済だと、ボタンだけになりますが、ログインしていない場合は、任意のユーザがログイン
を行って、そのアカウントにアクセスする為のトークンを取得する次の手順に移ります。

許可すると、前回のコードで指定してあった、コールバックの URL へ移動します。
( これは、ブラウザに対するリダイレクトなので、localhost でもかまいません )





  コールバック先の処理

最初は、アクセスするトークンを取得する為の手順中のチェック作業です。
oauth_verifier という確認の為のコードが GET メソッドで送られてくるので、
それをいったん入力フィールドに表示しています。

最初から引き継いでいる一時的な oauth_token と、チェック用の oauth_verifier と、
最初のトークン取得時にセッションに保存しておいた、シークレットトークンの3つを使って、
永続的なアクセストークンの要求を行います

コールバックをテストの為に最初の URL と別にしていますが、
本来は同じにしておいて、再度呼ばれた時はすぐにリクエストトークンを取りに行って
最終的に Twitter に対して行いたい処理を行います。

セッション中は、永続的なアクセストークンを保存しておけば、認証の必要もありませんし、
クッキーや外部ファイルやデータベースに保存すると、ユーザが Twitter でアプリケーション
の利用を解除するまでずっとアカウントの委譲が継続する事になります


Twitter_api3

Twitter_api4


callback.php
<?
session_start();
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
// **********************************************************
// AOuth 用の urlencode 関数
// **********************************************************
function url_rfc3986( $str ) {
	// php 5.3.x 〜 ではこの変換は必要無い
	return str_replace('%7E', '~', rawurlencode($str));
}

print "<pre>";
print_r( $_GET );
print_r( $_SESSION );
print "</pre>";

if ( $_SERVER['REQUEST_METHOD'] != 'POST' ) {
// 以下初期画面
?>

<form method="POST">
<input type="submit" value="送信"><br>

oauth_token : 
<input
	type="text"
	name="oauth_token"
	value="<?= $_GET['oauth_token'] ?>"
	size="80"
><br>
oauth_verifier : 

<input
	type="text"
	name="oauth_verifier"
	value="<?= $_GET['oauth_verifier'] ?>"
	size="80"
><br>

oauth_token_secret : 
<input
	type="text"
	name="oauth_token_secret"
	value="<?= $_SESSION['oauth_token_secret'] ?>"
	size="80"
><br>

</form>

<?
	exit();
}

//***********************************************************
// Exchanging a request token for an access token
//***********************************************************

// **********************************************************
// API ( SSL is recommended )
// **********************************************************
$twitter_url = 'https://api.twitter.com/oauth/access_token';

// **********************************************************
// 認証データ
// **********************************************************
$oauth_consumer_key = "Consumer key";
$oauth_consumer_secret = "Consumer secret";
$oauth_token = $_POST['oauth_token'];
$oauth_secret = $_POST['oauth_token_secret'];

// 毎回変化するランダムな文字列
$mt = microtime();
$rand = mt_rand();
$oauth_nonce = md5($mt . $rand);

$oauth_signature_method = "HMAC-SHA1";
$oauth_timestamp = mktime();

$oauth_version = "1.0";

// *********************************************************
// シグネチャ用ベース文字列作成
/*
  httpMethod + "&" +
  url_encode(  base_uri ) + "&" +
  sorted_query_params.each  { | k, v |
      url_encode ( k ) + "%3D" +
      url_encode ( v )
  }.join("%26")
*/
// *********************************************************
$base_string = "POST";
$base_string .= "&" . url_rfc3986($twitter_url);
$base_string .= "&";

$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
$base_string .= url_rfc3986("oauth_token")."%3D".url_rfc3986($oauth_token)."%26";
$base_string .= url_rfc3986("oauth_verifier")."%3D".url_rfc3986($_POST['oauth_verifier']);
$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version);

// *********************************************************
// シグネチャ作成
/*
url_encode( consumer_secret ) + "&" +
url_encode( oauth_token_secret || nil )
*/
// *********************************************************
$oauth_signature = 
base64_encode( hash_hmac(
	"sha1",
	$base_string,
	url_rfc3986($oauth_consumer_secret) . "&" . url_rfc3986($oauth_secret),
	true
));

// *********************************************************
// curl 処理
// *********************************************************
$curl = curl_init();
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $twitter_url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "");

// *********************************************************
// http ヘッダ作成
// *********************************************************
$header = array();
$header[] = 'Expect:';
$header[] = 'Authorization: OAuth '.
url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
url_rfc3986("oauth_token")."=\"".url_rfc3986($oauth_token)."\",".
url_rfc3986("oauth_verifier")."=\"".url_rfc3986($_POST['oauth_verifier'])."\",".
url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\",".
url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\"";

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

// *********************************************************
// https 用
// *********************************************************
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);

// *********************************************************
// 送信
// *********************************************************
$result = curl_exec($curl);

// *********************************************************
// 結果
// *********************************************************
print "<br>";

if($result === false) {
	echo 'Curl error: ' . curl_error($curl);
}
else {
	echo 'Operation completed without any errors';
}
curl_close($curl);

print "<br>";

parse_str($result,$arr);
print "<pre>";
print_r( $arr );
print "</pre>";

?>


関連する記事





yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[sh_web]
CCBot/2.0 (http://commoncrawl.org/faq/)
17/08/21 22:43:59
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube