はい、備忘録です。
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 プログラミング
posted with amazlet at 11.03.07
辻村 浩
ワークスコーポレーション
売り上げランキング: 131008
ワークスコーポレーション
売り上げランキング: 131008

コメント
“PHP4でoAuth。Twitter APIでつぶやく。「マチルダさ~ん」” への3件のフィードバック
ありがとうございます! ものすごく助かりました。Twitter で @kiri_tori 、@kiri_toru 等のbot を公開してるのですが、6月末でBasic認証がなくなるとかで、OAuth認証に対応させようにも、PHP5対応の方法がほとんどで、しかし、うちのサーバーはまだPHP4で、なかなか5に上げてくれないんです。APIに入り込むほどのプログラミングの腕もないし、7月になったらbot停止かと、ほとんどあきらめかけてたのですが、これで継続が出来るようになりました。本当にありがとうございます。
物凄く助かりました。php5に簡単に上げれない事情があって困っていたので
まだ試してませんが、すごく助かりました!
php5に上げるまでのつなぎとして使わせていただきます。