一生ヤグラだけで遊びたい。

saboyutaka/splapi_gem: splapi Client for ruby
rubyのクライアントを作ってくださった方がいるのでrubyでヤグラのタイミングを教えてくれるtwitter botを書いて遊びました。
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]でsferik/twitter: A Ruby interface to the Twitter API.のv5.14.0使用。

require 'twitter'
require 'splapi'
require 'date'

# Consumer key, Secretの設定
CONSUMER_KEY = 'x'
CONSUMER_SECRET = 'x'
# Access Token Key, Secretの設定
ACCESS_TOKEN_KEY = 'x'
ACCESS_SECRET = 'x'

client = Twitter::REST::Client.new do |config|
    config.consumer_key       = CONSUMER_KEY
    config.consumer_secret    = CONSUMER_SECRET
    config.access_token        = ACCESS_TOKEN_KEY
    config.access_token_secret = ACCESS_SECRET
end

stream_client = Twitter::Streaming::Client.new do |config|
    config.consumer_key        = CONSUMER_KEY
    config.consumer_secret     = CONSUMER_SECRET
    config.access_token        = ACCESS_TOKEN_KEY
    config.access_token_secret = ACCESS_SECRET
end

splcli = SplAPI::Client.new
rule = 'ガチヤグラ'
stream_client.user do |status|
  if status.is_a?(Twitter::Tweet)
    puts status.text
    flag = false
    check = status.text.include?('ヤグラ')
    if check && status.user.screen_name == 'retrorocket' then
      if splcli.gachi_now.body['result'][0]['rule'] == rule 
        client.update('今やってるよ? ' + Time.now.to_s)
	flag = true
      end
      if splcli.gachi_next.body['result'][0]['rule'] == rule
        client.update('次にやるみたい ' + Time.now.to_s)
	flag = true
      end
      if !flag then
	client.update('まだやらないみたい ' + Time.now.to_s)
      end
   end
  end
end

Windows & ruby2.2.2でuserstreamを使ったお返事twitter botを作る。

環境

  • OSはWindows 8.1
  • ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]
  • twitter用のgemはsferik/twitter · GitHubのv5.14.0を使用する

なぜWindowsかというと、Windowsでrubyを使っている気になるあのコ向けに書いてるからです。(まあ多分見ないだろうけど。)
eventmachineと組み合わせると、気になるあのコが作りたがってる時報botもWindowsのイベントタイマを使わずに実装できるため、eventmachineの上で動いているtweetstream/tweetstream · GitHubを使用したいと思っていました。が、どう頑張ってもSSLフラグが有効の状態でeventmachineをインストールできなかったため(gem install時にwith-ssl-dirを指定してもさっぱり有効にならない)、em-twitterが動かず、Windowsのruby2.2.2でtweetstreamを動かすのは無理なんじゃないかと思っています(解決法を教えて欲しいレベルでわからないです)。

botの仕様

userstreamを監視して、自分宛てのメンションが来た場合にお返事します。
EM::PeriodicTimer.new(3600)と組み合わせて時報botとお返事botを合体させたかったのですが、うまく動いてくれなかったので今後の課題としたいです。
(私がeventmachineとsferik/twitterの仕様を理解してないからなのですが。)

実装

require 'twitter'

# Consumer key, Secretの設定
CONSUMER_KEY     = "xxx"
CONSUMER_SECRET  = "xxx"
# Access Token Key, Secretの設定
ACCESS_TOKEN_KEY = "xxx"
ACCESS_SECRET    = "xxx"

## Windowsの証明書の検証回避用設定
## 環境変数SSL_CERT_FILEを設定したくない場合下記のコメントアウトを外す
## 正攻法ではないのでおすすめしない。そもそもWindowsでRuby使うこと自体(ry
#OpenSSL::SSL.module_eval{ remove_const(:VERIFY_PEER) }
#OpenSSL::SSL.const_set( :VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE )

client = Twitter::REST::Client.new do |config|
    config.consumer_key       = CONSUMER_KEY
    config.consumer_secret    = CONSUMER_SECRET
    config.access_token        = ACCESS_TOKEN_KEY
    config.access_token_secret = ACCESS_SECRET
end

stream_client = Twitter::Streaming::Client.new do |config|
    config.consumer_key        = CONSUMER_KEY
    config.consumer_secret     = CONSUMER_SECRET
    config.access_token        = ACCESS_TOKEN_KEY
    config.access_token_secret = ACCESS_SECRET
end

# userstreamを表示する
stream_client.user do |object|
    if object.is_a?(Twitter::Tweet)
        puts "#{object.user.screen_name}: #{object.text}"
        # 自分宛てのメンションがきた場合、挨拶を返す
        if object.in_reply_to_screen_name == "YOUR_SCREEN_NAME"
            client.update("@#{object.user.screen_name} リプライありがとう。", options = {in_reply_to_status_id:object.id})
        end
    end
end

RubyとかCSVまわりで色々詰んだのでメモ.

借りたVPSのRubyでCSV処理したら改行が認識されてなくて意味不明なことになってたりおかしかったので,Rubyのバージョン確認したら1.8.7でした.これはいかんということでrvmを導入しようとしたのですが,コンパイルの段階で応答がなくなったため,あきらめて1.9系にアップデートすることにしました.
以下のページを参考にしました.

sudo apt-get -yV install ruby1.9.1-full
sudo apt-get -yV install rubygems

sudo gem install rubygems-update
sudo gem1.9.1 install rubygems-update
sudo /var/lib/gems/1.8/bin/update_rubygems
sudo /var/lib/gems/1.9.1/bin/update_rubygems
sudo gem update
sudo gem1.9.1 update

#update-alternativesでバージョン切り替え
sudo update-alternatives –install /usr/bin/ruby ruby /usr/bin/ruby1.8 0
sudo update-alternatives –install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 1
sudo update-alternatives –config ruby

いざ
CSV.foreach(“hoge.csv”, ‘r’) do |row|…end
を実行してみたら,
/usr/lib/ruby/1.9.1/csv.rb:1198:in `delete’: can’t convert Symbol into String (TypeError)
とかいわれました.オプション全消ししたら動いたので,先輩にきいてみたら「1.9系からはoptionはHashになりました」とのこと.

Google先生にきいて一番上にあったページは事故の元だから上記を参照しろとのことでした.おかげで半日以上潰れましたがなんとか解決してよかったです.