PHPでfopen関数が使えないときはcurl関数を使う。TwitterのストリーミングAPIでタイムラインを取得するときに気付いたこと
目次
TwitterのストリーミングAPIの機能(新しいタブで開く)を使って、指定したキーワードにマッチしたタイムラインを取得したいと考えています。
以下の内容は、そのときカベにぶち当たったときのことです。取得するためのPHPファイルは「さくらのレンタルサーバー」に置いています
fopenでアクセスできないときはcurlを使う
コードはこちらのサイト(新しいタブで開く)を参考にさせていただきました。しかしこのコードを実行すると、次のようなエラーが出ます。
<?php set_time_limit(0); tweetStream('myusername', 'mypassword', '東京'); /** * @param string $user Twitterのログイン名 * @param string $password Twitterのパスワード * @param string $keyword 検索キーワード **/ function tweetStream($user, $password, $keyword){ $keyword = urlencode($keyword); $url = "https://{$user}:{$password}@stream.twitter.com/1/statuses/filter.json?track={$keyword}"; if($stream = fopen($url, 'r')){ while(!feof($stream)){ $tweet= json_decode(fgets($stream), true); $user = $tweet['user']['screen_name']; $text = $tweet['text']; if(!empty($user)){ $timeline = '<strong>'.$user.'</strong> : '.$text.PHP_EOL; echo $timeline; ob_flush(); flush(); sleep(1); } } fclose($stream); } } ?>
〔エラーの内容〕
Warning: fopen(https://…@stream.twitter.com/1/statuses/filter.json?track=%E6%9D%B1%E4%BA%AC): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /home/…/index.php on line …
どうやらfopen関数は使えないとのこと。Twitterのサーバーにアクセスするためには、別の関数が必要みたいです。
ぐぐって探してみると、curl関数で代替できるようです。こちらのサイト(新しいタブで開く)を参考にして実行すると、エラーの内容が変わりました。
<?php set_time_limit(0); tweetStream('myusername', 'mypassword', '東京'); /** * @param string $user Twitterのログイン名 * @param string $password Twitterのパスワード * @param string $keyword 検索キーワード **/ function tweetStream($user, $password, $keyword){ $keyword = urlencode($keyword); $url = "https://{$user}:{$password}@stream.twitter.com/1/statuses/filter.json?track={$keyword}"; $data = ""; $cp = curl_init(); curl_setopt($cp, CURLOPT_RETURNTRANSFER, 1); curl_setopt($cp, CURLOPT_URL, $url); curl_setopt($cp, CURLOPT_TIMEOUT, 60); $data = curl_exec($cp); curl_close($cp); echo $data; } */ ?>
〔エラーの内容〕
HTTP ERROR: 401
Problem accessing ‘/1/statuses/filter.json?track=%E6%9D%B1%E4%BA%AC’. Reason:
Unauthorized
アクセスするためには、認証が必要なようです。先ほどのように、関数が使えないということエラーは消えました。
この記事を書いている時点(2014年9月6日)では、はっきりしたことは分かりませんが、TwitterOAuthによる認証を使えばよいかと考えています。
php.iniの設定をallow_url_fopenにするのもアリ
fopenは使えないかと言えば、そうではないようです。fopenを使う場合は、PHPのマニュアル(新しいタブで開く)によると、php.iniの設定でallow_url_fopenをOnにすれば良いらしいです。
ただ自分が試した「さくらのレンタルサーバー」では、allow_url_fopen = Onにしていても、Warning: fopen…のエラーが発生するので、curlを使うつもりです。
ちなみに「さくらのクラウド」のphp.iniを、allow_url_fopen = Onにすると、HTTP ERROR: 401が出ます。この違いはどこからくるのでしょうか?
【追記】
後日、TwitterのストリーミングAPIでつぶやきを表示させるためには、curl関数よりも良い方法を見つけました。ご興味のある方は、こちら(新しいタブで開く)まで。
〔参考サイト〕