PHP4でoAuth。Twitter APIでつぶやく。「マチルダさ~ん」

はい、備忘録です。

PHPでTwitter APIのアプリケーションを作成するにあたって、PHP5であればPEARやPECLを捏ねくり回してシャシャっとつぶやけるんだけど、PHP4となるとこれまた・・・・・・。オレのメインクライアント様の環境はPHP4なんだよなぁ。

PEARのOAuthはPHP5だと云うし、ネットでさらされている各種モジュールもPHP5。しまいにゃSignatureを作るのに必要なHMAC-SHA1、というかhash_hmacまでPHP5。Compatにも入ってないし。

とりあえずがんばって晒すテスト。

以下ソース。

PHP5で書けばこんなに簡単!!

setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);

$consumer->setToken(TWTR_ACCESS_KEY);
$consumer->setTokenSecret(TWTR_ACCESS_SECRET);

$status = 'PHP5からの投稿テスト マチルダさ~~~~ん';
$response = $consumer->sendRequest("http://api.twitter.com/1/statuses/update.xml", array('status' => $status), "POST");
echo $response->getBody();

PHP4でがんばった成果「PHP4からの投稿テスト マチルダさ~~~~ん」。

 'PHP4からの投稿テスト マチルダさ~~~~ん',
	'oauth_consumer_key' => TWTR_CONSUMER_KEY,
	'oauth_nonce' => md5(uniqid(mt_rand(), TRUE)),
	'oauth_signature_method' => 'HMAC-SHA1',
	'oauth_token' => TWTR_ACCESS_KEY,
	'oauth_timestamp' => time(),
	'oauth_version'=> '1.0',
);

//変数名でソート
$request_sorted = $request_param;
ksort($request_sorted);

//Sigunatureのベーステキストを作成
$request_queries = array();
foreach ($request_sorted as $k => $v) $request_queries[] = $k. '='. _rawurlencode($v);
$request_query = implode('&', $request_queries);

//それぞれをURLエンコードして接続
$twtr_signature_base  = "POST&";
$twtr_signature_base .= _rawurlencode(REQUEST_URI). '&';
$twtr_signature_base .= _rawurlencode($request_query);

//Signatureの作成
$twtr_keys = _rawurlencode(TWTR_CONSUMER_SECRET). '&'. _rawurlencode(TWTR_ACCESS_SECRET);
$request_param['oauth_signature'] = base64_encode(_hmacsha1($twtr_keys, $twtr_signature_base));

//HTTPヘッダーに追加するAuthorizationパラメータ作成
$request_headers = array();
foreach ($request_param as $k => $v) $request_headers[] = $k. '="'. _rawurlencode($v). '"';
unset($request_headers[0]);	//最初に定義したパラメータリストからstatusのみ撤去
$request_header = 'OAuth realm="'. REQUEST_DOMAIN. '", '. implode(', ', $request_headers);

//PEARのRequestを使ってポスト
require_once ('HTTP/Request.php');
$request = &new HTTP_Request();

$request->setURL(REQUEST_URI);
$request->setMethod(HTTP_REQUEST_METHOD_POST);
$request->addHeader('Authorization', $request_header);
$request->addPostData('status', $request_param['status']);
$result = $request->sendRequest();

if (PEAR::isError($result))
{
	echo $result->getMessage();
}
else
{
	echo $request->getResponseBody();
}

//URLエンコード RFC3986版
function _rawurlencode($str)
{
	$str = rawurlencode($str);
	$str = str_replace('+', ' ', $str);
	$str = str_replace('%7E', '~', $str);
	return $str;
}

//hash_hmac('sha1', $data, $key, true)の代わり
function _hmacsha1($key, $data)
{
	$blocksize = 64;
	$hashfunc = 'sha1';
	if (strlen($key) > $blocksize) $key = pack('H*', $hashfunc($key));
	$key = str_pad($key, $blocksize, chr(0x00));
	$ipad = str_repeat(chr(0x36), $blocksize);
	$opad = str_repeat(chr(0x5c), $blocksize);
	$hmac = pack('H*', $hashfunc(($key^$opad). pack('H*', $hashfunc(($key^$ipad). $data))));
	return $hmac;
}
Twitter API プログラミング
辻村 浩
ワークスコーポレーション
売り上げランキング: 131008

「PHP4でoAuth。Twitter APIでつぶやく。「マチルダさ~ん」」への3件のフィードバック

  1. ありがとうございます! ものすごく助かりました。Twitter で @kiri_tori 、@kiri_toru 等のbot を公開してるのですが、6月末でBasic認証がなくなるとかで、OAuth認証に対応させようにも、PHP5対応の方法がほとんどで、しかし、うちのサーバーはまだPHP4で、なかなか5に上げてくれないんです。APIに入り込むほどのプログラミングの腕もないし、7月になったらbot停止かと、ほとんどあきらめかけてたのですが、これで継続が出来るようになりました。本当にありがとうございます。

  2. 物凄く助かりました。php5に簡単に上げれない事情があって困っていたので

  3. まだ試してませんが、すごく助かりました!
    php5に上げるまでのつなぎとして使わせていただきます。

コメントは停止中です。

スポンサードリンク