(oreorebotみたいに)「url送ったらそのページのタイトルを返してくれるボットが欲しいなぁ」と、某IRCで発言したところ、
Perl::POEでサクっと作っていただきました。
でも、作りたい衝動を抑えられず、Twisted baseのIRCクライアントを作ってみました。
ソースコード - azukibot - azuki.py
Twisted初心者なので、付属していたサンプルのIRCBotを元にしています。
付属のexamples
Twisted-2.4.0/TwistedWords-0.4.0/doc/examples/ircLogBot.py
サンプルですでにイベントに対応するメソッドが揃っているので、簡単にイベントドリブンなプログラミングができました。
あとは
APIドキュメントをPythonのプロンプトで
>>> from twisted.words.protocols import irc
>>> help(irc)
とか して、APIを眺めつつ
rfc2812あたりを見ながら肉付け。っていうか、ほとんど元のままです。
Webページを取得する部分はイベント管理機構であるdefferdを返す関数を使っています。
twisted.web.client.getPage は Deferred オブジェクトを返すので、Callback関数を登録してあげます。
def request(self, url, channel):
self.getter = twisted.web.client.getPage(url, timeout=5)
self.getter.addCallback(self.getTitle, channel)
self.getter.addErrback(self.handleWebError(error))
非同期non-blokingネットワークI/Oなので、重いページをリクエストしている間も、mainループでイベントを処理しつづけます。素敵。
twisted.pythonやtwisted.utilというライブラリも付属しており、これは他の用途にも便利に使えそうでした。
ちょっと困ったのが、デバッグです。とりあえず、print文で標準出力に怪しいところを出して、っていうプリミティブな方法しか思いつきませんでした。
ハマると大変かもしれません。
ここまでやってTwistedの楽しさを知り、
蛇玉本を買ってしまいました。
クライアント兼サーバみたいなアプリケーションとかJabberをhogeるとか、いろいろ夢が広がっています。