PHPでfopen関数が使えないときはcurl関数を使う。TwitterのストリーミングAPIでタイムラインを取得するときに気付いたこと

php

TwitterのストリーミングAPIの機能を使って、指定したキーワードにマッチしたタイムラインを取得したいと考えています。

以下の内容は、そのときカベにぶち当たったときのことです。取得するためのPHPファイルは「さくらのレンタルサーバー」に置いています

目次

fopenでアクセスできないときはcurlを使う

コードはこちらのサイトを参考にさせていただきました。しかしこのコードを実行すると、次のようなエラーが出ます。

[php]
<?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);
}
}

?>
[/php]

〔エラーの内容〕

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]
<?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;
}
*/
?>
[/php]

〔エラーの内容〕

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関数よりも良い方法を見つけました。ご興味のある方は、こちらまで。

〔参考サイト〕

php

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次