PHPでつぶやきを検索してRSSフィードを作成する (Twitter API 1.1 対応)

twitterでおなじみハッシュタグ。内輪向けやメモ用として愛用しているのですが、つぶやきを記録するためにIFTTTを使ってEvernoteに保存していました。

以前はIFTTTの入力元にtwitterを利用できたのですが、それがなくなりまして。それじゃ困る、とのことで、twitterが出力していたRSSフィードを元にしてEvernoteに保存していたのですが、API1.1へのバージョンアップに伴い、RSSも廃止になり。

便利な世の中になっていくはずなのに便利なものがどんどん消えていく、このかなしさ。

しかしJSONデータでの取得はできるので、JSONからRSSフィードを作れば今までどおりです。

ということで、PHPでつぶやきを検索してRSSフィードを作成することに成功しましたのでブログ記事にまとめておきます。

 

余談ですが、API1.1ではJSONデータの取得にもOAuth認証が必要になったので注意してください。

 

RSSフィード運用までの流れ

  1. twitterアプリケーションの登録
  2. twitteroauth(PHP認証ライブラリ)のダウンロード
  3. JSONデータをRSSに変換するスクリプトを作成してウェブサーバーにアップする
  4. cronでスクリプトを定期的に実行する

 

twitterアプリケーションの登録

1.Twitter Developersにtwitterのアカウントでログインします。
1
2.右の「Create a new application」ボタンをクリックします。
2
3.各項目を入力します。Callback項目は入力しなくても大丈夫です。

3
4.利用規約を読んで「Yes, I agree」にチェックを入れます。続いてCAPTCHA認証用の文字を入力してから「Create your Twitter application」ボタンをクリックします。

4
5.ページ下部の「Create my access token」ボタンをクリックします。

5
6.「Consumer key」、「Consumer secret」、「Access token」、「Access token secret」の4つをメモします。

6
7.twitterアプリケーションの登録の登録はこれで完了です。

 

twitteroauth(PHP認証ライブラリ)のダウンロード

1.twitteroauthをダウンロードします。GitHubのサイトにアクセスして、ダウンロードしてください。
abraham/twitteroauth · GitHub

7

2.ダウンロードしたtwitteroauth-masterを解凍します。使用するのはtwitteroauthフォルダのみです。

8

 

JSONデータをRSSに変換するスクリプトを作成する

1.こちらのソースをコピーしてtwitteroauthフォルダに保存してください。

<?php
require_once("twitteroauth.php");

$keyword = '#neko';
$filename = 'neko.xml';

$options = array('q'=>$keyword,'count'=>'10','lang'=>'ja');

$consumerKey = "************";
$consumerSecret = "************";
$accessToken = "************";
$accessTokenSecret = "************";

$connection = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);
$request = $connection->OAuthRequest('https://api.twitter.com/1.1/search/tweets.json', "GET", $options);
$jset = json_decode($request, true);

//var_dump($jset);

if (isset($jset)) {
$file = fopen($filename, 'w');
fwrite($file, '<?xml version="1.0" encoding="utf-8"?>' . "\n" . '<feed xmlns="http://www.w3.org/2005/Atom">' . "\n");
fwrite($file, '<title>' . $keyword . "のフィード</title>\n");
foreach ($jset['statuses'] as $results) {
fwrite($file, "<entry>\n");
fwrite($file, '<id>tag:' . $results['id_str'] . "</id>\n");
fwrite($file, '<published>' . date('Y-m-d H:i:s', strtotime($results['created_at']) + 9 * 60 * 60) . "</published>\n");
fwrite($file, '<link rel="alternate" type="text/html" href="https://twitter.com/' . $results['user']['screen_name'] . '/status/' . $results['id_str'] . '"/>' . "\n");
fwrite($file, '<title>' . $results['text'] . "</title>\n");
fwrite($file, '<content type="html">' . $results['text'] . "</content>\n");
fwrite($file, '<updated>' . date('Y-m-d H:i:s', strtotime($results['created_at']) + 9 * 60 * 60) . "</updated>\n");
fwrite($file, '<source>' . $results['source'] . "</source>\n");
fwrite($file, '<lang>' . $results['lang'] . "</lang>\n");
fwrite($file, "<author>\n");
fwrite($file, '<name>' . $results['user']['name'] . "</name>\n");
fwrite($file, '<uri>http://twitter.com/' . $results['user']['screen_name'] . "</uri>\n");
fwrite($file, "</author>\n");
fwrite($file, "</entry>\n");
}
fwrite($file, '</feed>');
fclose($file);
}

?>

2.さきほどのソースのうち、こちらの箇所を修正します。

  • $consumerKey … Twitter Developersで取得したデータを使用
  • $consumerSecret … Twitter Developersで取得したデータを使用
  • $accessToken … Twitter Developersで取得したデータを使用
  • $accessTokenSecret … Twitter Developersで取得したデータを使用
  • $keyword … 検索したいキーワード(例:#neko)
  • $filename … RSSフィードのファイル名(例:neko.xml)

3.twitteroauthフォルダをウェブサーバーにアップロードします。

4.アップロードしたphpを実行します。
なお、実行しても画面上は何も表示されません。JSONが取得できているか画面上で確認したい場合は、ソースの「//var_dump($jset);」部分のコメントを外してください。

5.同じフォルダにRSSフィードが出力されます。出力されない場合は、JSONの取得状態やフォルダの書き込み権限を疑ってみてください。

 

cronでスクリプトを定期的に実行する

出力したRSSフィードを定期的に更新するため、phpをcronで実行します。こちらのやりかたはcronサービスつきのレンタルサーバーでやるなりなんなりすれば良いかと。
参考までにですが、こんなサイトもありますよ、と。
My Free Web Cron Schedule Service

完成!

 

RSSフィードのフォーマット

<feed xmlns="http://www.w3.org/2005/Atom">
<title>検索文字のフィード</title>
<entry>
<id>tag:つぶやきのID</id>
<published>つぶやいた日付</published>
<link rel="alternate" type="text/html" href="https://twitter.com/つぶやいた人のアカウント名/status/つぶやきのID"/>
<title>つぶやき内容</title>
<content type="html">つぶやき内容</content>
<updated>つぶやいた日付</updated>
<source>
つぶやいたtwitterクライアント
</source>
<lang>つぶやき言語</lang>
<author>
<name>つぶやいた人の名前</name>
<uri>http://twitter.com/つぶやいた人のアカウント名</uri>
</author>
</entry>
</feed>

課題というか。日本語訳さんによれば、<source>と<lang>は<twitter:source>と<twitter:lang>が正しいそうです。しかし、このタグで出力するとXMLエラーを吐き出すので、私のソースでは省略して書きました。解決方法を知ってたら教えてください。

ぼやき

何回か実験したけど、検索結果がJSONに反映されない時が何度か。なんでやねーん。

参考ページ

事前に移行準備をしてなかったりPHPの素人だったりしたのでてこずりました。今回もphpの解説サイトなど複数のページを睨みながらスクリプトを作成しております。特に下記サイトは、とってもお世話になりました。多謝!

  1. 昨晩Twitter検索のRSSフィードが無効になっていることに気づいて悩んでいましたが、こちらの情報を元に作ることができました。
    ありがとうございました。

    1つ気づいたのですが、たまにsourceのURLに「&」が含まれることがあります。
    その場合に「EntityRef: expecting ‘;’ at line 791」のようなエラーになってしまいます。

    これに対しては、とりあえずhtmlspecialcharsを通すようにしてみました。
    HTMLタグなどもエンコードされるため少し不安がありますが、僕が使っているFeedlyではsourceを見ていないようなので特に問題は出ていません。

    ご参考まで。

      • crescensruna
      • 2013 06/21 8:21pm

      >霧鳥様
      返信ありがとうございます。
      あー……なるほど。たしかに、記号について一切考慮していないので、そのようなエラーが発生する可能性があります。
      検証してみますね。情報ありがとうございます。

    • まゆう
    • 2013 06/20 6:52pm

    あそうそう RSS廃止に・・・不便なんだか 便利なんだかそのうち良い方に動くんでしょうね~ そうすっと利用者に負担が(´・ω・`) これの追いかけっこなんですわな

      • crescensruna
      • 2013 06/21 8:23pm

      >まゆうさん
      コメントいただいてたのね!
      多分、サーバーへの負荷がとんでもないことになっていたんだろうなぁ。じゃないとこんな流れにならないもんね。
      JSONまではなくならないと思うけどね。そこまでやっちゃうとTwitterが廃れそう。

  1. トラックバック 0

return top