目標
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ファイルに入力する形にした。
それぞれ記入する。
CONSUMER_KEY="取得したキー"
CONSUMER_SECRET="取得したキー"
ACCESS_TOKEN="取得したキー"
ACCESS_SECRET="取得したキー"
.gitignore に /.envを入力することも忘れないようにする
push時に一緒にされないように!
/.env
キーを使用してコードを作成していく
.envファイルからキーを引っ張ってくる。
これで認証ができるので検索が可能になる:)
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 - ユーザータイムラインを取得する
# 指定した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
このような形になる
# 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
検索したツイートの内容の中に特定のタグが含まれているか判断するメソッドも作成する
# 検索したツイートが関連のものであるか判断
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)引数に追加し使用する