はい、備忘録です。
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