SQLの窓

2013年09月16日


PHP : Twitter の APIを使った投稿ツール

※ こちらから利用できます


SkyDriveへ(ツール全てのソースコード)


Twitter のアカウントがあれば、アプリを登録して API キーを取得すれば、PHP 等の言語から独自の投稿アプリを作成する事ができます。

■ Twitter アプリの登録方法と、API キーの利用 

ただ、この記事の最後でソースコードで紹介する内容は自分自身のアクセストークンを使用して自分専用の投稿アプリを作成する事しかできません。本来は、Twitter に登録したアプリを使って不特定多数の他のユーザが投稿処理等の API を Twitter のサイト以外で実行できるようにする事が目的です。
Consumer key : Twitter アプリ固有
Consumer secret : Twitter アプリ固有
Access token : ユーザ固有
Access token secret : ユーザ固有
ユーザ固有のトークンは、ユーザ本人が処理しないと取得する事ができません。Twitter アプリ を登録した人が、アプリケーションを作って公開する事によって、他の人が利用してその人固有のアクセストークンを取得する事になります。 このアクセストークンを取得する際に、Twitter アプリ を承認する事になり、その際ユーザのアカウントにそのアプリが登録されます。ですから、アクセストークンを無効にしたければ、その登録されたアプリを削除すれば、仮にそのアクセストークンが外部に流出しても、アプリごと削除すればいいので安心です。 ( 通常、アクセストークンはどこかに保存されていますが、ユーザには解りません ) その手順として最初に行うのが、『アクセストークンのリクエスト』です(https://api.twitter.com/oauth/request_token) WEB 上に用意したツールから、『アクセストークンのリクエスト』を行えるようになっています。その場合必要なのは、Consumer key と Consumer secret だけですが、セッションに保存する必要があるので、最初の Twitter 投稿ページで 投稿データを未入力で投稿して下さい ▼ Consumer key と Consumer secretのみで未入力投稿した場合、こうなります そうすれば、『Twitter リクエスト』のページから一連の処理を実行する事ができます 実際に自分の Twitter アプリを使う場合の注意として、Callback フィールドには何らかの URL を入力しておく必要があります( 後から変更できます )。未入力にすると、WEB アプリ以外の処理でのフローに変更されてしまいます
<?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" );

$_SESSION['twitter_keys'] = $_POST['keys'];

$_POST['keys'] = str_replace("\r","",$_POST['keys']);
$_POST['keys'] = str_replace("\n","",$_POST['keys']);
$twitter_keys = explode(",", $_POST['keys'] );

$result = twitter_update(
		$twitter_keys[0],
		$twitter_keys[1],
		$twitter_keys[2],
		$twitter_keys[3],
		$_POST['tpost']
);

$_SESSION['consumer_key'] = $twitter_keys[0];
$_SESSION['consumer_secret'] = $twitter_keys[1];
$_SESSION['access_token'] = $twitter_keys[2];
$_SESSION['access_token_secret'] = $twitter_keys[3];

print "<a href='twitter.php?tpost=" . urlencode($_POST['tpost']) . "'>戻る</a>";
print "<pre>";
print_r(json_decode($result));
print "</pre>";

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

function twitter_update( $apikey, $secret, $token, $token_secret, $text ) {
	// **********************************************************
	// API
	// **********************************************************
	$twitter_url = 'https://api.twitter.com/1.1/statuses/update.json';
	
	// **********************************************************
	// 認証データ
	// **********************************************************
	$oauth_consumer_key = $apikey;
	$oauth_consumer_secret = $secret;
	$oauth_token = $token;
	$oauth_secret = $token_secret;
	
	// 毎回変化するランダムな文字列
	$mt = microtime();
	$rand = mt_rand();
	$oauth_nonce = md5($mt . $rand);
	
	$oauth_signature_method = "HMAC-SHA1";
	$oauth_timestamp = time();
	$oauth_version = "1.0";
	
	// *********************************************************
	// シグネチャ用ベース文字列作成
	// *********************************************************
	$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 .= "%26status" . "%3D" . urle(urle($text));
	
	file_put_contents( "base_string.log", $base_string );

	// *********************************************************
	// シグネチャ作成
	// *********************************************************
	$oauth_signature = 
	base64_encode( hash_hmac(
		"sha1",
		$base_string,
		urle($oauth_consumer_secret) . "&" . urle($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, "status=" . urle($text));
	
	// *********************************************************
	// http ヘッダ作成
	// *********************************************************
	$header = array();
	$header[] = 'Expect:';
	
	$header[] = "Authorization: OAuth ".
	urle("oauth_consumer_key")."=\"".urle($oauth_consumer_key)."\",".
	urle("oauth_token")."=\"".urle($oauth_token)."\",".
	urle("oauth_nonce")."=\"".urle($oauth_nonce)."\",".
	urle("oauth_timestamp")."=\"".urle($oauth_timestamp)."\",".
	urle("oauth_signature_method")."=\"".urle($oauth_signature_method)."\",".
	urle("oauth_version")."=\"".urle($oauth_version)."\",".
	urle("oauth_signature")."=\"".urle($oauth_signature)."\"";
	
	curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
	
	// *********************************************************
	// https 用 ( https://api.twitter.com 利用時に必要 )
	// *********************************************************
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);
	
	// *********************************************************
	// 戻された http ヘッダの出力
	// *********************************************************
	$handle = fopen("./header.log", "w");
	curl_setopt($curl, CURLOPT_WRITEHEADER, $handle);
	
	// *********************************************************
	// 送信
	// *********************************************************
	$result = curl_exec($curl);
	
	// *********************************************************
	// 結果
	// *********************************************************
	$ret = true;
	if($result === false) {
		$ret = false;
	}
	curl_close($curl);

	return $result;

}
?>

テキストエリアに、カンマ区切りで入力された四つのキーを使って投稿しています。最後に結果を JSON 文字列を PHP 用のオブジェクトに変換して text/html 内(HTMとして)の PRE 内で表示しています。


posted by lightbox at 2013-09-16 15:35 | PHP + Twitter | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

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

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