読者です 読者をやめる 読者になる 読者になる

Skype::Any現状

Macでは使えませんが、Linuxでは使えます(手元で動きました)。
MacのSkypeはバージョンアップして、レスポンスが非同期で返ってくるようになったので(仕様らしいです。うえー)、Mac環境では思ったように動きません。メッセージを送信だけするといったことは可能ですが。
ってことで現状でした。

Skype::Anyのよくないところ

Skype::Anyのよくないところは、ドキュメントを書いてないところだと思うので、いまさらですが、解説不足だったところを解説します。


基本的にSkype APIではメッセージを送るときにはチャットのidが必要です。

Skype::Any::Chat->new($id);

しかし、チャットのidは普段見ることができません。このidは内部的なものだからです。Skype APIを使って見ることができますが、とりあえず、idを作る方法を説明します。
例えば、echo123とのチャットのidはこのようにして見ることができます。$user->chat()で、チャットを*作る*ことができます。
$chatは、Skype::Any::Chatオブジェクトなので$chat->send_message()でメッセージを送信することができます。

my $user = Skype::Any::User->new('echo123');
my $chat = $user->chat;
$chat->{id};
$chat->send_message('hello!');

$user->chat()をいくら呼んでもecho123とのチャットのidは変わりません。
それでは、グループチャットの場合はどうなるでしょうか。先ほどの例は、1対1のチャットでした。複数の人とのチャットの場合はこのようになります。
ユーザー名をカンマで区切るだけです。あとは同じです。

my $user = Skype::Any::User->new('echo123,t.akiym');
my $chat1 = $user->chat;
$chat1->{id};
$chat1->send_message('hello!');
my $chat2 = $user->chat;
$chat2->{id};
$chat2->send_message('good bye!');

グループチャットの場合は$user->chat()のたびにチャットのidが変わります。つまり、新しいチャットが作成されてしまうということです。注意してください。
以上がチャットを新しく作成する方法です。でも、Botが発言するたびに新しいチャットが作成されるの嫌ですよね。
そんなときは、チャットのidからSkype::Any::Chatオブジェクトを作成します。そうすることですでに存在するチャットにに対して$chat->send_message()でメッセージを送信することができます。

my $chat = Skype::Any::Chat->new('#t.akiym/$d0656290604bd99b');
$chat->send_message('XD');

しかし、チャットのidは内部的なものです。普段見ることはできません。
ここでtipsを紹介します。このようにすることで最近のチャット履歴からチャットのidを見ることができます。@chatsにSkype::Any::Chatのオブジェクト(すでに存在するチャット)が入っています。
ちなみに、$skype->send_command()はSkype APIを直で叩くことができるメソッドです。

my $skype = Skype::Any->new;
my $res = $skype->send_command('SEARCH RECENTCHATS');
$res =~ s/^CHATS\s+//;
my @chats = map { Skype::Any::Chat->new($_) } split /,\s+/, $res;

ほかの方法としては、$skype->message_received()はコールバックにSkype::Any::ChatMessageのオブジェクトを渡してくれるのでそこから$msg->chat()でSkype::Any::Chatのオブジェクトを取ってくるのもありでしょう。$msg->chat()はいくら呼んでも新しいチャットが作られることはありません(1対1でもグループチャットでも)。

my $skype = Skype::Any->new;
$skype->message_received(sub {
    my ($msg) = @_;
    $msg->chat;
    $msg->chat->send_message();
});

最後に

せっかくなので、Skype::Anyを使ったSkype botのサンプルをGithubにあげました。適当に書いたものなので勘弁してください。
akiym/p5-skypebot · GitHub