3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Twitter_Bot 作成③

Posted at

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

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

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

###参考

【Rails】Twitterでサンタコスbotを作る

Wheneverとcronを使用した時にbundlerがおかしくなる

whenever を使って rails で crontab を扱う

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?