Skype::AnyでSkype botを作る
どうもこんにちは。akiymです。今日はSkype::Anyというモジュールを紹介します。
みなさん、Skypeは使っていますよね。IRC?いやいや、Skypeですよね。IRC botを作ってみたという話はよく聞きますが、Skype botを作ってみたという話はあまり聞きませんね。ということで、Skype::AnyでSkype botを作ってみましょう。
はじめに
まずはじめに、Skype APIについて少し知っておく必要があります。
Skype objectの種類
- USER
- PROFILE
- CALL
- CHAT
- CHATMEMBER
- CHATMESSAGE
- VOICEMAIL
- SMS
- APPLICATION
- GROUP
- FILETRANSFER
例えば、相手から送られてきたメッセージはCHATMESSAGEに分類されます。相手自身はUSERに分類されます。
Skype::Anyでは、相手からCHATMESSAGEに分類されたものはSkype::Any::ChatMessageのオブジェクトになります。Skype::Any::ChatMessageオブジェクトからは送ってきた人の名前やメッセージの内容、タイムスタンプを取得することができます。
注意: Skype for Macに対応していません。
使い方
メッセージを送る
use Skype::Any; use Skype::Any::User; my $skype = Skype::Any->new; # echo123にメッセージを送る my $user = Skype::Any::User->new('echo123'); $user->send_message('どうもー');
自動返信
use Skype::Any; my $skype = Skype::Any->new; # メッセージが送られてきたら $skype->message_received(sub { my $self = shift; $self->chat->send_message('おはよう'); }); $skype->run;
$skype->run というものが出てきました。これはイベントループ開始の合図です。
また、誰がメッセージを送ったのが知りたいですね。メッセージの内容も知りたいです。そんなときには、$self->from_handleや$self->bodyで取得することができます。ちなみに、message_receivedの場合、$selfはSkype::Any::ChatMessageオブジェクトです。
先ほどの例では、ただ返信することしかできなかったはずです。しかし、Skypeには1対1でチャットをしたり、グループチャットをするときがあります。それぞれ区別して返信したいですね。
use Skype::Any; my $skype = Skype::Any->new; $skype->received_message(sub { my $self = shift; my $chat_type = $self->chat->type; if ($chat_type eq 'DIALOG') { # チャット } elsif ($chat_type eq 'MULTICHAT') { # グループチャット } }); $skype->run;
グループチャットから個人宛にメッセージを送りたいときもありますね。
use Skype::Any; use Skype::Any::User; my $skype = Skype::Any->new; $skype->received_message(sub { my $self = shift; my $user = Skype::Any::User->new($self->from_handle); $user->send_message('個人にメッセージを送ります'); }); $skype->run;
ここで、ちょっとした例を書いてみます。URLを貼り付けるとタイトルを教えてくれるbotです。とても簡単に書けますね。
use Skype::Any; 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::Any->new; $skype->message_received(sub { my $self = shift; my $body = $self->body; # URLがあったらタイトルに置き換える if ($finder->find(\$body)) { $self->chat->send_message($body); } }); $skype->run;
基本的なことはSkype::Anyで簡単にできますが、凝ったことをしたいときにはSkype APIを叩いてあげる必要があります。
use Skype::Any; my $skype = Skype::Any->new; # 通話を録音する $skype->call(status => sub { my ($self, $status) = @_; if ($status eq 'INPROGRESS') { $self->send_command(qq(ALTER CALL $self->{id} SET_CAPTURE_MIC FILE="/tmp/call.wav")); } });
Skype APIを叩きたいときには、このようなものを書くと便利です。対話形式でSkype APIを叩くことが出来るようになります。
use Skype::Any; use Term::ReadLine; my $skype = Skype::Any->new; my $term = Term::ReadLine->new; while (defined(my $cmd = $term->readline('Skype> '))) { print $skype->send_command($cmd), "\n"; }
まとめ
あなたも今日からSkype::AnyでSkype botハッキング!
Macに対応していないのが心残りですが。。*1
最後にすばらしいbotの例を書いて終わりにします。
use strict; use warnings; use Skype::Any; use Skype::Any::User; my $skype = Skype::Any->new; my $username = 'echo123'; # 嫌いな人をどうぞ! my $user = Skype::Any::User->new($username); while (1) { $user->send_message(':)'); }