初めましての方は初めまして。そうでない方はこんにちは。
今回は前回に引き続き、Twitter APIを用いて遊んでみる。
今回の目的は「インコの迷子情報に関するtweetをサーチする」である。
環境
- Python3
- Jupyter Notebook
準備
まずはじめに、tweetをサーチするためのエンドポイント指定URLを探そう。
これは前回と同様、TwitterのDeveloper用ページから探せば良い。
Standard Search APIのAPI referenceに書いてある。
このStandard Search APIにおけるResponse Informationは以下の通り。
これを見ると、responseのフォーマットは前回同様JSONであり、Requestは15分あたり180回までという制約があることがわかる。
次にパラメータについて見てみる。今回Requiredなものはqだけ。
qはサーチする際のクエリである。サーチをしようというのだからクエリがRequiredなのは当たり前だね。
また、Optionalなものは数多くあり、count(取得するtweet数)の他にgeocode(latitude,longitude,radiusを指定すれば、サーチをするtweetのlocationが決められる)やlang(言語)などがある。
今回はcountのみを使用する。
これで準備が完了したので本題に入る。
tweetをサーチする
以下のコードを走らせれば、インコの迷子情報を含むtweetをサーチすることができる。
import json,config
from requests_oauthlib import OAuth1Session
ck = config.consumer_key
cs = config.consumer_secret
at = config.access_token
ats = config.access_token_secret
twitter = OAuth1Session(ck, cs, at, ats) #OAuth認証処理
url = 'https://api.twitter.com/1.1/search/tweets.json' #tweetサーチのエンドポイント指定
params = {'q' : 'インコ 迷子', 'count' : 1} #パラメータ指定
res = twitter.get(url, params = params)
try:
timelines = json.loads(res.text)
timelines = timelines['statuses'][0]
print('Success')
print('*************************************************')
print(timelines['user']['name'] + ':' + timelines['text'])
print(timelines['created_at'])
except:
print(type(json.loads(res.text)))
print('Error')
結果はこんな感じ
できたあ。
Responseを取得するところまでは、前回とほとんど同じなため説明を割愛する。
try-except文以降について以下で説明する。
そもそもtry-except文とは、Exceptionが発生した時に例外処理を行うことができるという構文だ。
使い方は
try:
#Exceptionが発生する可能性はあるが、実行したい処理
except エラー名:
#Exceptionが発生した際に実行したい処理
こんな感じ。便利だねえ。
try-except文を使用した理由は、res.textのデータ型が前回と少し異なり、謎の挙動を示すからだ。
res.text自体はdictなのだが、その下のres.text['statuses']はなぜかlist。さらにその下のres.text['statuses'][0]はdict。
これだけでも腹立つが、サーチ100回に1回程度データ型に関するエラーが発生する。
このように謎の挙動されるのが面倒であり、その原因のデータ型を探りたいため(重力波Detection魂が燃える)、try-except文を用いた。
原因はいまだに特定できていないため、誰か知ってる人教えてくださいお願いします。
まあなんにせよ無事にインコの迷子情報に関するtweetをサーチすることができたのでよしとしよう。
終わりに
今回でインコの迷子情報に関するtweetをサーチすることができたので、次回以降はこの情報を活用した何かを考えていきたいと思う。
インコ救いてえな。マジで。
余談だが、ドイツとスペインが敗退した。クロアチア3位が最も現実的かな。
ありがとうございました。