【Rails×TwitterAPI】任意のハッシュタグがついたツイートを集める

# 自己紹介
プログラミングスクールDMMWEBCAMPを卒業し、[物流×ITの自社開発企業](https://www.dialog-inc.com/)でWebエンジニアをしております[yuki](https://twitter.com/yuki82511988)と申します。
現在5ヶ月目に突入しました。

こんな記事も書いています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">[2020/06/24 06:00] トレンド7位<br>【卒業生】DMMWEBCAMPに通おうか迷っている人に伝えたい事 by yuki_snow1823 <a href="https://t.co/gpqJoV6930">https://t.co/gpqJoV6930</a></p>&mdash; Qiita:Trend (@QiitaTrend) <a href="https://twitter.com/QiitaTrend/status/1275534279125032960?ref_src=twsrc%5Etfw">June 23, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現在は、勉強会の主催や副業として同校のメンター、簡単なプログラミングの家庭教師、趣味としてチームでサービス開発などをしています。

## 読むとわかること
こちらの[アプリ](https://github.com/yuki-snow1823/project-saya)を作った際に、任意のハッシュタグ付きのツイートを収集する必要があったので、記事としてまとめてみました。本記事を読むと、Railsを使ってハッシュタグ付きのツイートを集めることができます。

### Twitterのデベロッパーとして登録する
まず、そもそもTwitterのAPIを触らせてもらうために、承認してもらう必要があります。

私は以下の記事を参考に行いました。
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

英語はそんなに得意ではないので、日本語のメール+Google翻訳とチャット手直しした英語のテキストを送り、3回ほどメールでやりとりしたのち、申請から4日ほどで承認されました。早い方だと思うのですが、「危険なことをしない」「趣味として使うだけ」「収益をあげない」このポイントを押したら許可していただけたように思います。

### デベロッパーのページから、APIを叩く際のクライアントとして必要な情報を発行、コピーする
無事認証にされましたら、デベロッパーのページからAPIを叩く際に必要な情報（あとで.envとかに置きます）を取りに行きましょう。
登録ができていれば、https://developer.twitter.com/en/portal/dashboard のページの、自分のアプリ名を押し、`Keys and Tokens`という場所をクリックすれば表示されます。

- API Key
- API Secret Key
- Access Token
- Access Token Secret

以上の4つです。あとで任意の名前で.envに入れておいてください。

### APIを叩く際に、クライアントのインスタンスを作成する
さて必要な情報も揃ったし、APIを叩くリクエストのコードを書こう！という気持ちですが、そのまま叩きに行くとクライアントの情報がないためにエラーが出ます。
叩きに行く際に、クライアントの情報を持っていけるようにしておきましょう。
こんな感じにしてみました。

```ruby:twitter_service.rb
module TwitterService
  extend ActiveSupport::Concern
  class Authorization
    def self.init
      client = Twitter::REST::Client.new do |config|
        config.consumer_key        = ENV["API_KEY"]
        config.consumer_secret     = ENV["API_SECRET"]
        config.access_token        = ENV["ACCESS_TOKEN"]
        config.access_token_secret = ENV["ACCESS_TOKEN_SECRET"]
      end
      return client
    end
  end
end 
```
これをconcernなどに切り出して、毎回呼ばれるようにしています。

### 実際に収集している記述
まずはコードです。
```ruby:twitter_controller.rb
  include TwitterService
  
  def show
    client = Authorization.init

    data = client.search("#プログラミング", result_type: "recent").take(5).collect do |tweet|
      {
        "image": "#{tweet.user.profile_image_url.to_s.sub('http', 'https')}",
        "name": "#{tweet.user.name}",
        "text": "#{tweet.full_text}",
        "tweet_link": "#{tweet.uri}"
      }
    end
    render json: {tweet: data}
  end
```

解説します。
`client = Authorization.init`
さっきのクライアント情報を呼び出します。APIを叩く許可ですね。

`data = client.search("#プログラミング", result_type: "recent").take(5).collect do |tweet|`
クライアントの情報を生かして、tweetを検索します。検索結果は`recent`で`take(5)`つまり、新しいもの順で上から5件、そしてそれを集めて変数に入れます。

`"image": "#{tweet.user.profile_image_url.to_s.sub('http', 'https')}",`などの情報
tweetのなかの取得できる情報はいくつかあるのですが、imageやnameと言ったものを収集してフロントに渡したいので、このように取得しています。
こうやって取得すれば、依然廃止されてしまったtwitterのハッシュタグ収集ウィジェットみたいなのが作れますよ。
[参考](https://www.shibuya-office.co.jp/blog/2018/03/twitter.html)

### tips
`.to_s.sub('http', 'https')`の部分ですが、フロントに渡すimageのurlがhttpだと、https通信をしているサイトでも、まれに安全なページではないという警告が出ます。
改善のために、urlのhttpという文字をhttpsにしています。これでも画像はちゃんと表示されます。（根本的な解決になっているかは不明）

実装の際に調べつつやって苦労したのでまとめてみました。
詳しくは、ちゃんとTwitter APIとgemのドキュメントを読んでください！

- twitter apiのドキュメント
https://developer.twitter.com/ja/docs

- gem twitterの日本語版簡易ドキュメント
https://sites.google.com/site/gyakuhikiruby/home/twitter-gem