Ruby on RailsでX(旧Twitter) API v2を叩いてツイートする
X(旧Twitter)APIを使って定期的にツイートをしてくれるbotを作ろうと思ったのだが、Railsの有名なgem “twitter”がv1のAPIしか対応していなかったので、仕方なくtwitter gemを使わずに定期的ツイートをするbotを実装することにした。
API v2をRailsで叩いてツイートする方法がネット上にあまりなかったので、メモとして残しておく。
RailsでTwitter API v2を叩いてツイートする方法
まずはgemファイルに以下の2つを追記し、bundle installする。
# Gemfile
gem 'oauth'
gem 'typhoeus'
oauthは名前の通り、 OAuth認証を行うためのgem。
X(旧Twitter)APIを利用する際に、認証情報を扱うために使用する。
typhoeusはHTTPリクエストを行うためのgem。
このコードでは、X(旧Twitter)APIにリクエストを送る際に使用する。
次に.envファイルに必要な環境変数を埋め込む。
API KEYはX 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は、ツイートを作成するためのX(旧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:)は、実際にX(旧Twitter)APIにリクエストを送信してツイートを作成するメソッド。
ヘッダーとボディに必要な情報を設定し、Typhoeus::Requestオブジェクトを作成する。
次に、oauth_helperを使って認証ヘッダーを生成し、リクエストのヘッダーに追加。
最後に、リクエストを実行してツイートが作成される。
rails cをして、Twitter.tweet(text: “Hello, World”)をしてツイートされていれば成功。
おわり。
<参考>
Discussion