Ruby on RailsでX(旧Twitter) API v2を叩いてツイートする

2024/07/23に公開

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”)をしてツイートされていれば成功。
おわり。

<参考>
https://github.com/xdevplatform/Twitter-API-v2-sample-code

Discussion