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>";

?>


関連する記事














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





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

SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ