ファミチキに関する情報を集めるTwitterのbot
ちょっと勉強がてら、botを作ってみた。
これはなに?
Twitter上でファミチキに関する発言を見つけると、RT(的なことを)する。
だからこのbotをフォローしておけば、どこかで誰かが「ファミチキなう」などと発言したことがわかる。
というのが究極の目標。
やっていること
定期的にTwitter検索で「ファミチキ」を検索して、新着のものがあればそれをちょっと編集して発言するようになっている。編集の内容は、発言者のIDを先頭につけるのと、文中の@を全角@へ置換。
やってることは自動RTだけど、あえてRTのフォーマットにはしてない。とりあえずそうした。あと、全角@に置換しているのは、無駄にリプライしてしまうのを防ぐため。
この辺のやり方は、今後どういうのが適切なのか考えて、改良していきたい(そういうのを実体験したくて、その題材として今回このbotを作ったということでもある)。
ソースコード
たいしたコードではないけど、一応書いておく。RubyGems使わなくても動くように、Rubyに最初から入ってるライブラリだけで作った。
require 'open-uri' require 'rexml/document' require 'net/http' include REXML user = 'chicken_bot' pass = 'p@ssw0rd' keyword = 'ファミチキ' def get_latest(user) uri = URI.parse("http://twitter.com/statuses/user_timeline/#{user}.rss") doc = Document.new uri.read return Time.parse(XPath.first(doc, '/rss/channel/item/pubDate').text) end def search(keyword, user, from) uri = URI.parse("http://search.twitter.com/search.atom?lang=ja&q=#{URI.encode(keyword)}") doc = Document.new uri.read return doc.get_elements('/feed/entry').select do |entry| author = XPath.first(entry, 'author/uri').text.gsub(/^.*\//, '') published = Time.parse(XPath.first(entry, 'published').text) author != user && from < published end end def post(entries, user, pass) Net::HTTP.version_1_2 entries.reverse!.each do |entry| author = XPath.first(entry, 'author/uri').text.gsub(/^.*\//, '') text = XPath.first(entry, 'title').text.gsub(/@/, '@') Net::HTTP.start('twitter.com', 80) do |http| req = Net::HTTP::Post.new('/statuses/update.xml') req.basic_auth user, pass req.body = 'status=' + URI.encode("#{author}: ") + text res = http.request(req) end sleep 1 end end latest = get_latest(user) entries = search(keyword, user, latest) post entries, user, pass
- get_latest
- 新着の判定のため、自分の最終投稿日時を自分のRSSから取得して返す
- search
- post
最初はMacで作ってテストして、実際に実行している環境は自宅で常時稼働しているWindowsマシン。なのでOSとかは関係なく動くと思う。
迷惑をかけるつもりはない
botの振る舞いについては、ウザくならないように調整を重ねたいと思っています。頻度や投稿内容などに関して、ご意見や要望、苦情などありましたら、連絡いただければ対処します。
2009.12.5追記
@を全角の@に置換していたけど、全角でもリプライになっちゃうようになったので、@と次の文字の間に半角スペースを挟むように仕様変更した。