🤖

Rails × x gemで定期自動ツイートBotの実装

に公開

RailsアプリからTwitter API v2を使い、x gem( https://github.com/sferik/x-ruby ) によるOAuth1.0a認証で定期的に自動ツイートするBotを構築します。
以下では、認証情報の登録からJobの実装、コンソール実行までをシンプルにまとめています。


目次

  1. 認証情報の登録
  2. x gem のインストール
  3. クライアント初期化(X_CLIENT定義)
  4. 自動投稿ジョブの実装
  5. コンソールからの実行方法
  6. 終わりに
  7. Tips by chatGPT

1. 認証情報の登録

  1. developer.x.com にアクセスし、必要情報を登録。
  2. アプリを作成し、以下の4つのキー/トークンを取得してRails Credentialsに追加します。

必要なのはConsumer Keys > API key and secretsと、Atuhentication token > Access and Secretです。

Rails Credentialsに下記の4つを追加します。

EDITOR="vim" rails credentials:edit
x:
  api_key:         <YOUR_API_KEY>
  api_key_secret:  <YOUR_API_KEY_SECRET>
  access_token:    <YOUR_ACCESS_TOKEN>
  access_token_secret:   <YOUR_ACCESS_SECRET>

2. x gem のインストール

Gemfileにxを追加し、bundle installします。

# Gemfile
gem 'x'
bundle install

3. クライアント初期化(X_CLIENT定義)

config/initializers/x.rbで認証済みクライアントを一元定義。

# config/initializers/x.rb
X_CLIENT = X::Client.new(
  api_key:            Rails.application.credentials.dig(:twitter, :api_key),
  api_key_secret:     Rails.application.credentials.dig(:twitter, :api_key_secret),
  access_token:       Rails.application.credentials.dig(:twitter, :access_token),
  access_token_secret:Rails.application.credentials.dig(:twitter, :access_secret)
)

4. 自動投稿ジョブの実装

ApplicationJob を継承したジョブクラスとして定義し、Rails Runner から呼び出せる形にします。

  • 下記は私が運営しているサイトのBotのコードです。
app/jobs/tweet_product_job.rb
class TweetProductJob < ApplicationJob
  queue_as :default

  def perform
    product = Mongoid::Product.published.pick

    text = <<~TEXT.strip
      #{product.name} owned by #{product.user_name} | M4Gミニ四駆ギャラリー \
      https://mini4wg.com/products/#{product.id} #mini4wg
    TEXT

    X_CLIENT.post("tweets", { text: text }.to_json)
  end
end

https://x.com/mini4wg

5. コンソールからの実行方法

Railsコンソールや外部スケジューラから以下を実行すればOKです。

bundle exec rails runner "TweetProductJob.perform_now"
$rails c
TweetProductJob.perform_now
{"data"=>
  {"edit_history_tweet_ids"=>["1920135794779648375"],
   "id"=>"1920135794779648375",
   "text"=>"エアロアmk2ショット Ver.Title owned by kazenotani_39 | M4Gミニ四駆ギャラリー https://t.co/gMEQN1h60u #mini4wg"}}

6. 終わりに

以前の Twitter gem( https://github.com/sferik/twitter-ruby )で動かなくなっていたので、急遽実装が必要になり実装しました。情報がまとまっているので比較的スムーズに実装することができました。需要が少ないかもしれませんがメモとして残しておきます。

7. Tips by chatGPT

  • X_CLIENTをイニシャライザで定義する理由

    • クライアント設定を一箇所にまとめることで、キーの管理ミスを防ぎつつ、アプリケーション全体で同じインスタンスを使い回せます。
    • Rails起動時に設定のロードを確認でき、未登録の環境変数やCredentials漏れを早期に検知できます。
  • ジョブクラス(ApplicationJob)にしておくメリット

    • perform_now/perform_later を使って同期/非同期どちらの実行にも対応可能です。
    • テスト時はジョブ単体を呼び出してモックやスタブを組みやすく、実際のAPI呼び出し部分だけを切り離して検証できます。
    • 将来的にSidekiqなどのバックグラウンド処理基盤へ移行する際、コードの変更箇所を最小限に抑えられます。

Discussion