And Q.

思ったことを書きます

botに診断メーカーをやらせる

某女子大生に触発されて僕もbotをつくったりしてました。

欲しかった機能は
・いくつかの文を組み合わせて喋る
・リプライに反応する
・TLに流れる特定の単語に反応する
・フォロー返す

どうやってつくるんだろうなーと思って適当にググってたらこんなものが。

Oauth認証できるRuby製TwitterBotクラスの紹介 - しふーのブログ

というわけで早速DL。アクセストークンとかの話は充分わかってたので問題なく。

前回のエントリにも書きましたがこのボットも同じ実装になっていて動かなかったのでそこだけ変更したりとか。

フォロー返しがなかなか上手くいかなくて四苦八苦したりとか。

色々あって、数日前に上の要件を満たすbotは公開できました。


で、昨日はそのbotに診断メーカーをやらせてみよう!(HTTPリクエストの勉強も兼ねて

というわけでまずは診断メーカーのサイトにどんなリクエストを飛ばせばいいのか調べました。

FirefoxのアドオンにLive HTTP Headersってのがあったのでインストール。
診断メーカーにアクセスして、名前を打ち込んで送信。

するとどうやらPOSTをしているらしい。

同じことをコマンドラインからやってみて、同じページが返ってきたらいいだろう、というわけで

curl -d enter=hogehoge http://shindanmaker.com/******

て感じでやってみるも、結果ページじゃない方が返ってきて「?」に。

色々と試してみるも結局上司に助けを求めました。

「それはPOSTのbodyに書かなきゃダメ」
「u=hogehoge&from= で良さそうよ」

フォームにばかり気を取られてbodyに目が行ってませんでした。むむむ。

curl -d u=hogehoge -d from= http://shindanmaker.com/******

とすると!結果表示のhtmlが得られたではありませんか。

これをRubyで実装して、htmlパーサに流して必要な文字列を抜き出します。

今回はhttpclientとHpricotを使いました。

httpclientはこれまたガローア01後夜祭でじゅーん先生が紹介してくれたライブラリです。
1行でPOSTが書けるのですごい楽です。

Hpricotの説明はこのあたりを参考に。

できたソースは以下のような感じで。

# -*- coding: utf-8 -*-
require "rubygems"
require 'httpclient'
require 'rexml/document'
require 'hpricot'
require 'twitter_bot.rb'

$KCODE="UTF-8"

name = "enutes"
footer = " http://shindanmaker.com/106979 #setunetter"

client = HTTPClient.new
html = client.post("http://shindanmaker.com/106979", { :u => name, :from => "" } )


doc = Hpricot(html.body)
result = (doc.search("div.result")).first.inner_html

doc2 = Hpricot(result)
result2 = (doc2.search("div")).inner_html.strip

bot = TwitterBot.new('conf.yml')

bot.post(result2 + footer)

DIVの中にDIVがあってややこしかったんで2回抜き出してます。もっとスマートな方法ないかなあ。
postで得られたhtmlが文字化け化けで「んもう!」ってなってたんですが

$KCODE="UTF-8"

を入れるだけで解決しました。

Ruby1.9以上ならこれはいらないっぽいですね。

これをcronで1日1回実行させれば完璧!