環境
- 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