LoginSignup
4
9

More than 3 years have passed since last update.

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

Posted at

自己紹介

プログラミングスクールDMMWEBCAMPを卒業し、物流×ITの自社開発企業でWebエンジニアをしておりますyukiと申します。
現在5ヶ月目に突入しました。

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

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

読むとわかること

こちらのアプリを作った際に、任意のハッシュタグ付きのツイートを収集する必要があったので、記事としてまとめてみました。本記事を読むと、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を叩くリクエストのコードを書こう!という気持ちですが、そのまま叩きに行くとクライアントの情報がないためにエラーが出ます。
叩きに行く際に、クライアントの情報を持っていけるようにしておきましょう。
こんな感じにしてみました。

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を検索します。検索結果はrecenttake(5)つまり、新しいもの順で上から5件、そしてそれを集めて変数に入れます。

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

tips

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

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

4
9
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
4
9