自己紹介
プログラミングスクールDMMWEBCAMPを卒業し、物流×ITの自社開発企業でWebエンジニアをしておりますyukiと申します。
現在5ヶ月目に突入しました。
こんな記事も書いています。
[2020/06/24 06:00] トレンド7位
— Qiita:Trend (@QiitaTrend) June 23, 2020
【卒業生】DMMWEBCAMPに通おうか迷っている人に伝えたい事 by yuki_snow1823 https://t.co/gpqJoV6930
現在は、勉強会の主催や副業として同校のメンター、簡単なプログラミングの家庭教師、趣味としてチームでサービス開発などをしています。
読むとわかること
こちらのアプリを作った際に、任意のハッシュタグ付きのツイートを収集する必要があったので、記事としてまとめてみました。本記事を読むと、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を叩くリクエストのコードを書こう!という気持ちですが、そのまま叩きに行くとクライアントの情報がないためにエラーが出ます。
叩きに行く際に、クライアントの情報を持っていけるようにしておきましょう。
こんな感じにしてみました。
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などに切り出して、毎回呼ばれるようにしています。
実際に収集している記述
まずはコードです。
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のハッシュタグ収集ウィジェットみたいなのが作れますよ。
参考
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