Twitter＿Bot 作成③

前回の記事: [Twitter_bot作成②](https://qiita.com/takueha/items/a4f43a582a6e48ce7f6c)

前々回の記事: [Twitter_bot 作成①](https://qiita.com/takueha/items/621db4c41389bd38322a)

前回に引き続きTwitterBot作成の3回目です。

今回で完成になります。

前回の記事で説明させていただいた実装手順は②番まで完了しております。

ですので今回は③番からですね！

頑張ってやっていきましょう！

###データベースから保存したツイートを自動ツイートする機能の実装

では上記の実装を行っていきます！

下記は前回までで作成したtweets_controllerに実装手順③の機能の実装を行ったものです。

実装手順③より下２行が該当部分になります。

~~~ruby
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を叩くと以下の処理を実行するようになりました。

1. 自身のツイートの中から任意の数のいいねをもらえたものだけをデータベースに保存する

２. データベースに保存したデータをランダムで1つ取得し、取得したデータをツイートする

機能的にはこれで悪くはないかなーと思うのですが、APIを自分で叩かないと実行されないのでこれって手動でツイートするのと対して変わらないのですよね💦

せっかくBotを作るのならば自動化したいよね！ってことで、この処理を自動で行えるように改造していきます！

###"whenever gem"を利用し、処理を自動化（定時化）する

今回はwheneverというgemを使って**時間を指定して同様の処理を行う機能**を実装していきます。

まずはwheneverを導入。

```
gem "whenever", require: false
```
上記記述をGemfileに行い、bundle install する。

次に定時処理を行うための設定ファイルを作成。

```
$ bundle exec wheneverize .
```
上記コマンドで`config/schedule.rb`ファイルを作成。

作成したファイルに以下の記述を行いました。

~~~ruby
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`ファイルを作成。

作成したファイルに以下の記述を行いました。

~~~ruby
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で作成できればと思います。

###参考

[【Rails】Twitterでサンタコスbotを作る](https://qiita.com/ryoya-s/items/bc8a0e39716bb2844f0b)

[Wheneverとcronを使用した時にbundlerがおかしくなる](https://teratail.com/questions/248501)

[whenever を使って rails で crontab を扱う](https://loumo.jp/archives/10846)