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

量産型エンジニアの憂鬱

きっと僕は何物にもなれない。

perlでSlackの雑談Bot作ってみた

前回の記事perlでSlackのbotを作ることができるモジュールを紹介しました。

今回はこれを使って雑談Botを作ります。
雑談用のAPIdocomoさんが提供している雑談対話APIを利用しました。

雑談対話APIを利用するにはここから開発者登録する必要があります。法人情報(会社の情報)は登録しなくても大丈夫でした。
登録時に「雑談対話」を選択します。申請後、API keyが取得できます。

早速、APIを利用した雑談Botを紹介します。

作成したスクリプト全体

#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';

use Slack::RTM::Bot;

use Encode;
use JSON;

use HTTP::Request;
use LWP::UserAgent;

our $ua = LWP::UserAgent->new();

our $api_key = '<docomo Developer supportで取得したAPI key>';
our ($context, $mode) = ('','');

my $bot = Slack::RTM::Bot->new(
    token => '<SlackのAPI Token>'
);

$bot->add_action(
    {
        channel => 'general',
        type => 'message',
        user => '^(?!perl_bot).*$',
        text => '.*'
    }, sub {
        my ($response) = @_;
        my $request = HTTP::Request->new('POST', 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=' . $api_key);
        $request->content(JSON::to_json( {
                        utt     => Encode::encode_utf8($response->{text}),
                        mode    => "$mode",
                        context => "$context"
                }));
        my $res = $ua->request($request);
        my $content = JSON::from_json($res->content);
        $context = $content->{context};
        $mode    = $content->{mode};

        $bot->say(
            channel => 'general',
            text    => $content->{utt}
        );
    }
);

$bot->start_RTM;

sleep 300;

$bot->stop_RTM;

コードの一部ずつ

Slack::RTM::Botadd_actionでgeneralに何か書き込まれたときに反応するようにしています。  

{
    channel => 'general',
    type => 'message',
    user => '^(?!perl_bot).*$',
    text => '.*'
}

コールバックではSlackから取得したメッセージをdocomoの雑談会話APIに投げています。
このとき、modecontextを指定することで、会話のラリーが続くようになります。

my ($response) = @_;
my $request = HTTP::Request->new('POST', 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=' . $api_key);
$request->content(JSON::to_json( {
                utt     => Encode::encode_utf8($response->{text}),
                mode    => "$mode",
                context => "$context"
        }));
my $res = $ua->request($request);

取得したレスポンスはJSON形式なのでハッシュリファレンスにし、modecontextを取得しています。

my $content = JSON::from_json($res->content);
$context = $content->{context};
$mode    = $content->{mode};

あとは雑談会話APIから取得したメッセージをSlackに流すだけ。Slack::RTM::Botsayが使えます。

$bot->say(
    channel => 'general',
    text    => $content->{utt}
);

コールバックの設定の後は、RTMの開始と終了。ここでは5分間のみにしています。

$bot->start_RTM;

sleep 300;

$bot->stop_RTM;

さて、早速起動。
f:id:duck8823:20160625125543g:plain

とりあえず動いているっぽい。