Twitter APIを使って定期的にツイートをしてくれるbotを作ろうと思ったのだが、Railsの有名なgem “twitter”がv1のAPIしか対応していなかったので、仕方なくtwitter gemを使わずに定期的ツイートをするbotを実装することにした。
API v2をRailsで叩いてツイートする方法がネット上にあまりなかったので、メモとして残しておく。
RailsでTwitter API v2を叩いてツイートする方法
まずはgemファイルに以下の2つを追記し、bundle installする。
#gem gem 'oauth' gem 'typhoeus'
oauthは名前の通り、 OAuth認証を行うためのgem。
Twitter APIを利用する際に、認証情報を扱うために使用する。
typhoeusはHTTPリクエストを行うためのgem。
このコードでは、Twitter APIにリクエストを送る際に使用する。
次に.envファイルに必要な環境変数を埋め込む。
API KEYはTwitter Developerアカウントを作成すると付与される。
# .env TWITTER_API_KEY=xxxxxxxx TWITTER_API_KEY_SECRET=xxxxxxxxx TWITTER_ACCESS_TOKEN=xxxxxxxxx TWITTER_ACCESS_TOKEN_SECRET=xxxxxxxxx
次にツイートをするロジックを以下のように書く。
# twitter.rb class Twitter CREATE_TWEET_ENDPOINT = 'https://api.twitter.com/2/tweets'.freeze class << self def tweet(text:) create_tweet(text:) end private def oauth_params consumer = OAuth::Consumer.new(ENV['TWITTER_API_KEY'], ENV['TWITTER_API_KEY_SECRET'], site: 'https://api.twitter.com', debug_output: false) access_token = OAuth::AccessToken.new(consumer, ENV['TWITTER_ACCESS_TOKEN'], ENV['TWITTER_ACCESS_TOKEN_SECRET']) { consumer:, token: access_token } end def create_tweet(text:) options = { method: :post, headers: { "User-Agent": 'TweetedByAPIV2', "content-type": 'application/json' }, body: { text: }.to_json } request = Typhoeus::Request.new(CREATE_TWEET_ENDPOINT, options) oauth_helper = OAuth::Client::Helper.new(request, oauth_params.merge(request_uri: CREATE_TWEET_ENDPOINT)) request.options[:headers].merge!('Authorization' => oauth_helper.header) request.run end end end
CREATE_TWEET_ENDPOINT = 'https://api.twitter.com/2/tweets'.freeze
CREATE_TWEET_ENDPOINTは、ツイートを作成するためのTwitter APIのエンドポイントのURL。
def tweet(text:) create_tweet(text:) end
def tweet(text:)は、ツイートを作成するためのメソッド。
引数としてツイートの内容を受け取り、create_tweetメソッドを呼び出す。
def oauth_params consumer = OAuth::Consumer.new(ENV['TWITTER_API_KEY'], ENV['TWITTER_API_KEY_SECRET'], site: 'https://api.twitter.com', debug_output: false) access_token = OAuth::AccessToken.new(consumer, ENV['TWITTER_ACCESS_TOKEN'], ENV['TWITTER_ACCESS_TOKEN_SECRET']) { consumer:, token: access_token } end
def oauth_paramsは、OAuth認証に必要な情報を返すメソッド。
APIキー、APIキーシークレット、アクセストークン、アクセストークンシークレットを環境変数から取得し、OAuth::ConsumerとOAuth::AccessTokenオブジェクトを作成する。
これらのオブジェクトは、後でリクエストの認証ヘッダーを生成するために使用される。
def create_tweet(text:) options = { method: :post, headers: { "User-Agent": 'TweetedByAPIV2', "content-type": 'application/json' }, body: { text: }.to_json } request = Typhoeus::Request.new(CREATE_TWEET_ENDPOINT, options) oauth_helper = OAuth::Client::Helper.new(request, oauth_params.merge(request_uri: CREATE_TWEET_ENDPOINT)) request.options[:headers].merge!('Authorization' => oauth_helper.header) request.run end
def create_tweet(text:)は、実際にTwitter APIにリクエストを送信してツイートを作成するメソッド。
ヘッダーとボディに必要な情報を設定し、Typhoeus::Requestオブジェクトを作成する。
次に、oauth_helperを使って認証ヘッダーを生成し、リクエストのヘッダーに追加。
最後に、リクエストを実行してツイートが作成される。
rails cをして、Twitter.tweet(text: “Hello, World”)をしてツイートされていれば成功。
おわり。
<参考>