RubyでTwitter APIを利用してみた

### 導入
アイドルが好きで、特定のユーザーのツイートであったり、ツイートをいいねしてくれたユーザー情報を、スクリプトで取得できたらアイドルヲタク活動が少し充実するなと思ったので色々調べてみました。

### 流れ
1. twitterAPIを利用できるようにする
2. 必要な情報を集めるてソースコードを書いてみる
3. 実行してみた
4. おまけ

### 1. twitter_apiを利用できるようにする

僕は以下記事を参照にtwitterAPI登録を行いました。
一番躓いたのは、twitterAPI用に作成したtwitterアカウントに、携帯の電話番号を登録しなければいけないところです。

別のアカウントで既に携帯番号が登録されたうえに、もう利用できないアカウントだったため、他に利用できる携帯番号を取得するハメになりました。
ロケットモバイルというところで月300円ほどでsimと携帯番号を買ったのですが、知り合い曰く使用頻度によってはタダで利用できるところもあるらしく無駄な出費をしてしまいました。

https://qiita.com/kngsym2018/items/2524d21455aac111cdee

### 2. 必要な情報を集めるてソースコードを書いてみる
推しメンである`小野寺梓@真っ白なキャンバス`さんのtweetを取得してみます。かわいいですね。

https://twitter.com/azusa_shirokyan/status/1546014927730511872?s=20&t=OhU6gQstwi7sUfQutOtvww




 
 

APIを利用する場合、第3者の記事を探しに行くより、公式ドキュメントの方がわかりやすいので公式ドキュメントを探しましょう。(記事末にリンクあり)

公式ドキュメントとソースを読んだところ、下記コードで指定したユーザーのツイートは取得できるとのことです。


`bearer_token`と`twitter_user_id`は、各自対応が必要なため、下に詳細を記載しました。

```tweet.rb
require 'json'
require 'typhoeus'

##### bearer_token
bearer_token = '開発者が取得する箇所'
endpoint_url = "https://api.twitter.com/2/users/:id/tweets"

##### twitter_user_id. 
id = "921652870461538305"

query_params = {
  "max_results" => 5,
  "user.fields" => "description"
}

def get_user_tweets(url, bearer_token, query_params)
  options = {
    method: 'get',
    headers: {
      "User-Agent" => "v2RubyExampleCode",
      "Authorization" => "Bearer #{bearer_token}"
    },
    params: query_params
  }

  request = Typhoeus::Request.new(url, options)
  response = request.run

  return response
end

endpoint_url = endpoint_url.gsub(':id',id.to_s())

response = get_user_tweets(endpoint_url, bearer_token, query_params)
puts response.code, JSON.pretty_generate(JSON.parse(response.body))
```

#### bearer_token
`bearer_token = '開発者が取得する箇所'`の箇所は、下記画像赤枠の箇所から値を生成し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264678/534b82d7-5e32-152d-47de-f677f9b78744.png)

以下コマンドの`CONSUMER_KEYを入力:CONSUMER_SECRETを入力`を書き換えて実行すれば、生成されます。

```
curl -u "CONSUMER_KEYを入力:CONSUMER_SECRETを入力" \
  --data 'grant_type=client_credentials' \
  'https://api.twitter.com/oauth2/token'
```

#### twitter_user_id
twitterログイン時のIDのことを指していると勘違いしており、`azusa_shirokyan`で実行していたのですが、400エラーが返ってきてしまったため調べてみたところ、twitterログインのIDは正式には`ユーザー名`でした。下記サイトなどでユーザー名からIDを特定しましょう。

https://idtwi.com/



### 3. 実行してみた

スクリプト結果と実際のtwitter画面を比較しても、ツイート内容がしっかり取れてることが確認できます。
今回は`query_params`に`description`しか指定しなかったためツイート内容しかありませんが、公式ドキュメントをみて各々欲しいデータを取得してみてください!!

```スクリプト結果.rb
-> % ruby twitter_test.rb
200
{
  "data": [
    {
      "id": "1568600756131098627",
      "text": "今日寝たらあと4日間おうちで寝れないからぐっすりねむる&gt;&lt;おやすみー！"
    },
    {
      "id": "1568591391986716678",
      "text": "RT @info_shirokyan: 【明日！】\n\n9月11日（日）\n恵比寿リキッドルームにて開催する『ギュウ農フェス  THE FACTORY』\n\n白キャンは17:25から出演します！\n\nたくさんのご来場お待ちしております🎨\n\nhttps://t.co/pWA4p1tg8x…"
    },
    {
      "id": "1568591347032158209",
      "text": "RT @info_shirokyan: 【受付開始！】\n\n9月25日(日)\n『白キャンとファンミ！』\n\nファンミ限定ライブや来場者との交流企画も実施🎉\n\nただ今よりオンラインサロン先行受付開始🎫\n\n白キャンイベントが初めての方もぜひお気軽にお越しください🎨\n\nhttps://t…"
    },
    {
      "id": "1568576630339301377",
      "text": "デートだから大人っぽくしてきたよ！ https://t.co/T2RgAEyAcw"
    },
    {
      "id": "1568530379665211392",
      "text": "Appare!さんとのツーマンライブありがとうございました✨またすぐやりたいなー！次は楽曲交換やりたい…！ https://t.co/3KRZJCzSBI"
    }
  ],
  "meta": {
    "next_token": "7140dibdnow9c7btw4232y709s4te793j1fou5arj1jqq",
    "result_count": 5,
    "newest_id": "1568600756131098627",
    "oldest_id": "1568530379665211392"
  }
}
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264678/e4fdbeca-9c34-e62e-54f7-9bde63a545bb.png)


### 4. おまけ
同じ要領で指定したツイートに対する言い値を押したユーザー情報を取得するスクリプトです。
エンドポイントを色々調べてみると、できることが結構あるので楽しいです!

``` 指定したtweetのIDからいいねを押した人のデータを取得できる.rb
require 'json'
require 'typhoeus'

bearer_token = '開発者が取得する箇所'
id = "指定したtweetのID"

url = "https://api.twitter.com/2/tweets/#{id}/liking_users"

params = {
  "tweet.fields": "attachments,author_id,context_annotations,conversation_id,created_at,entities,geo,id,in_reply_to_user_id,lang,non_public_metrics,public_metrics,organic_metrics,promoted_metrics,possibly_sensitive,referenced_tweets,reply_settings,source,text,withheld",
  "user.fields": "created_at,description,entities,id,location,name,pinned_tweet_id,profile_image_url,protected",
}

def liking_users(url, bearer_token, params)
  options = {
    method: 'get',
    headers: {
      "User-Agent": "v2LikingUsersRuby",
      "Authorization": "Bearer #{bearer_token}"
    },
    params: params
  }

  request = Typhoeus::Request.new(url, options)
  response = request.run

  return response
end

response = liking_users(url, bearer_token, params)
puts response.code, JSON.pretty_generate(JSON.parse(response.body))
```



公式ソースコード

https://github.com/twitterdev/Twitter-API-v2-sample-code/blob/1fd23117345cd1dc3e75c7d69efae994e929c279/User-Tweet-Timeline/user-tweets.rb

公式ドキュメント

https://developer.twitter.com/en/docs/twitter-api/tweets/timelines/api-reference/get-users-id-tweets#tab0