【Rails】時間指定でツイートできるTwitter botの作成方法

プログラミング初心者の勉強ブログ #70

RailsでTwitter botを作成するやり方を紹介します。前回のTwitter APIキーの取得からの続きです。WheneverとActive Jobで、時間を指定して自動ツイートを行うことができます。gem”Twitter”がおすすめです。

 

目次

[toc]

 

前回の内容

RailsでTwitter botを作成する流れを大まかにまとめると、

  1. Twitterアカウントの作成(実際にプログラム上で操作したいアカウント)
  2. 1のアカウントで、ディベロッパーアカウントを取得
  3. ディベロッパーアカウント内に「app」を作成
  4. 「app」のAPIキーとアクセストークンを取得
  5. 4で取得したキーとトークンで、自分のアプリと連携
  6. gem”Twitter”を用いてコーディング

といったような形となります。

前回はTwitterディベロッパーアカウントを取得し、APIキーとアクセストークンを取るまでの流れを書きました。流れでいう4番までです。

[blogcard url=”https://whatsupguys.net/programming-school-dive-into-code-learning-69/”]

今回は、続きの5、6番を行います。

 

取得したAPIキーとアクセストークンを連携

取得したAPIキーとアクセストークンを、環境変数(.envファイル)を使って連携します。環境変数は、自分のAPIキーやアクセストークンなど、他人に知られては困るような内容を隠すときに用いるファイルです。

※.envファイルに書き込んだ場合、必ず「.gitignore」ファイルに「.env」を追記してください。そうすることで、Gitにpushされず、外部から見ることができなくなります。

 

環境変数の使用準備

「.env」ファイルを使用できるよう、Gemfileに「gem ‘dotenv-rails’」を以下のように書き込み、「$ bundle install」します。

 

Gemfile

// group :development〜内に記入
group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'

  # 記入
  gem 'dotenv-rails'
end

 

インストールが確認できたら、アプリのディレクトリ直下に「.env」という名前でファイルを作成します。

.envファイル作成

 

上の画像はAtomエディタでRailsアプリケーション「uranai_app」を作成し、そのディレクトリ直下に「.env」ファイルを作成している状態です。

 

gem”Twitter”のインストール

次はgem”Twitter”をインストールします。先程と同様、Gemfileに「gem ‘twitter’」を記入し、「$ bundle install」を行います。

 

Gemfile

# 追加
gem 'twitter'

 

GitHub Twitter

GitHub Twitter

上の画像はGitHubのREADMEの一部です。このようにAPIキーとアクセストークンを書き込むことで、取得したアカウント上でツイート機能やDM機能を設定できると書かれております。

 

Twitter ディベロッパーアカウント

 

ディベロッパーアカウント上の該当箇所は、上の画像の通りです。それぞれ環境変数にして代入させます。

 

.envファイルにAPIキーとアクセストークンを書き込む

.env

//APIキーとアクセストークンを代入し変数を作成
YOUR_CONSUMER_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
YOUR_CONSUMER_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ACCESS_TOKEN_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

環境変数を作成したら、あとはコーディングのみです。

 

gem”Twitter”を用いてコーディング

今回はActive JobとWheneverを使って、バックグラウンドで自動実行されるJobに自動ツイートを加えます。

具体的には、「朝の情報番組の占い結果を、指定時刻に自動スクレイピングしデータベースに保存する」というJobに、更新した際の通知としてTwitterで自動ツイートをする流れです。

 

Active JobとWheneverについては、

【Rails】Active JobとWheneverでスクレイピングを自動化(#1 Active Jobの仕組み)

【Rails】Active JobとWheneverでスクレイピングを自動化(#2 Active Jobの設定方法)

【Rails】Active JobとWheneverでスクレイピングを自動化(#3 Wheneverの使い方)

これらの記事にまとめてます。ここからはActive Jobの設定ありきで進めます。

 

自動ツイートのためのコーディング

実際のコードは以下の通りです。app/jobs下に「tweet_job.rb」という新しいファイルをコマンドで作成し、その中に書き込んでおります。

※特にActive Jobを利用しない場合は「def perform」内のコードを任意の箇所に書き込めば大丈夫です。

 

app/jobs/tweet_job.rb

class TweetJob < ApplicationJob
  queue_as :default

  def perform

    // 設定した環境変数を代入する
    client = Twitter::REST::Client.new do |config|
      config.consumer_key        = ENV['YOUR_CONSUMER_KEY']
      config.consumer_secret     = ENV['YOUR_CONSUMER_SECRET_KEY']
      config.access_token        = ENV['ACCESS_TOKEN']
      config.access_token_secret = ENV['ACCESS_TOKEN_SECRET']
    end

    // 変数の作成コーディング
    today = Date.today.beginning_of_day..Date.today.end_of_day
    m = []
    g = []
    s = []
    # モデルからスクレイピングした占い結果を引っ張って変数に代入
    gt = Gogototal.where(created_at: today).first
    for i in 1..3 do
      m << Mezamashi.where(created_at: today).find_by(rank: i).sign
      g << Gudetama.where(created_at: today).find_by(rank: i).sign
      s << Sukkirisu.where(created_at: today).find_by(rank: i).month
    end
    
    // 実際にツイートしたい内容をtextに代入
    text = "テスト中\n【今朝の占いまとめ】\n\n○めざまし占い\n1位:#{m[0]}\n2位:#{m[1]}\n3位:#{m[2]}\n\n○ぐでたま占い\n1位:#{g[0]}\n2位:#{g[1]}\n3位:#{g[2]}\n\n○ゴーゴー星占い\n総合1位:#{gt.total_no1}\n\n○スッキりす占い\n1位:#{s[0]}月\n2位:#{s[1]}月\n3位:#{s[2]}月\n\n#今朝の占い\n\n詳細↓https://supunic.com"

    // updateメソッドにtextを引数として渡す。
    client.update(text)
  end
end

 

textに代入した文字列が、実際に表示される内容です。画像を差し込む場合は第二引数を使う必要があるみたいです。URLは文字列に入れ込むことでリンク作成できます。「#」を頭につければハッシュタグにもなります。基本的にツイッターでツイートする感覚で文字列を作成すれば、うまい具合に反映されます。

 

結局ツイートだけしたい場合は、

client = Twitter::REST::Client.new do |config|
 config.consumer_key        = ENV['CONSUMER_API_KEY']
 config.consumer_secret     = ENV['CONSUMER_API_SECRET_KEY']
 config.access_token        = ENV['ACCESS_TOKEN']
 config.access_token_secret = ENV['ACCESS_TOKEN_SECRET']
end

これと、

text = ”あいうえお”
client.update(text)

これだけ書いてメソッドを起動させれば 、「あいうえお」とツイートできます。

 

次は、Wheneverで時間指定を行います。「config/schedule.rb」にJobを追加していきます。(Wheneverの使い方はこちらに書いてます。)

 

config/schedule.rb

set :output, "log/scraping.log"
set :environment, :development

# スクレイピング処理
every :weekday, at: '8:00 am' do
  runner 'FortuneScrapingJob.perform_later'
end

# ツイート処理
every :weekday, at: '8:05 am' do
  runner 'TweetJob.perform_later'
end

 

スクレイピング処理を行ってから5分後に、Tweet Jobを動かす設定です。

 

実際に起動してみると、

ツイート結果

 

このような感じになります。「summary_large_image」のツイッターカードのリンクが見切れていますが、文字列に入れたURLがしっかりリンクとして表示されております。

 

まとめ

表示させたいツイート(textに代入する文字列)のレイアウトは、文字列のコードで行うとイメージしづらいので、実際に本家Twitterのツイート画面で形を作ってから、文字列を作成することをおすすめします。

以上ありがとうございました。

保存保存

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA