前提・実現したいこと
TwitterのDMを定期的に送りたいと考えています。
そのためにcronを使って定期実行を行っているのですが、うまくいきません。
ただ、単発実行ではうまくいっているので、その原因を教えていただきたいです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
cronの単発実行はうまくいくが、定期実行はうまくいかない。
そもそもこのツールの仕様は、
①保存されている内容(アカウント名、文章)でDMを送る。
②送ることができたできないに関係なく、その後すぐその情報はDBから消去される
というものです。
単発実行ではこれらが正常に作動します。
しかし定期実行になると、①はうまく実行されず、②だけ実行されます。
該当のソースコード
run_regularly.rake
namespace :minite_post do desc "保存内容を一件ずつ送信" task :regularly_flag => :environment do #ログ logger = Logger.new 'log/run_regularly.log' #ここから処理を書いていく @client = Twitter::REST::Client.new do |config| config.consumer_key = ENV["TWITTER_CONSUMER_KEY"] config.consumer_secret = ENV["CONSUMER_SECRET"] config.access_token = ENV["ACCESS_TOKEN"] config.access_token_secret = ENV["ACCESS_TOKEN_SECRET"] end @user_num = SendInfo.count @user = SendInfo.first begin @client.create_direct_message(@client.user(@user.name).id, "#{@client.user(@user.name).name}#{@user.atena}\n\n#{@user.text}") rescue => error puts error puts config.access_token_secret ←追加 end if @user_num >= 1 @user.destroy end #デバッグのため p "OK" end end
ログ(run_regularly.rakeに「puts config.access_token_secret」を追加した際)
Invalid or expired token. rake aborted! NameError: undefined local variable or method `config' for main:Object /Users/yuta/projects/AutoTwitterDM/lib/tasks/run_regularly.rake:20:in `rescue in block (2 levels) in <main>' /Users/yuta/projects/AutoTwitterDM/lib/tasks/run_regularly.rake:16:in `block (2 levels) in <main>' /Users/yuta/.rbenv/versions/2.6.5/bin/bundle:23:in `load' /Users/yuta/.rbenv/versions/2.6.5/bin/bundle:23:in `<main>' Caused by: Twitter::Error::Unauthorized: Invalid or expired token. /Users/yuta/projects/AutoTwitterDM/lib/tasks/run_regularly.rake:17:in `block (2 levels) in <main>' /Users/yuta/.rbenv/versions/2.6.5/bin/bundle:23:in `load' /Users/yuta/.rbenv/versions/2.6.5/bin/bundle:23:in `<main>' Tasks: TOP => minite_post:regularly_flag (See full trace by running task with --trace)
schedule.rb
# Rails.rootを使用するために必要。なぜなら、wheneverは読み込まれるときにrailsを起動する必要がある require File.expand_path(File.dirname(__FILE__) + "/environment") # cronを実行する環境変数 rails_env = ENV['RAILS_ENV'] || :development # cronを実行する環境変数をセット set :environment, rails_env # cronのログの吐き出し場所。ここでエラー内容を確認する set :output, "#{Rails.root}/log/cron.log" every 1.minutes do rake "minite_post:regularly_flag" end
cronへの登録情報
* * * * * /bin/bash -l -c 'cd /Users/manami/projects/AutoTwitterDM && RAILS_ENV=development bundle exec rake minite_post:regularly_flag --silent >> /Users/manami/projects/AutoTwitterDM/log/cron.log 2>&1'
rescueのログ(単発実行時)
ただし、DM送信はできている。
undefined method `name' for nil:NilClass "OK"
rescueのログ(定期実行時)
DM送信はできない。
Invalid or expired token. "OK"
puts config.access_token_secret
補足情報(FW/ツールのバージョンなど)
ruby 2.6.5p114
Rails 6.0.3.4
参考にさせていただいたサイト
定期実行する rake taskとcronの使い方
回答2件
あなたの回答
tips
プレビュー