« オレンジニュースがLDRで取得されていない件について | メイン | Amazonのインスタントストアを作ってみた »

はじめてのIRCBot - Python Twisted編

(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るとか、いろいろ夢が広がっています。




トラックバック

このエントリーのトラックバックURL:
http://catbot.net/MTOS4/mt-tb.cgi/115