Ruby on RailsでTwitter API v2を叩いてツイートする | Tomoyuki Kato's Blog

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

Engineering
この記事を書いた人

PharmaXというオンライン薬局のスタートアップで薬剤師・エンジニアとして働いています。Rails・React・TypeScriptなどを書きます。英語が得意でTOEIC900点・通訳案内士資格取得。主に薬剤師の働き方やプログラミング、英語学習について書きます。当サイトではアフィリエイトプログラムを利用して商品を紹介しています。
>> 詳しいプロフィール

Tomoyuki Katoをフォローする

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

おわり。

 

<参考>

GitHub - twitterdev/Twitter-API-v2-sample-code: Sample code for the Twitter API v2 endpoints
Sample code for the Twitter API v2 endpoints. Contribute to twitterdev/Twitter-API-v2-sample-code development by creating an account on GitHub.
タイトルとURLをコピーしました