🤖
Rails × x gemで定期自動ツイートBotの実装
RailsアプリからTwitter API v2を使い、x
gem( https://github.com/sferik/x-ruby ) によるOAuth1.0a認証で定期的に自動ツイートするBotを構築します。
以下では、認証情報の登録からJobの実装、コンソール実行までをシンプルにまとめています。
目次
- 認証情報の登録
- x gem のインストール
- クライアント初期化(X_CLIENT定義)
- 自動投稿ジョブの実装
- コンソールからの実行方法
- 終わりに
- Tips by chatGPT
1. 認証情報の登録
- developer.x.com にアクセスし、必要情報を登録。
- アプリを作成し、以下の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
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