【PHP版】TwitterStreamingAPIをOAuth認証する方法

今回は久しぶりにプログラム系の話題をしたいと思います。

twitterのプロフィールでも「web屋」と書いているのに、企業系の話ばかりなので、これからは月1回程度は、システム系なお話もエントリーしてゆこうかなと考えています。

とはいえ、このサイトのテーマがブレブレなので、何のblogなのか分からなくなってきて、SEO的に失敗じゃないか?という声も聞かれますが、まぁ、そこはgoogle先生が判断してくれるのを期待しましょう。

というわけで、今回は「PHPからtwitterのStreamingAPIをOAuth認証で使うための方法」という内容でエントリーしたいと思いますが、書いているうちに非常に長いエントリーになってしまったので、各章ごとに分けてみました。

もう知っているという部分は読み飛ばしていただければと思います。

twitterAPIは現在「OAuth認証形式」になっている

それでは早速本題に入ってゆきたいと思います。

現在、twitterのAPIには大きく分けて、特定のデータを取得する「REST API」と、データが流れ続けてくる「Streaming API」の2種類存在しています。

これまで、twitterは、何度かのAPI仕様変更をし、「REST API」「StreamingAPI」ともに、ベーシック認証方式OAuth認証方式へなど、仕様変更をしてきました。

そして、2014年1月13日に、StreamingAPIも「SSL/TLS通信でのデータ取得方法」に変更をされて、twitter系アプリやStreaminAPIを利用したサービスが使えなくなるという状況になりました。

私もStreamingAPIを利用したサービスを作っているので、改修が出来るまでは、サービスを止めてしまいましたが、失ってこそ気がつくStreamingAPIの凄さと、その可能性を再確認する事になりました。

「REST API」に対して、「StreamingAPI」はあまり話題にならないのですが、本当に便利なサービスなので、ぜひ利用をしてみて頂ければと思います。

それでは早速、次の章で「StreamingAPI」が何なのかを体験して頂きましょう。

StreamingAPIって何?

先に紹介をしたように、twitterAPIには「REST API」と「Streaming API」の2種類があります。

どちらもtwitterで呟かれている様々な内容を取得するための方法なのですが、それぞれの用途が異なります。

REST API    https://dev.twitter.com/docs/api/1.1

ツイートされた内容・ユーザーの情報・フォロワー数・友達関係の確認といった様々なデータを取得したり、ツイートをする、フォローをする・外す、DMを送信するなど、ツイッターの様々な機能を利用するためのAPI群。

一般的に「twitterAPIを使ったサービスを…」という案件の場合、その多くがこちらのAPIを利用するということになります。

データの取得に対して時間内の回数制限があるため、大量のデータを一気に取得するなどの使い方をする場合は、かなり制約がありますが、幅広く使う事になるAPIといえます。

Streaming API    https://dev.twitter.com/docs/streaming-apis

ツイートされた内容を(ほぼ)リアルタイムにJSONファイルとして取得します。

ツイートされた内容の他に、リツイートされた情報・ツイートを削除した情報など、ツイートに関して「今起こったこと」が取得できるAPIです。

こちらはtwitterのAPIサーバに接続しっぱなしにして、次々にデータが流れてくるのを取得するという方法のため、データ取得の回数制限などはありません。

ただし、データが間引かれる可能性があり、全てのデータが確実に取得できる保証がありません。

普段、私がtwitterサービスを作る場合は、この2つのAPIを利用して、それぞれの特徴を活かしてどうやって負荷を下げながら作るかという設計をしてゆきますが、twitterサービスを作っている方でも「StreamingAPI」をあまり使わないという方も多いのではないでしょうか。

「なんだか難しそう」とか「そもそもStreamingAPIって何が出来るのさ」という方も、少しだけStreamingAPIに関心を持って頂ければと思います。

ということで、以下、デモです。

これは「iPhone、iPad、iPod、 iOS」のいずれかの文字をツイートした人達のアイコンを「StreamingAPI」を利用して表示しています。
約20秒間だけ動作をさせるようにしていますが、その間、顔のアイコンがどんどん増えてゆくのが分かるかと思います。

こんなふうに「勝手にデータが送られてくる」ことで、REST APIだけではAPI回数制限という制約上、取得できなかったツイートを集めることが出来るので、ビッグデータとよばれるような大量の情報を使った様々なサービスを作ることが出来るわけです。

 

どんな用途にStreamingAPIは使えるのか?

ここまでStreamingAPIの解説をしてきましたが、いまいちピンとこない方もいらっしゃるかもしれません。

それでは、例えば「肌荒れ」と言っている人が、今、どの地域に多いのかというデータ集積ができれば、それを予防する薬を、どの地域に重点的に置けば売上げが上がるのか…という判断材料に使えたりしませんか?

また、2013年の夏、アルバイトの行動が社会的な問題になりましたが、自社や関連会社などに、何か悪い噂が立っていないかをすぐに関知できれば、素早くその対応が出来ると思いませんか?

「StreamingAPI」に乗ってくるのは、ツイートだけではなく、その人の情報や、どの地域から(緯度経度)、どのアプリでツイートしたのか、といったデータも流れてきますので、いろいろなビジネスシーンで、しかも無料で戦略を練ったり、リスクヘッジのツールとして用いることができます。

 

少し興味が出てきたかもしれない、その勢いで、早速「StreamingAPI」を使う準備に入ってゆきましょう。

まずは「OAuth認証」のキーを取得するところから始まります。

この作業は「StreamingAPI」だけでなく、今後「REST API」を利用したサービスを作る際にも必要になりますので、まだキーを取得できていない方は、次のページ twitterのOAuth認証キーを取得する方法に進んで下さい。

既にアプリを作成していて、OAuth認証キーを取得されている方は、phirehoseを用いてStreamingAPIを使うへ進んで下さい。

twitterのOAuth認証キーを取得する方法

それでは早速OAuth認証をするためのキーを取得します。

Twitter Developersのページにアクセスし、右上の「Sign in」のリンクを辿って、OAuth認証で利用したいtwitterアカウントでログインをします。

twitter dev メニューログインをしたらアカウントに設定している画像が右上に出てきますので、その画像をマウスオーバーして出てくるメニューの「My applications」を選択してアプリケーション一覧ページに移動をします。

最初は何もアプリケーションが登録されていないので、「Create a new application」のボタンを押して、アプリケーションの登録を行います。

「個人アカウントでOAuth認証をしたいだけなのに、何でアプリケーション登録なんだろう?」と思われる方もいらっしゃるかと思いますが、twitterではアプリケーション毎に、自分のOAuth認証用のキーを生成するという仕組みになっているため、このようにアプリケーション登録をする必要があるのです。
twitter アプリケーション登録
新規登録では
「アプリケーション名(Name)」
「アプリケーションの説明(Description)」
「アプリケーションのURL(Website)」
が問われますので、任意の内容を入力して、利用許諾に承認をして登録を行います。

Name は既に誰かが付けている名前は使えませんので、任意の名称にする際は「あなただけのアプリケーション名」を付けるという事になります。

ここで付けたアプリケーション名や説明文は、後ほど変更することも可能ですので、どんな名称にしようか悩んで、ここで挫折をしなくても大丈夫です。何か任意の文字を入れて、ひとまずはアプリケーション登録を済ませてしまいましょう。

 

アプリケーションが無事登録できたら、そのアプリケーションのページに飛んでくるはずです。

create_access_token
ここで、画面下の方にスクロールしてゆくと、「Your access token」と書かれているかと思います。

しかし、まだこの時点では「access token」が表示されておらず、「Create my access token」ボタンが表示されているかと思いますので、ボタンを押して生成をします。

access_token
正常に生成されると、「Access token」と「Access token secret」、そして「Access level」が表示されるかと思います。(表示されない場合は、画面をリロードしてみて下さい)

このように各項目が表示されていれば、OAuth認証をするための準備は完了です。

 

アプリケーションの Access level

なお、今回はstreamingAPIでデータを取得するだけなので、「Access level」は「Read-only」で問題ありませんが、今後、アプリケーション内からツイートをさせたいとかダイレクトメッセージを送りたいなどの使い方をしたい場合は、Access levelの変更をする必要があります。

Access type
変更の方法は「Settings」タブを選択し、画面スクロールをしてゆくと「Application type」という項目が出てきます。

初期値は「Read only」になっていますので、アプリケーションからのツイートなどをしたい場合は「Read and Write」を選択します。

ダイレクトメッセージにもアクセスをする必要なアプリを作る場合は「Read, Write and Access direct messages」を選択する必要がありますが、おそらくこの項目を選択する必要のあるアプリを作成する機会は殆ど無いと思いますので、真ん中の「Read and Write」にしておくと良いでしょう。

Phirehoseを用いてStreamingAPIを使う

さて、いよいよStreamingAPIからデータを取得する方法に入ってゆきますが、今回は、PHPでStreamingAPIを使うため、GitHubに登録されているPhirehoseというライブラリを利用することにします。

まずはGitHubのPhirehoseにアクセスをして、画面右下にある「Download ZIP」ボタンを押します。

ファイル構成ZIPファイルがダウンロードされたら、そのファイルを解凍をすることで、幾つかのファイルとディレクトリが展開されます。

今回は、特定の言葉やユーザーの呟きを拾ってゆきたいので、example の中にある filter-oauth.php を利用して、プログラムを組んでゆきたいと思います。

まずは、filter-oauth.phpを、上位のディレクトリ(Changelog.txt などがあるディレクトリ)にコピーし、streaming.php などのファイルにリネームしておきましょう。

コピーをした streaming.php をエディタで開くと、このような記述がされています。(2014年1月27日 #52)

上記のソースにある/libディレクトリのパスを変更します。

その後、下部にある各defineの部分に、「twitterのOAuth認証キーを取得する方法」にて取得した各項を下記に埋め込みます。
tw_oauth

そして、検索したい文字がデフォルトでは「’morning’, ‘goodnight’, ‘hello’, ‘the’」となっているので、自分の調べたい文字に置きかえます。
今回は、デモで使ったのと同様に、「’iPhone’, ‘iPad’, ‘iPod’, ‘iOS’」にしたいと思います。

なお、「’iPhone’, ‘iPad’, ‘iPod’, ‘iOS’」といったアルファベットだけの文字だと、様々な国の方のツイートを拾ってしまう可能性が高いので、日本語だけに絞り込むために、$sc->consume(); の前の行に $sc->setLang(“ja”); を加えておくことで、言語を日本語に設定されている人のツイートのみを対象とする事ができます。

上記のように変更を加えて、サーバの任意の公開ディレクトリにアップロードします。
アップロードするのは、/lib フォルダと、streaming.php となります。

アップロードが完了したら、ブラウザで、streaming.phpにアクセスをしてみて下さい。
暫くすると、ブラウザに、文字が表示されてゆくと思います。

いかがでしょうか。Phirehoseを利用する事で、こんなに簡単にStreamingAPIからデータの取得ができてしまいました。

phirehoseのカスタマイズをしてみる

さきほどは、言語が「日本(ja)」になっているユーザーが、「’iPhone’, ‘iPad’, ‘iPod’, ‘iOS’」といういずれかの文字を含んだツイートを取得しましたが、今度は、特定のユーザーアカウントが呟いたツイートを取得するというカスタマイズをしてみましょう。

例えば、眞鍋かをりさんと、いとうあさこさんと、大竹まことさんのアカウントに関連するツイートだけを取得したいといった限定も出来ます。

その下準備として、まず、対象アカウントのIDを調べます。
IDを調べるツールを下記に設置していますので、twitterアカウント名を入力し、検索ボタンを押して下さい。
(検索には暫く時間がかかったり、twitterAPIの制限で、暫く使えなくなる場合もあります。)

Twitterアカウント名 @

 

このツールを使って、KaworiM0531、asako1970、cb_otake それぞれのアカウントのIDを取得できたら、このように変更をします。

このように、setFollowにIDを設定することによって、特定のアカウントに関連する日本語のツイートだけをStreamingAPIで取得することが出来るようになります。

phpをcronで動かして自動的にデータを取得させてみる

ここまでくれば、「検索をしたい特定の言葉でのツイート」や「特定のアカウントに関連したツイート」が取得できる「StreamingAPI」の凄さが分かったのではないかと思います。

現在はブラウザ上で実行をさせているため、画面の中で確認をするというだけの状態になっていますが、csv出力させてEXCELで処理できたり、データベースに収納してオリジナルサイトが作れると、更に便利だと思いませんか。

「便利だろうけど…なんだか難しそう」と思われるかもしれませんが、実は、ほんの僅かな変更で、簡単に実現できてしまうのです。

それでは早速、CSVとして出力をするようにプログラムを変更してみましょう。

現在、画面に表示をするため、下記のようにプログラムが記述されています。

これを、下記のように変更します。

画面表示に利用する「print_r」を、「file_put_contents」に変更することで、誰がどのようなツイートをしたのかを、SJISの文字コード・タブ区切り(\t)で追記してゆく事が出来ます。

あとは、このプログラムをcronが実行できるサーバ上で、自動実行させるだけで、勝手にCSVファイルに書き出されてゆきます。

ただし、下記の2点に気を付けておく必要があります。
・出力先のディレクトリ・ファイルが、cronの権限で書き込み出来るようなパーミッションの設定になっていないといけない
・適度なタイミングでファイルを空にしないとディスクが逼迫してしまう

ちゃんとデータが取れていることを確認したら、あとは、適度なタイミングでファイルをダウンロードして、EXCELで開けばあっと言う間にツイートの一覧が完成です。

ちなみに、ツイートの内容をデータベースに取り込む場合は、

の後に、SQLのinsert文を記述すれば良いだけなので、PHP+MySQLが出来る方なら、それほど難しい事は無いかと思います。

企業であれば、自社製品の口コミや提言を、個人であれば気になるキーワードの情報を、簡単にリスト化する事が出来るので、ぜひ試してみて下さい。

いかがだったでしょうか。

StreamingAPIがこんなに簡単に利用できるなら、ちょっと試してみたくなったのではないでしょうか。

ただし、この記事に記述した内容は、2014年1月27日現在のtwitterAPIの仕様に基づいて書いていますので、今後、変更になった場合や、Phirehoseの開発終了・配布終了などがあった場合は、この情報が正確な物ではなくなるということだけご了承下さい。

2 Responses to “【PHP版】TwitterStreamingAPIをOAuth認証する方法”

  1. […] いると、Phirehoseを使っている日本語のサイトを発見しました。このありがたい日本語サイトを要約すると、 […]

コメントを残す

このページの先頭へ