IRC がゆく

カテゴリ
ブックマーク数
このエントリーを含むはてなブックマーク はてなブックマーク - IRC がゆく
このエントリーをはてなブックマークに追加
開発部 _ です。

みなさんは IRC を使っていますか?
もしくは使ったことがありますか?

ネット上の個人コミュニケーション手段が msn・Yahoo!・Skype などのメッセンジャーが一般的になって久しい昨今、IRC は一部のマニアが使うニッチで古臭い手段という見方も多いようです。
そんな中 livedoor では、日々の運用作業に始まり、開発中のコンテンツ進捗、技術的な意見交換、バグ報告、ランチどこいく?、麻雀やりますよ、今夜のおかずに到るまで日常的に活用されています。
IRC で使われているツールに IRC bot(IRCボット:以下 ボット)と呼ばれる小さなプログラムがあります。
ユーザーの発言に反応したり、定期的に何かを発信したり、嫌なアイツにナニしてくれたり、と作り手の発想次第でいろいろな処理をさせることが出来ます。
時に悪用(ボットネットなど)されるなどネガティヴな印象を与えてしまうこともありますが、うまく使えばとても便利で楽しい IRC ライフが送れるハズです。

ここでは簡単なボットの利用例とサンプルを紹介したいと思います。


■業務でのボット利用案



・サーバ監視
サーバ(マシン)の負荷情報や稼働状況などのステータス通知。

・コンテンツ監視
定期バッチ処理など自動処理の完了通知。

・開発
各種コミット情報の通知。

・人
社長を監視。



■ボット 事始め



Perl で IRC を利用するために、古くは Net::IRC を、ちょっと前までは POEPOE::Component::IRC)を使うのが通例でしたが、最近では AnyEventAnyEvent::IRC::Client)を利用するのがイケメンのようです。

以下にボットが IRC に接続するまでを書いてみます。

use strict;
use AnyEvent;
use AnyEvent::IRC::Client;

# 接続設定
my $channel = '#チャンネル';
my %config = (
    server   => 'IRC サーバ',
    port     => 6667,
    info     => {
        nick => 'ニックネーム',
        real => 'リアルネーム',
    }
);

# 状態変数生成
my $condvar = AnyEvent->condvar;

# IRC イベント
my $irc = AnyEvent::IRC::Client->new;
$irc->reg_cb(
    # 接続時に呼び出されるイベント
    connect => sub {
        my ($irc, $err) = @_;
        if (defined $err) {
            print "connect error: $err\n";
            return;
        }
        print "connected.\n";
    },

    # 接続成功時に呼び出されるイベント
    registered => sub {
        print "registered.\n";
    },

    # 切断時に呼び出されるイベント
    disconnect => sub {
        print "disconnected.\n";
    },
);

# IRC サーバに接続
$irc->connect($config{server}, $config{port}, $config{info});

# $channel に join
$irc->send_srv("JOIN", $channel);

# $channel に notice メッセージを送る
$irc->send_chan($channel, "NOTICE", $channel, "Hello, $channel!");

# イベント待ち
$condvar->recv;

これで IRC サーバ $config{server} の $channel に $config{info}->{nick} なユーザー名で接続(join)し、"Hello, $channel!" と挨拶することが出来ました。 しかし、このままでは本当に挨拶するだけで何もしてくれません。

簡単な例として $channel 内のユーザーが発言したときにレスをするようにしてみます。

$irc->reg_cb(
    # $channel に発言があったとき _public() を実行
    publicmsg => sub {
        my ($irc, $chan, $msg) = @_;
        _public($msg->{params}[1]);
    }
);

sub _public {
    my $msg = shift;
    $irc->send_chan($channel, "PRIVMSG", $channel, $msg . 'だと!?');
}
出力:
<#channel> user: ほげ
<#channel> bot: ほげだと!?

実際にこのボットがいるチャンネルはだいぶウザそうです!

*****
この中に出てくる "JOIN" や "NOTICE" "PRIVMSG" などは IRC を操作するためのコマンドです。詳細は RFC 1459 で定義されています。
本格的に IRC を操ってやろう!という方には必読ですので、少々骨が折れますがぜひ確認してみてください。


■ボットを働かせる



ただレスだけではつまらないので、もう少しまともな処理をさせてみます。
手前味噌ですが、弊社コンテンツ livedoor グルメでは 公式 API を公開しています。興味のある方はぜひお試しください。

以下が、クチコミ検索 API を用いた、最新クチコミ1件を取得しお知らせする機能のサンプルになります。

use XML::LibXML;
use Encode;
use LWP::UserAgent;
use URI;

sub _public {
    my ($msg) = @_;
    eval {
        if ($msg eq "新着クチコミ") {
            _shinchaku_kuchikomi();
        }
    };
}

sub _shinchaku_kuchikomi {
    my $res = _kuchikomi_api();
    return if !$res->is_success;

    my $xml   = XML::LibXML->new->parse_string($res->decoded_content);
    my @nodes = $xml->findnodes('//evaluation');
    my $node  = $nods[0];
    my $title = encode_utf8 $node->findvalue('title');
    my $user  = encode_utf8 $node->findvalue('user/nickname');
    my $plink = encode_utf8 $node->findvalue('permalink');
    my $date  = encode_utf8 $node->findvalue('date/created');
    my $line  = sprintf "%s by %s (%s)", $title, $user, $plink

    $irc->send_chan($channel, "NOTICE", $channel, $line);
    return;
}

sub _kuchikomi_api {
    my $api = "http://api.gourmet.livedoor.com/v1.0/evaluation/";
    my %query = (api_key => 'API-KEY');
    my $lwp = LWP::UserAgent->new;
    $lwp->agent('gourmet-bot/1.00');
    $lwp->timeout(5);
    my $uri = URI->new($api);
    $uri->query_form(%query);
    return $lwp->get($uri->as_string);
}
出力:
<#channel> shiro: 新着クチコミ
<#channel> bot: 究極の至高的美味な何か by yuzan (http://gourmet.livedoor.com/...)

さらに AnyEvent の timer を使って定期的に処理させることも出来ます。

my $timer;
$timer = AnyEvent->timer(
    after    => 1,
    interval => 60,
    cb       => sub {
        __shinchaku_kuchikomi();
    }
);

after 後に開始し interval 周期で cb の処理が実行されます。


■最後に



こよなく IRC を愛する livedoor は IRC サーバを提供、支援しています。

さぁ皆さんも IRC ワールドへ。

レスポンス
コメント(0)
トラックバック(0)

このエントリーをはてなブックマークに追加