親父とのプロジェクトのために Trac や SVN の更新を 2人の IM に通知したい。 Plagger を使って Gtalk にポストできるよねと思って、通知の部分に hirose31 さんの書いた Plagger::Plugin::Notify::XMPP を使ってみようとしたんだけど、 モジュールのバージョン不一致のためかなかなか動いてくれない。 そこでお勉強もかねて IM::Engine でも使われている AnyEvent::XMPP::Client を使って、 先ほどのモジュールと同じような動作をする Plugin を作ってみた。
といっても話は簡単ではなく、Perl での非同期系のプログラミングって POE もあまり書いたことないので、 最初結構きょどってしまいまずは単純なサンプルから初めてみることにした。 どんなものかというと、ボットの Gtalk アカウントで 接続して、 5分毎に RSS を読み取り更新があったら、指定した相手にメッセージを送るというもの。 立ち上げ当初での重複チェックはしてないので、最初起動すると一気に RSS のエントリーがポストされるという 甘い作りになっております。 以下がそのサンプルコードです。
#!/usr/bin/perl use strict; use warnings; use AnyEvent::XMPP::Client; use AnyEvent; use XML::Feed; my $last_permalink = ''; my $url = "http://yusukebe.com/index.xml"; my $j = AnyEvent->condvar; my $cl = AnyEvent::XMPP::Client->new( debug => 1 ); $cl->add_account( '[email protected]', 'password', 'talk.google.com', '5222' ); my $w; $cl->reg_cb( connected => sub { $w = AnyEvent->timer( interval => 60 * 5, cb => sub { if( my $text = crawl_rss() ){ $cl->send_message( $text, '[email protected]', ); } } ); } ); $cl->start; $j->wait; sub crawl_rss { my $feed = XML::Feed->parse(URI->new( $url )) or die XML::Feed->errstr; my @entries = $feed->entries; unless( $last_permalink eq $entries[0]->link() ){ $last_permalink = $entries[0]->link(); return $entries[0]->title . "\n" . $entries[0]->link; }else{ return; } }
うんでそれをふまえて、Plagger::Plugin::Notify::XMPP::AnyEvent という Plugin モジュールと、 bot スクリプトを作りました。エラーハンドリングもあんましてない荒削りのものです。 後述する config.yaml を書いて
$ ./plagger-xmppanyeventbot.pl -c config.yaml
と bot を立ち上げて、定期的に
$ plagger -c config.yaml
を実行する構成になっています。config.yaml のサンプルは以下
global: assets_path: ./assets plugin_path: - ./lib/Plagger/Plugin plugins: - module: Subscription::Config config: feed: - url: http://yusukebe.com/index.xml - module: Notify::XMPP::AnyEvent config: jid: [email protected] password: yourpassword server_host: talk.google.com server_port: 5222 to: - [email protected]
さて、これから実践で使おうと思いますので、 何か不具合あれば直します&おかしなところがあれば指摘してください。 開発は github でやっていてアドレスはこちらになっておりやす。
http://github.com/yusukebe/Plagger-Plugin-Notify-XMPP-AnyEvent/tree/master
参考文献
- 小飼 弾 宮川 達彦 伊藤 直也 川合 孝典 水野 貴明
- 大型本 / インプレスコミュニケーションズ
- Amazon 売り上げランキング: 64844
- Amazon おすすめ度の平均:
- 技術書・解説書というよりはマイルストーン
- 牧 大輔
- 大型本 / 翔泳社
- Amazon 売り上げランキング: 30503
- Amazon おすすめ度の平均:
- perl経験者は読んで損はしない
- Perl中級者におすすめしたい