python Advent Calendarのトップバッターということで、今更ではありますが、Twitter APIを叩いてみた話を書いてみます。これまでAPIを叩いたことがなかったので、今回はAPIを叩くという事自体の勉強も兼ねて、Twitter-pythonライブラリなども使わずにやってみようと思います。ネットで軽く調べて出てくるのは、Twitterライブラリを使ったものが多いので、少しは役に立つといいのですが。
やってみること
REST APIより、Streaming APIの叩き方がよくわからなかったので、今回はStreaming APIを叩いて、tweetの内容を表示するところまでやってみようと思います。
必要なもの
importするもの
とはいうものの、OAuth等のコードをすべて書くのは辛いので、そのあたりはライブラリに任せることにします。
- requests
- OAuth1 from requests_oauthlib
このあたりをimportしておきます。
取得しておかなければいけないもの
- API key
- API Secret
- Access Token
- Access Secret
このあたりの取得方法は調べるとすぐに出てくるので割愛しますが、API-は開発者またはアプリケーションに固有のもの、Access-はユーザアカウント固有のものっぽいです。
APIのURL
練習ということで、今回はpublic stream(Twitter全体のstream)を取得してみます。
https://stream.twitter.com/1.1/statuses/filter.json
APIの公式説明は
https://dev.twitter.com/streaming/reference/post/statuses/filter
を参照してください。
これで必要なものがそろいました。
実際に書いてみる
ここまでの材料で実際に書いてみます。なお、import文についての説明は省略します。
定数定義
api_key = "YOUR API KEY"
api_secret = "YOUR API SECRET"
access_token = "YOUR ACCESS TOKEN"
access_secret = "YOUR ACCESS SECRET"
url = "https://stream.twitter.com/1.1/statuses/filter.json"
今回はこのように定数に名前をつけておきます。
OAuth情報
OAuthで認証を行うのに、OAuth1を使います。
auth = OAuth1(api_key, api_secret, access_token, access_secret)
こうすると、authにはOAuth1のオブジェクトが得られます。これを使って、POSTで認証・データの取得を行います。
HTTP POST
r = requests.post(url, auth=auth, stream=True, data={"track":"twitter"})
これでHTTP POSTによってアクセスを行います。
stream
stream=True
を指定することで、生のソケットレスポンスにアクセスできるようになり、streamデータが得られます。
data
dataには辞書を渡します。
https://dev.twitter.com/streaming/reference/post/statuses/filter
のParametersに書いてある項目が使用できる値です。
簡単に説明しましょう。
folllow
カンマ区切りでユーザーIDを指定できます。この項目で指定されたユーザーのtweetを返します。
track
カンマ区切りでキーワードを指定できます。この項目で指定されたキーワードを含むtweetを返します。
locations
位置情報をカンマ区切りで指定します。
例えば-122.75,36.8,-121.75,37.8と指定すると、サンフランシスコからのtweetを返します。
follow, track, locationsのいずれか一つが必須です。
その他にもオプションがありますので、確認してみてください。
ここまでで得られたrには、リクエストへのレスポンスが入っています。これにはiter_lines()というメソッドがあり、これを呼び出すことでそれぞれのtweetを個別に得ることができます。
Sample Code
import requests
from requests_oauthlib import OAuth1
api_key = "YOUR API KEY"
api_secret = "YOUR API SECRET"
access_key = "YOUR ACCESS SECRET"
access_secret = "YOUR ACCESS SECRET"
url = "https://stream.twitter.com/1.1/statuses/filter.json"
auth = OAuth1(api_key, api_secret, access_token, access_secret)
r = requests.post(url, auth=auth, stream=True, data={"follow":"nasa9084","track":"emacs"})
for line in r.iter_lines():
print(line["text"])
まとめ
なんだかよくわからないながらも、Streaming APIを叩いてデータを取得することが出来ました。
間違いなどがあれば指摘していただけるとありがたいです。