前提:Twitter Developersでアプリのconsumer_key等を取得しておく必要があります。詳しく知りたい人は「Twitter OAuth」などを調べるといいでしょう。
なぜこんな技術が必要なのかは、cURL編で書きました。
Streaming APIを使うときは、接続が切れてしまったときにいかに接続し直すかというのがキモなわけですが、cURLで簡単に実現する方法がわからなかったので、240秒ごとに強制的に接続し直すという方法を採用しました。この方法には、(1)再接続のときにつぶやきを取りこぼす危険と重複して取得する可能性があること、(2)接続が切れてから再接続を試みるまでに平均で120秒かかる、という問題がありました。
Streaming APIは、つぶやきが無いときには「CR LF」を30秒おきに送信してくるので、これをチェックすれば切断を検出できるのですが、検出と再接続の機能を自分で実装するのは大変なので、ライブラリに頼りましょう。
ここでは、PythonでTwitterを利用するためのライブラリ、Tweepyを使います。Ubuntuなら次のようにインストールできます。
sudo apt-get update sudo apt-get install python3-setuptools python3-pip sudo easy_install3 tweepy
CentOSなら、suで管理者になってから、
yum install python-setuptools easy_install tweepy
Tweepyは切断の検出と再接続の機能を持っているので、Streaming APIで受け取ったデータを出力するプログラム(stream.py)は、サンプルを参考にして次のように簡単に書けます。StreamListenerで、つぶやきに対応するon_status()
ではなくon_data()
をオーバーライドしているのは、データをそのまま(JSON形式で)出力したいからです。とりあえず全部保存しておいて、必要なものをあとで取り出すというわけです。JSON以外のものがdata
として来る場合もあるので、最初が「{
」のものだけをJSONデータと見なして出力するようにしています(ちょっとかっこわるい)。
# -*- coding: utf-8 -*- from tweepy.streaming import StreamListener from tweepy import OAuthHandler from tweepy import Stream consumer_key = ""#引用符の中にconsumer_keyの情報を記述する consumer_secret = ""#引用符の中にconsumer_secretの情報を記述する access_token = ""#引用符の中にaccess_tokenの情報を記述する access_token_secret = ""#引用符の中にaccess_token_secretの情報を記述する class StdOutListener(StreamListener): def on_data(self, data): if data.startswith("{"): print(data, flush=True) return True def on_error(self, status): print(status, flush=True) if __name__ == '__main__': l = StdOutListener() auth = OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) stream = Stream(auth, l) stream.filter(track = [keyword])#検索する場合 # stream.sample()#ツイートのランダムサンプリングを取得する場合 # stream.userstream()#タイムラインを取得する場合
consumer_keyとconsumer_secret、access_token、access_token_secret、つぶやきを絞り込むためのキーワード(例:「track = ["UK USA"]
」、「track = ["日本"]
」。OR条件はカンマ、AND条件はスペースで連結)を入力して、「python3 stream.py
」で実行します。うまく動いていたら,「python3 stream.py >> result.dat
」などとして結果をresult.datに保存します。
「せっかくPython使っているんだから、この場でパースして・・・」と思うかもしれませんが、後で何が必要になるかわからないので、とりあえず生データを保存しておくのがいいでしょう(リアルタイムでアウトプットしたいという場合は別です)。ファイルではなくデータベースに保存してもいいのですが、話が複雑になるのでやめておきます(データベースを使う場合でも、後で何が必要になるかわからないので、全データを保存しておくのがいいでしょう)。
再接続できるからといって、通信の不安定な場所での利用はおすすめできません。通信の安定した環境に置いたサーバで動かしっぱなしにするのがいいでしょう。何らかの原因でプロセス自体が落ちたときのために、以下のようなスクリプトを使うといいかもしれません(通常の切断ではプロセスは落ちません)。
#!/usr/bin/env bash while : do python3 stream.py >> result.dat sleep 240 done