Edited at
PythonDay 1

PythonでTwitter Streaming APIを叩いた話

More than 3 years have passed since last update.

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を叩いてデータを取得することが出来ました。

間違いなどがあれば指摘していただけるとありがたいです。