3
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-10-06

目標

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

前提

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

Twitter APIとは

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

詳しくは TwitterAPI

Twitterアカウント申請

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

Twitter APIキーをコードに組み込む

人に見られないように私は.envファイルに入力する形にした。
それぞれ記入する。

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

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

.gitignore
/.env

キーを使用してコードを作成していく

.envファイルからキーを引っ張ってくる。
これで認証ができるので検索が可能になる:)

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 - ユーザータイムラインを取得する

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

このような形になる

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

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

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)引数に追加し使用する

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3