天然パーマです。

Plagger の Notify Plugin を AnyEvent::XMPP::Client で書いてみた

親父とのプロジェクトのために 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

参考文献

まるごとPerl! Vol.1
posted with yusukebe.com::AmazonSearch on 2009.7.9
  • 小飼 弾 宮川 達彦 伊藤 直也 川合 孝典 水野 貴明
  • 大型本 / インプレスコミュニケーションズ
  • Amazon 売り上げランキング: 64844
  • Amazon おすすめ度の平均: 5.0
    • 5 技術書・解説書というよりはマイルストーン
Amazon.co.jpで詳細を見る


モダンPerl入門 (CodeZine BOOKS)
posted with yusukebe.com::AmazonSearch on 2009.7.9
  • 牧 大輔
  • 大型本 / 翔泳社
  • Amazon 売り上げランキング: 30503
  • Amazon おすすめ度の平均: 5.0
    • 5 perl経験者は読んで損はしない
    • 5 Perl中級者におすすめしたい
Amazon.co.jpで詳細を見る