SQLの窓

2011年06月12日


PHP : Twitter への投稿 : バージョン2

PHP : Twitter への投稿 : バージョン1 では、自分専用のアプリケーションとしてテストしていたので、トークンは直接 Twitter アカウント内から取りだして、「クライアント型」で実行していましたが、本来 Twitter アプリケートションは自分以外の人が使う為に、その人用のトークンを動的に取得するようになっています。

その為のパッケージです。


まず、アプリケーションの設定で「ブラウザ型」に変更します。その際、コールバックする為の http:// から始まる通常の URL を書く必要がありますが、実在している必要はありません。プログラムで変更して指定するので自分のサイトの好きなところでもかまいません

サンプルのプロセスは、3つになりますが、実際は二つです。この場合は途中の値を見る為に、コールバック以降を二つにしています。また、一旦取得したトークンを以降もWEB上で継続して使えるようにするために localStorage に保存しています。ここでは作成していませんが、ログアウトする処理も必要です。

トークンを PC に保存するので、盗まれる可能性はありますが、その場合は正式アカウントから、ユーザーがそのアプリケーションを削除すればそのトークンは無効になります。それでも心配な場合は、毎回 Twitter で認証させる必要があります。
<?php
session_start();
$_SESSION['oauth_token_secret'] = '';
// **********************************************************
// Twitter への投稿 : バージョン2
// **********************************************************
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 urle( $str ) {
	// php 5.3.x 〜 ではこの変換は必要無い
	return str_replace('%7E', '~', rawurlencode($str));
}

// **********************************************************
// 投稿 API
// **********************************************************
//$twitter_url = 'http://api.twitter.com/1/statuses/update.json';
// **********************************************************
// トークン要求 API ( SSL is recommended )
// **********************************************************
$twitter_url = 'https://api.twitter.com/oauth/request_token';

// **********************************************************
// 認証データ
// **********************************************************
$oauth_consumer_key = "アプリケーションページより取得";
$oauth_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
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$oauth_callback = "http://localhost{$path_parts['dirname']}/callback_test.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 .= "&" . urle($twitter_url);
$base_string .= "&";

// 投稿用
//$base_string .= urle("oauth_consumer_key")."%3D".urle($oauth_consumer_key)."%26";
//$base_string .= urle("oauth_nonce")."%3D".urle($oauth_nonce)."%26";
//$base_string .= urle("oauth_signature_method")."%3D".urle($oauth_signature_method)."%26";
//$base_string .= urle("oauth_timestamp")."%3D".urle($oauth_timestamp)."%26";
//$base_string .= urle("oauth_token")."%3D".urle($oauth_token)."%26";
//$base_string .= urle("oauth_version")."%3D".urle($oauth_version);

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

// **********************************************************
// 投稿データ
// **********************************************************
// POST データは2度 urlencode する
//$text = "Twitter への投稿 : バージョン1 : nonce=" . $oauth_nonce;
//$text .= " : timestamp=" . $oauth_timestamp;
//$base_string .= "%26status" . "%3D" . urle(urle($text));

// *********************************************************
// シグネチャ作成
/*
url_encode( consumer_secret ) + "&" +
url_encode( oauth_token_secret || nil )
*/
// *********************************************************
$oauth_signature = 
base64_encode( hash_hmac(
	"sha1",
	$base_string,
	$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);

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

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

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

// *********************************************************
// https 用 ( https://api.twitter.co 利用時に必要 )
// *********************************************************
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);

// *********************************************************
// 戻された http ヘッダの出力
// *********************************************************
$handle = fopen("./header1.txt", "w");
curl_setopt($curl, CURLOPT_WRITEHEADER, $handle);

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


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

if($result === false) {
	print '送信処理にエラーが発生しました: ' . curl_error($curl);
}
else {
	print '送信処理は正常に終了しました';
}
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://twitter.com/oauth/authorize?oauth_token=<?= $arr['oauth_token'] ?>"
>Twitterで許可する為のページ</a>

このコードは、Twitter で認証させる為のリンクを用意するページです。まだ一時的なリクエスト用のトークンしか取得できていません。'oauth_token_secret' は、コールバック先で使用する為に、セッションで引き渡しています。

コールバックするページはテストの為に localhost を使用していますが、通常は自分のサイト上( 他のユーザがアクセスできる場所 ) を指定します


Twitter で投稿する為のトークンを取得するコールバック後のデータ表示
Twitter で投稿する為のトークンを取得するコールバック後の Twitter アクセス



posted by lightbox at 2011-06-12 12:53 | PHP + Twitter | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり