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ちゃん