php4とphp5に対応したTwitter投稿の方法
Twitter APIを使ってPHP4とPHP5から投稿する方法を書いてみました。 PHP4ではfopen()を使って投稿する方法がありますが、うまくいかなかった人用のもう一つの方法です。
PHP4ではfile_get_contents()のPOSTメソッドに非対応
最も簡単なTwitter APIでメッセージを投稿する方法は、PHPに標準で実装されているfile_get_contents()メソッドを利用することなんですが、twitterのメッセージ投稿に必要なHTTPリクエストする際のPOSTメソッドやヘッダー情報送出などのコンテキストデータのサポートはPHP5からのため、利用することができません。
5.0.0 コンテキストサポートが追加されました。
その代替方法として、こちらで紹介されているのがfopen()を使った投稿方法です。
しかしPHP4でfopen()を使うとエラーが出る人もいる
私の場合もろに当てはまってしまったのですが、PHP4でfopen()を使った方法で投稿しようとすると、どうしても「401 Unauthorized」という認証失敗の結果になってしまって投稿できませんでした。
PHP4では悠希さん作のServices_Twitterを利用
PHPでTwitter APIを利用するライブラリーとしてPEAR::Services_Twitterがあるのですが、公式のものはPHP5.2.0以降の環境が前提となっています。 しかし、悠希さん作のServices_TwitterはPHP4.3.0以降であれば利用できるのでPHP4ユーザーでも利用可能なものとなっています。 ありがとう、悠希さん!
Services_Twitterのインストール
インストールはPEARコマンドを使って行います。
# pear install -f http://labs.transrain.net/files/Services_Twitter-0.4.0.tgz
途中でJsphonパッケージがないとJSON形式で解析できないよ、という依存メッセージが出ますが、単に投稿するだけなら無くても良いです。 Jsphonパッケージが必要な方はこちらからどうぞ。
ソースをちょこっといじる
これでそのまま利用できるのかと思ったのですが、投稿してみると今度は「HTTP/1.1 302 Moved Temporarily」が表示されてしまいますので、ソースのTwitter.phpをちょこっといじります。
#vi /usr/share/pear/Services/Twitter.php --------------------------------------------------------------- 501行目: //var_dump($line); //コメントアウトする ---------------------------------------------------------------
PHP4用とPHP5用の投稿処理をバージョン判別して分ける
これは私の環境がPHP4が入っているサーバーからPHP5が入っているサーバーへシームレスに以降させないといけない状況だったので併記してありますが、通常はどちらか一方で良いです。
$message = "PHPでtwitterに投稿したよ!"; //投稿用メッセージ $username = '●●●●●●●●●'; //ログイン用twitterユーザー名 $password = '●●●●●●●●●●'; //ログイン用twitterパスワード //PHP5用 if (floatval(phpversion()) >= 5) { $url = "http://twitter.com/statuses/update.xml?"; $params = "status=". rawurlencode($message); $result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":". $password) ) ))); if ($result === false) echo 'twitterの投稿に失敗しました。'; //PHP4用 } else { require_once "Services/Twitter.php"; $st =& new Services_Twitter($username, $password); if ($st->setUpdate($message) === false) echo 'twitterの投稿に失敗しました。'; }
2009-11-19