ファミチキに関する情報を集めるTwitterのbot

ちょっと勉強がてら、botを作ってみた。

これはなに?

Twitter上でファミチキに関する発言を見つけると、RT(的なことを)する。

だからこのbotをフォローしておけば、どこかで誰かが「ファミチキなう」などと発言したことがわかる。

  1. ファミチキ食べてる人がわかるようになる
  2. 見た人もファミチキ食べたくなる
  3. 買う人が増える
  4. ファミチキ流動性が上がる
  5. どんどん売れ、どんどん揚げる
  6. いつ買いに行っても揚げたてが食べれるようになる!

というのが究極の目標。

やっていること

定期的にTwitter検索で「ファミチキ」を検索して、新着のものがあればそれをちょっと編集して発言するようになっている。編集の内容は、発言者のIDを先頭につけるのと、文中の@を全角@へ置換。

やってることは自動RTだけど、あえてRTのフォーマットにはしてない。とりあえずそうした。あと、全角@に置換しているのは、無駄にリプライしてしまうのを防ぐため。

この辺のやり方は、今後どういうのが適切なのか考えて、改良していきたい(そういうのを実体験したくて、その題材として今回このbotを作ったということでもある)。

将来的に

情報ソースをTwitter検索以外にも広げていけばおもしろいかもしれない。あとはファミチキ以外のキーワードでもこういう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
    • Twitter検索の結果をatomで取得をして、新着かつ自分の発言ではないエントリだけ返す
  • post

最初はMacで作ってテストして、実際に実行している環境は自宅で常時稼働しているWindowsマシン。なのでOSとかは関係なく動くと思う。

迷惑をかけるつもりはない

botの振る舞いについては、ウザくならないように調整を重ねたいと思っています。頻度や投稿内容などに関して、ご意見や要望、苦情などありましたら、連絡いただければ対処します。

2009.12.5追記

@を全角の@に置換していたけど、全角でもリプライになっちゃうようになったので、@と次の文字の間に半角スペースを挟むように仕様変更した。