TL;DR
twitterアカウント名を指定して、ツイート一覧を取得してきてくれるgemを作りました。
作った経緯
ツイッターAPIのクライアントライブラリは各言語で充実していて、ツイッターのAPIを叩く時はライブラリを使うのが通常だろう。
しかし今回自分のユースケースでは、単純にユーザを指定してツイート一覧を取得したいだけだったので、外部のライブラリを利用するのはtoo muchな気がした。と言うことで、ライブラリを使わずapplication only authenticationと呼ばれる認可方式を生で使ってツイッターのAPIを叩いてみたのだがその時のメモ。
Client Credentials Grant
その前に少し、ツイッターのapplication only authenticationについて説明。これは、OAuth2で言うところのClient Credentials Grantに当たる.
OAuth2では認可方式がいくつかあって、意味合い的には
- ユーザだけの認証 (Implicit grant)
- アプリケーションだけの認証 (Client Credentials Grant)
- ユーザとアプリケーション両方の認証 (Authorization Code Grant)
と言う風に、認可(=~access token)を要求してきた相手が誰であるかをどこまで確認するかによって、access tokenが発行されるまでの流れが違ったり発行されるaccess tokenの権限が違ったりする。
で、APIを叩く側のアプリケーション開発者から見た場合、Client Credentials Grantが手続きとしては最も簡単。これはAPIを叩く時にいわゆるツイッター連携許可をユーザに求める必要がないため。
application only authentication
ツイッターのAPIは、Client Credentials Grantによる認可のみOAuth2に対応していて、これのことをapplication only authenticationと呼んでいるようだ。(https://dev.twitter.com/oauth/application-only)
この認可方式だと認可がユーザアカウントに紐付いていないので、ツイートを行うなどいわゆる書き込み系のエンドポイント叩くことはできない。しかし、今回やりたかったツイート一の覧取得などの読み込み系のエンドポイントを叩くことは可能。
API呼び出しの流れ
-
ツイッター develoer siteでアプリケーションのAPI KeyとAPI Secretをゲット
上記のKeyとSecretをAuthorization Headerに仕込んで、ツイッターのtoken endpointを叩き、access tokenを取得.
今度は2. で取得したaccess tokenをAuthorization Headerに仕込んで、叩きたいエンドポイント(今回はuesr_timelineのエンドポイント)を叩く
おしまい。とても簡単。
やってみた
上記の処理をgemにしてみた。CSVフォーマットでツイートを取得してきてくれる。
cli-twitter-application-only-authentication
実行例
以下の例ではtwitter japanの公式アカウントのツイートを収集している.
# get access token (only once)
bundle exec app_auth_twitter_reader --key=`cat ./api_key` --secret=`cat ./api_secret` > ./access_token
# get user timeline using the access token.
bundle exec app_auth_twitter_reader --token=`cat ./access_token` --screen_name twitterjp
## output(csv)
created_at,text,favorite_count,retweet_count
Sat May 21 02:51:39 +0000 2016,"RT @B_LEAGUE: 昨日は #BリーグVine DAYでした!
B.LEAGUEクラブによるクリエイティブな6秒動画はVineでチャンネル化されました!Twitterではコチラでご覧ください!
https://t.co/oxnQmOH25x
#Bリーグ https://…",0,10
Fri May 20 08:01:10 +0000 2016,"少しでも誰かのためになることを、という考えで世界各地のTwitterオフィスが定期的な金曜日にボランティア活動を行う #FridayForGood 。日本では5つの活動を行いました。
https://t.co/jMfP2M1r3N https://t.co/soN2g1E8fj",74,53
...