🐦

RubyでTwitter API v2を叩けるgemをつくりました

2021/12/01に公開

本稿はRubyアドベントカレンダー2021-2の1日目の記事です。

今年の3月に作ったsimple_twitterというgemの紹介をします。

https://github.com/yhara/simple_twitter

simple_twitter gemとは

Twitter APIのクライアントです。twitter gemと比較して、

  • Twitter API v1/v2に両対応している
  • 極めて薄いラッパーである

という特徴があります。

Twitter API v2

TwitterのAPIには長らく使われてきたv1と、新しく作られたv2の2種類が存在します。v2はhome_timelineがTODOになっているなど、まだv1と完全互換ではないのですが、逆にツイートによって「v1だと添付ファイルがないように見えるのに、v2だと画像が取得できる」というケースがあるので、基本的にはv2のAPIをまず探すのがよいと思います。

利用には無料の登録申請が必要です。

薄いラッパーである

twitter gemには大量のクラスがあり、Twitter APIの使い方に加えてこのgemの使い方を調べる必要があります。simple_twitterは「URLを受け取って、JSONを返す」という必要最低限の処理に絞っているので、なんとライブラリ全体で100行を切っています

このため、最初にREADMEを見て認証のやり方がわかれば、あとはTwitter API v2のリファレンスだけ見ればプログラムが書けるようになっています。

また薄いラッパーであるおかげで、特に頑張らなくてもTwitter API v1とv2に両対応できています。前述のようにv1とv2は操作ごとに使い分ける必要があるのが現状なので、ひとつのgemで両方使えることは重要です。

例:ブックマークの取得

今回はサンプルとして、自分のブックマークしたツイートを取得するプログラムを書いてみます。

0. 準備

下記のプログラムを動かすには以下が必要です(本稿では説明を省略します)。

  • Rubyのインストール
  • gemのインストール(gem install simple_twitter)
  • Twitter API v2への開発者登録

1. APIを調べる

まずは、どのAPIを使えばよさそうかをリファレンスを見て調べます。/bookmarksとかで取れたりしないかな……あれ、無さそう?bookmarkで検索してみるか。

did not match any results

おいおい。

「twitter bookmarks api」でgoogle検索したところ、下記のページが見つかりました。うーん、一覧にはないけど仮のものはあるってことかな。仕方ない、ちょっと変則的だけどこれを使ってみることにします。

2. 認証する

Twitter API v2は「公開ツイートの情報を取得する」などユーザによらない操作に関してはbearer_tokenでの認証、「ツイートを投稿する」などユーザに依存する操作に関してはOAuthでの認証となっています。今回は「自分のブックマーク」なので後者ですね。

READMEに例がありますが、自分のアプリに自分でログインする場合、Twitter Developer Portalから必要な情報をすべて取得できます。以下の...の部分にそれぞれ記入してください。

client = SimpleTwitter::Client.new(
  api_key: "...",
  api_secret_key: "...",
  access_token: "...",
  access_token_secret: "...",
)
pp client.get("https://api.twitter.com/1.1/statuses/home_timeline.json")

上記を実行して、自分のタイムラインの情報がJSONで取得できれば成功です。

3. ブックマークの情報を取得する

あとはURLをさっきのAPIに置き換えて…

pp client.get("https://api.twitter.com/2/timeline/bookmark.json")
{:errors=>[{:code=>200, :message=>"Forbidden."}]}

ん?動かんのやが、、

オチ

Bookmarks APIは一応チケットはあるものの1年以上放置されており、その間にTwitter本体の実装も変化していたようです。

graphql

そう、GraphQLに。

まあTwitterくらい複雑な画面だとGraphQLが活きますよね、それはわかる…わかるが…、もはや内部用のREST APIすら無いとなると、今後Twitter API v2に/bookmarksが生えるのは期待薄かもしれません。

そういうわけで、いささか中途半端な結果となりましたがsimple_twitter gemの紹介はできたということで今回はこれで終わりとします。

Discussion