RubyでBot作っ(た|ている)記録
Bot作りました. 現在はまだローカルマシン(Mac)で実行していてサーバには上げていない.
プログラムは簡単だったけど,YAMLを使うところとcron使うところでハマった.
Versions
OS OSX 10.10.5 ruby 2.2.2p95 twitter 5.15.0
Rubyプログラム
require 'twitter' require 'yaml' current_dir = File.expand_path(File.dirname(__FILE__)) array = [] open("#{current_dir}/tweets.db.txt") do |file| while line = file.gets array.push(line) end end tweet = array.sample begin client = Twitter::REST::Client.new do |config| settings = YAML.load_file("#{current_dir}/settings.yaml") config.consumer_key = settings[:consumer_key] config.consumer_secret = settings[:consumer_key_secret] config.access_token = settings[:access_token] config.access_token_secret = settings[:access_token_secret] end client.update(tweet) puts "#{Time.now}: #{tweet}" rescue => e STDERR.puts "#{Time.now}: #{e}" raise e end
YAMLを読み込んでシンボルで参照するところでハマった
はじめはなぜかわざわざSQLite3でDBこさえてTweet文を管理しようとしていた.もちろんActiveRecordを使っていた.で,シンボルで参照ができなかったのだがいろいろ調べて読み込んだYAMLオブジェクト?でsymbolize_keysをするとうまく行った.
settings = YAML.load_file('settings.yaml') settings.symbolize_keys!
そしてDBをやめてファイルでやり直すとまた参照できなくなった. symbolize_keysはActiveRecordをrequireした時にラップされたメソッドみたいなものではないかと判断した.しかし,やはりハッシュの値にアクセスするのはシンボルで行いたいのがRuby的. 解決策としてはYAMLのキーをシンボル的にするとできた.
:consumer_key: XXXXX :consumer_key_secret: XXXXX :access_token: XXXXX :access_token_secret: XXXXX
注意点としてはこのYAMLファイルはRuby以外では役に立たないだろうということ.
cronがタスクを呼び出すところでハマった
定期的に実行するためにcronを使用している. launchctlを使っていないのはLinuxサーバに乗せることを考えているため. いろいろハマったのだけれど結果的には以下のようにした.数値はウソもの.設定方法はググってみてください.
$ crontab -e 0 12 * * * /Users/masawa200ok/Work/TwitterBot/bot.sh
bot.sh
#! /bin/sh cd "/Users/masawa200ok/Work/TwitterBot/" /Users/masawa200ok/.rbenv/shims/ruby -Ku masawa200ok_bot.rb >>stdout.log 2>>error.log
-Ku オプションを付けないとダメでした.
Rubyプログラムを呼び出しているのはあくまでcronであるのでプログラム中の相対パスをそのまま素直に使えない.一番適切でラクだと思われたのがシェルでcdしてしまえばよいということ.
まとまってないまとめ
現状ローカルのMac上で動かしているので,その先どうなるかわからない.Herokuも一度試してみたいし.できてから書けとかですが許してください.
かわいいよ かわいいよ Botちゃん