1. TOPTOP
  2. Webサービス
  3. PHP

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

|

php

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

〔参考サイト〕