前回の記事: Twitter_bot作成②
前々回の記事: Twitter_bot 作成①
前回に引き続きTwitterBot作成の3回目です。
今回で完成になります。
前回の記事で説明させていただいた実装手順は②番まで完了しております。
ですので今回は③番からですね!
頑張ってやっていきましょう!
###データベースから保存したツイートを自動ツイートする機能の実装
では上記の実装を行っていきます!
下記は前回までで作成したtweets_controllerに実装手順③の機能の実装を行ったものです。
実装手順③より下2行が該当部分になります。
class TweetsController < ApplicationController
require 'twitter'
before_action :twitter_client
def callback
# ツイート一覧を取得
@client.home_timeline({ count: 200 }).each do |tweet|
#ツイートのいいねの数が1以上の時
if tweet.favorite_count >= 1
#そのツイートを保存する
Tweet.create(body: tweet.text)
end
end
#実装手順③ データベースからランダムでデータを一つ取得し、取得したデータをツイートする
random_tweet = Tweet.order("RAND()").first
@client.update(random_tweet.body)
#このまま放っておくとエラーになってしまうのでjson形式で保存したツイート一覧を取得する
tweets = Tweet.all
render json: tweets, each_serializer: TweetSerializer
end
def twitter_client
@client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
#Twitterdevelopperから各キーを取得し、入力する
end
end
end
上記のように記述しました。
この記述を行ったことでAPIを叩くと以下の処理を実行するようになりました。
- 自身のツイートの中から任意の数のいいねをもらえたものだけをデータベースに保存する
2. データベースに保存したデータをランダムで1つ取得し、取得したデータをツイートする
機能的にはこれで悪くはないかなーと思うのですが、APIを自分で叩かないと実行されないのでこれって手動でツイートするのと対して変わらないのですよね💦
せっかくBotを作るのならば自動化したいよね!ってことで、この処理を自動で行えるように改造していきます!
###"whenever gem"を利用し、処理を自動化(定時化)する
今回はwheneverというgemを使って時間を指定して同様の処理を行う機能を実装していきます。
まずはwheneverを導入。
gem "whenever", require: false
上記記述をGemfileに行い、bundle install する。
次に定時処理を行うための設定ファイルを作成。
$ bundle exec wheneverize .
上記コマンドでconfig/schedule.rb
ファイルを作成。
作成したファイルに以下の記述を行いました。
require File.expand_path(File.dirname(__FILE__) + "/environment")
set :output, 'log/crontab.log'
set :environment, :development
env :PATH, ENV['PATH']
set :job_template, "/bin/zsh -l -c ':job'"
job_type :rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && RAILS_ENV=:environment bundle exec rake :task :output"
# 2時間ごとに"$ bundle exec rake twitter:tweet"を動かす
every 2.hours do
rake "twitter:tweet"
end
上記の記述を行うことで2時間ごとに$ bundle exec rake twitter:tweet
を実行するように設定しました。
次に$ bundle exec rake twitter:tweet
で実行される処理を調整。
$ bundle exec rails g task twitter
上記コマンドでlib/tasks/twitter
ファイルを作成。
作成したファイルに以下の記述を行いました。
namespace :twitter do
desc "random_tweet"
task :tweet => :environment do
twitter_client
@client.home_timeline({ count: 200 }).each do |tweet|
#ツイートのいいねの数が1以上の時
if tweet.favorite_count >= 1
#そのツイートを保存する
Tweet.create(body: tweet.text)
end
end
random_tweet = Tweet.order("RAND()").first
@client.update(random_tweet.body)
end
end
def twitter_client
@client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
#twitterdevelopperで取得した各キーを記入
end
end
ここはコントローラーをほぼコピーでOKです。
これで実装は完了。
あとはwheneverを起動してちゃんと処理が実行されることが確認されれば完成です。
$ bundle exec whenever --update-crontab
上記コマンドを実行後、schedule.rbで設定した時間ごとに処理が行われることを確認。
無事に完成しました!
オリジナルでの取り組みは初めてだったので完成できるか不安もありましたが、なんとかなりましたね。
次はAPIだけではなくHTMLを返すようなものをRailsで作成できればと思います。
###参考