Shogo's Blog

たぶんプログラミングとかについて書いていくブログ

IRCに癒やしボットを入れてみた

別チームがIRCに癒やしボットを入れてたので、自分のチームのチャンネルにも入れてみた。

Instagramに登録する

InstagramのDeveloperサイトに開発者として登録します。 Authentication のページを見ながら、Server-side (Explicit) Flow を参考にアクセストークンを取得します。

Instagram APIを叩く

https://api.instagram.com/v1/tags/$TAGNAME/media/recent?access_token=YOUR_ACCESS_TOKENを叩くと TAGNAMEに関連する画像の情報がJSONで帰ってくるので、 Perlからこのエンドポイントを叩きます。 IRCとのやりとりにはUnazuSanを使いました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
!/usr/bin/env perl
use 5.014;
use warnings;
use strict;
use utf8;
use Encode qw/encode_utf8/;
use Furl;
use JSON;

use UnazuSan;

sub neko {
    state $data = undef;
    state $time = 0;
    if( !$data || time - $time > 60 * 60) {
        $time = time;
        my $furl = Furl->new;
        my $res = $furl->get('https://api.instagram.com/v1/tags/%E7%8C%AB/media/recent?access_token=YOUR_ACCESS_TOKEN');
        my $hash = JSON::decode_json($res->content);
        $data = $hash->{data};
    }
    my $media = $data->[rand(scalar @$data)];
    return $media->{images}{standard_resolution}{url};
}

my $unazu_san;
my $NICKNAME = 'iyashi';
$unazu_san = UnazuSan->new(
    host       => '127.0.0.1',
    enable_ssl => 1,
    join_channels => ['#test'],
    respond_all   => 1,
    nickname      => $NICKNAME,
);

$unazu_san->on_message(
    qr/^\s+$NICKNAME:/ => sub {
        my $receive = shift;
        $receive->reply('うんうん');
    },
    qr/(.*)/ => sub {
        my ($receive, $match) = @_;
        say $match;
        say $receive->message;
    },
);

$unazu_san->on_command(
   ' 癒やし' => sub {
        my ($receive, @args) = @_;
        $receive->reply(neko());
    }
);

$unazu_san->run;

「癒して」と話しかけると猫画像を検索して返してくれます。

引数をMeCabで解析する

1
2
acidlemon unazu_san: 癒やしをうさぎで頼む
acidlemon ネコやん! ('-'#)

みたいなことがあったので、「癒して」のあとも見ることにしました。 MeCabを使って名詞っぽいものを抽出して、タグ名に使います。

1
2
3
4
5
6
7
8
9
10
11
12
state $mecab = Text::MeCab->new();

my $n = $mecab->parse(join ' ', @_);
my $keyword = undef;
while ($n) {
    my $f = decode_utf8 $n->feature;
    $keyword //= decode_utf8($n->surface) if ($f =~ /^名詞,/) && ($f !~ /^名詞,代名詞,/);
    $n = $n->next;
}
$keyword //= '猫';
my $word = uri_escape_utf8($keyword);
my $res = $furl->get("https://api.instagram.com/v1/tags/$word/media/recent?access_token=ACCESS_TOKEN");

これで癒やしをうさぎで頼まれてもウサギ画像を返せるようになりました。

Comments