botのつくりかた

自己紹介

YAPC::Asia 2011に参加してきました

YAPC

Hokkaido.pmの皆様、本当にありがとうございました

botとは

全裸bot

つぶやきを全裸にしてくれる(自動で)

自動でやってくれるのはとても便利

自動でいろいろやってくれるものを作ってみます

今回はbotを作るのにAnySanというモジュールを使ってみます

% cpanm AnySan

AnySanとは

AnyEvent をベースとしたリアルタイミングメッセージング用の bot を簡単に作る為のツールキット

AnySanとは

AnyEvent をベースとしたリアルタイミングメッセージング用の bot を簡単に作る為のツールキット

Perl Advent Calendar Japan 2011 Anysan Track

Twitter bot

例: #hokkaidopm が含まれているツイートを非公式RTするbotを書く

基本的にはこんな感じ

use strict;
use warnings;
use AnySan;
use AnySan::Provider::Twitter;

my $config = +{
    consumer_key    => '',
    consumer_secret => '',
    token           => '',
    token_secret    => '',
};

my $twitter = twitter
    %$config,
    method => 'filter',
    track  => '#hokkaidopm';

AnySan->register_listener(
    hokkaidopm => {
        event => 'timeline',
        cb => sub {
            my $receive = shift;
            ...
        },
    },
);

AnySan->run;
AnySan->register_listener(
    hokkaidopm => {
        event => 'timeline',
        cb => sub {
            my $receive = shift;
            return if $receive->message =~ /^RT\s+/;
            $receive->send_reply(sprintf 'RT %s: %s', $receive->from_nickname, $receive->message);
        },
    },
);

Demo

ほかにも

IRC bot

例: IRC botを駆使すると捗るらしいので手始めにlleval bot作った - Islands in the byte stream

IRCはあまり使っていません。。

IRCのほかによく使うものといえば…

Skype

Skype

Skype bot?

AnySanはSkypeに対応していません

今回はAnySanでSkype botを書けるようにしてみます

SkypeのAnySan::Provider::を書く

CPANで「Skype」を検索してみる

Skypeは少し複雑でプラットフォームごとに違いがある

マルチプラットフォームに対応しているモジュールが欲しい

Skype::Anyというモジュールを書いています

注意: Skype for Macに対応していません

Skype::Anyを使って
AnySan::Provider::Skypeを書きました

基本的にはこんな感じ

use strict;
use warnings;
use AnySan;
use AnySan::Provider::Skype;

my $skype = skype;

AnySan->register_listener(
    url => {
        event => 'chatmessage',
        cb => sub {
            my $receive = shift;
            ...
        },
    },
);

AnySan->run;

例: URLを貼りつけたらすぐにそのタイトルを教えてくれるbotを書く

use strict;
use warnings;
use AnySan;
use AnySan::Provider::Skype;
use LWP::UserAgent;
use URI::Find;

my $ua = LWP::UserAgent->new;
my $finder = URI::Find->new(sub {
    my $url = shift;

    my $res = $ua->get($url);
    return $res->code unless $res->is_success;

    my ($title) = $res->decoded_content =~ m!<title>(.*)</title>!i;
    return $title;
});

my $skype = skype;

AnySan->register_listener(
    url => {
        event => 'chatmessage',
        cb => sub {
            my $receive = shift;
            my $message = $receive->message;
            if ($finder->find(\$message)) {
                $receive->send_reply($message);
            }
        },
    },
);

AnySan->run;

Demo

Skype::Anyはもう少ししたらGithubにあげます

まとめ

ありがとうございました