生活を良くします - 怠惰なプログラミング

生活を良くします-怠惰なプログラミング

外資系でエンジニアをやっています。便利なサービスや商品、プログラミングで作ったものなどを紹介していきます

PythonでTwitter APIにアクセスしタイムラインをキーワードで検索・取得 〜 認証エラーやAPIについて

Twitter API

登録方法について

Twitter APIは使ったことがないので主にこちらの記事を参考にしてやっていきました。しかし、自分の場合はうまくいかないところがあったのでそこらへんについてのデバッグ記録?を書いていきます。

それなりの失敗の回数を積みかせねてやっとうまくいきました。

syncer.jp


アプリケーションの登録

下記のURLからtwitterでのアプリケーションを登録するところから始めました。

https://apps.twitter.com/app/new


f:id:what_a_day:20170120223039p:plain:w600

Nameはこのアプリケーションの名前で、Descriptionはそのアプリケーションの説明です。だいたい適当に書いても大丈夫ですが、Descriptionは最低字数が決まっているので10文字以上書いておきましょう。何回か繰り返した中で毎回引っかかりました。

WebsiteとかCallbackURLも適当で大丈夫です。しかし、CallbackURLを空欄にしておくとエラーが発生するらしいという情報がネット上で無数にあったのでそれっぽく埋めました。

URL形式ならなんでも大丈夫みたいです。

<!-- callbackURL 入力例 -->
http://127.0.0.1:8080

ちなみにこのURLは適当です。localhost:8080が使えなかったので確かこんな感じだったくらいで入力しました。入力は必須ではないしそこまで重要そうに見えないのですが、どうも動作がやや不安定らしいです。

これでアプリケーションの登録は終了です。

認証方法について

アクセストークンなどの生成

ユーザー認証に必要なものを生成していきます。

下記のURLへ飛ぶとさっき作ったアプリケーションができているはずです。そこからKeys&Access Tokensという設定のところに飛びます。

https://apps.twitter.com/

そこでCreate my Access Tokensと書かれているボタンを押せばアクセストークンなどが生成されます。

f:id:what_a_day:20170120224528j:plain:w700

認証方法

ここで色々と詰まってしまったので解決策らしきものを書きます。認証ができていないままTwitter APIにアクセスしてもエラーコード:401を返されて終わります。

twurlを使った認証方法を行いました。ターミナルから行います。

$ sudo gem install twurl
$ twurl authorize --consumer-key key       \
                    --consumer-secret secret

gemでtwurlをインストールし、twurlでauthorizeします。


ちなみに鍵付きのツイッターアカウントの場合はそのアカウントのパスワードも入力する必要があるみたいです。

$ twurl authorize -u username -p password  \
                    --consumer-key key       \
                    --consumer-secret secret

先ほどのKeys&Access Tokensという設定のところにconsumer-key と consumer-secretが書かれています。数字と英単語の文字列のやつです。

それを適宜keyやsecretでのところに置き換えます。

//入力例
$ twurl authorize --consumer-key aaabbbccc111222...       \
                    --consumer-secret bbbccc333000aa....
//出力例
Go to https://api.twitter.com/oauth/authorize?oauth_consumer_key=......
.....
and paste in the supplied PIN
000000
Authorization successful

文字が詰まったものが結果として返ってくるので少し戸惑いますが、Go to から and pasteの部分までのURLをコピーして飛びます。

そこではPINが要求されているのでand paste in the supplied PINの後の部分の数字がPINなのでそれを打ち込んであげましょう。今回は00000にしていますが、適宜変わった数字が出てくるはずです。

これで認証は無事に終了しました。もう使えるようになっているはずです。

詳しいことはこちらに書いてあります。

GitHub - twitter/twurl: OAuth-enabled curl for the Twitter API

Twitter APIを使ってみるサンプル

f:id:what_a_day:20170120233145p:plain

こちらを参考にしました。

Python で Twitter API にアクセス - Qiita

認証に使うライブラリをインストールしてみます。

pip3 install requests requests_oauthlib


これで検索ができるようになりました。アニメという単語が含まれているツイートを見つけてきてくれます。オプションの項目で日本時間の2017-01-19までのツイートを拾ってくるように設定してあります。


from requests_oauthlib import OAuth1Session
import json
import datetime,time,sys

consumerKey = 'aaaannnnnnbbbbbb'
consumerSecret = 'aaaannnnnnbbbbbb'
accessToken = 'aaaannnnnnbbbbbb38880-aaaannnnnnbbbbbb'
accessTokenSecret = 'aaaannnnnnbbbbbb'

session = OAuth1Session(consumerKey,consumerSecret,accessToken,accessTokenSecret)

url = 'https://api.twitter.com/1.1/search/tweets.json'
res = session.get(url, params = {'q':u'#アニメ', 'count':100,'until':'2017-01-19_JST'})

res_text = json.loads(res.text)

count_number = 0

for tweet in res_text['statuses']:
    count_number = count_number + 1
    print(str(tweet['id'] )+ ' num= '+ str(count_number).zfill(3) + ' ' +str(tweet['created_at']))
    print (tweet['text'])

OAuth 1 Workflow — Requests-OAuthlib 0.7.0 documentation

TEST OAuthで「このページは存在しません。」

認証が無事に終了したはずなのでちょっと確認してみようと思ってTEST OAuthを押してみたのですが、何度やっても「このページは存在しません。」と返されてしまいます。

色々と調べたのですが、特に解決策は見つからず2017/1/20ではもう動いていないんだろうと勝手に結論づけました。

Twitter APIの制限など

アクセス回数の制限

一度に取得できるツイート数は100件までと厳しくなっています。無料で使えるだけでありがたいのですが、やはり100件だとちょっと大変です。

取得できる期間・遡れる期間

過去は一週間までさかのぼって取得できるようです。

時間指定

パラメータのuntilを使うことでこの日までという設定は可能になっていますが、sinceが見つかりません。

この日からこの日までという設定をしたかったのですが、それは今のところやり方はわかっていません。

あとはキーワードによって検索の精度がやや異なっている?ので時間指定が間違っているのかどうか判定がつきにくい場合が多々ありました。

使えるパラメータについて

GET search/tweets — Twitter Developers

まとめ

  • アニメなどのツイート数を時間ごとに分けて取得しようと思っていたがなんとなく制限的に難しそうというのがわかった
  • 結構変なところで詰まっていた