【Rails】 Twitter API を使用してツイートを取得する方法 (特定のアカウントのツイートの検索も)


# 目標
Twitter APIを使用して特定のアカウントのツイートを取得しDBに保存したい。
また取得したツイートの中に、特定のタグをが含まれているツイートのみを取得することを条件とする

# 前提
Rails 5.2.6
ruby 2.6.6
Article model作成済み
Articleのインスタンスにツイートの内容を格納させて保存したい

# Twitter APIとは
>TwitterのAPIプラットフォームは、プロバイダユーザーが世界で共有する設定にしている一般のTwitterデータへの広範囲でのアクセスを提供します。APIによってユーザーが非公開のTwitter情報（ダイレクトメッセージなど）を管理できるようにし、またこの情報を、許可した開発者に提供するようにもします。

詳しくは [TwitterAPI](https://help.twitter.com/ja/rules-and-policies/twitter-api)

# Twitterアカウント申請
私の場合、1日で承認された!
長くなるので参考にさせていただいたサイトはこちら
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2019年8月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

# Twitter　APIキーをコードに組み込む
人に見られないように私は.envファイルに入力する形にした。
それぞれ記入する。

```ruby:.env
CONSUMER_KEY="取得したキー"
CONSUMER_SECRET="取得したキー"
ACCESS_TOKEN="取得したキー"
ACCESS_SECRET="取得したキー"
```

.gitignore　に /.envを入力することも忘れないようにする
push時に一緒にされないように!

```ruby:.gitignore
/.env
```

# キーを使用してコードを作成していく
.envファイルからキーを引っ張ってくる。
これで認証ができるので検索が可能になる:)

```ruby:article.rb
Twitter::REST::Client.new do |config|
      config.consumer_key        = ENV["CONSUMER_KEY"]
      config.consumer_secret     = ENV["CONSUMER_SECRET"]
      config.access_token        = ENV["ACCESS_TOKEN"]
      config.access_token_secret = ENV["ACCESS_SECRET"]
    end
```

例えばターミナルで

```
irb(main):007:0>client = Twitter::REST::Client.new do |config|
      config.consumer_key        = ENV["CONSUMER_KEY"]
      config.consumer_secret     = ENV["CONSUMER_SECRET"]
      config.access_token        = ENV["ACCESS_TOKEN"]
      config.access_token_secret = ENV["ACCESS_SECRET"]
    end
```
と認証させれば下のように検索できる

```
irb(main):008:0>client.search("松本潤",count: 1, result_type: "recent")

=> #<Twitter::SearchResults〜結果がここに続くが長いため省略
```

# 特定のアカウントのツイートのみを取得できるようにする
**user_timeline**メソッドを使用する


**user_id**(対象ユーザーのユーザーID) または
**screen_name**(対象ユーザーのスクリーンネーム)が必要になる

ユーザー自身でスクリーンネームは変更することができるがユーザーIDは変更することができないので今回はユーザーIDを使用した。後々コードを変更する手間がないように。

[GET statuses/user_timeline - ユーザータイムラインを取得する](https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/user_timeline/)


```ruby:article.rb
  # 指定したidのアカウントのツイート検索
  def search(id)
    @tweets = twitter_client.user_timeline(user_id: id, count: 1, exclude_replies: false, include_rts: false, contributor_details: false, result_type: "recent", locale: "ja", tweet_mode: "extended")
  end
```
この引数の**id**に**ユーザーID**を持ってきて検索をかけると**count:**で指定している数のツイートを取得することができる。


# Article model
このような形になる

```ruby:article.rb
# Twitterclient
  def twitter_client
    Twitter::REST::Client.new do |config|
      config.consumer_key        = ENV["CONSUMER_KEY"]
      config.consumer_secret     = ENV["CONSUMER_SECRET"]
      config.access_token        = ENV["ACCESS_TOKEN"]
      config.access_token_secret = ENV["ACCESS_SECRET"]
    end
  end

  # 指定したidのアカウントのツイート検索
  def search(id)
    @tweets = twitter_client.user_timeline(user_id: id, count: 1, exclude_replies: false, include_rts: false, contributor_details: false, result_type: "recent", locale: "ja", tweet_mode: "extended")
  end
```

検索したツイートの内容の中に特定のタグが含まれているか判断するメソッドも作成する

```ruby:article.rb
# 検索したツイートが関連のものであるか判断
  def set_article(tag)
    @for_article_tweets = []
    @tweets.each do |tweet|
      @for_article_tweets << tweet if tag.any?{|t| tweet.text.include?(t)}
    end
  end
```
含まれていてほしいタグや言葉を(tag)引数に追加し使用する