PerlでSlackBot

はじめに

この記事は,kstm Advent Calendar 12日目の記事として書かれました.

qiita.com

目次

  1. PerlでSlackの会話Botを作る?
  2. Slack tokenを得る
  3. Slack::RTM::Bot モジュール
  4. 最後に
  5. 参考

PerlでSlackの会話Botを作る?

私の研究の関係でSlackの会話Botを作ることになりました. 研究で使っているツールは主にPythonやJSで作っているのですが,そのためにPerlをここ最近書けていませんでした. そこで,Slack BotPerlで作ろうと思い行動してしまった次第です.

Slack tokenを得る

SlackでBotを作るにあたって,Tokenが必要になります. Slackには2つのTokenがあり,一つは現在Slackが推奨している権限を細かく決めることができる物で,もう一つはほぼ全ての機能が使えてしまうLegacy番があります.SlackのLegacy Tokenのページの冒頭には非推奨であるこことが掲示されています.

推奨

基本的には*1と同じ内容になります.

  1. https://api.slack.com/apps
  2. Create New App
  3. Development Slack Team
  4. Create App

重要なのはスコープの設定です. 左側のリストの中から,Features > OAuth & Permissionsに飛び, Scopesの項目のSelect Permission Scopesから必要な権限を選びます.

今回必要になる権限は2つ.

  1. Access user's public channels.
  2. Add a bot user with the username @bot_name

これらを追加してSave Changesを押します.

最後にInstall App to Team > Authorizeに進み,tokenを取得します.

Slackの画面のAppの欄に今作ったBotが増えているので,Botを利用したいチャンネルにこのBotを参加させます.

非推奨 レガシー番

非推奨なので割愛. こちらをご覧ください.

Slack::RTM::Bot モジュール

今回使うモジュールはSlack::RTM::Bot

use strict;
use warnings;
use Slack::RTM::Bot;
use Data::Dumper;
use utf8;

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

$bot->on(
    {
        channel => 'random',
        text => qr/.*/
    },
    sub {
        my ($res) = @_;
        print Dumper $res;
        
        if($res->{text} eq 'Hello') {
            $bot->say(
                channel => 'random',
                text => 'World.'
            );
        } else {
            $bot->say(
                channel => 'random',
                text => 'Slack.'
            );
        }
    }
);

$bot->start_RTM;
sleep 60;
$bot->stop_RTM;
exit;

$bot->on();でどのチャンネルのどんなtextに反応するかを決めます.

$bot->say();でどのチャンネルにどんなtextを書き込むかを決めます.

$bot->start_RTM;でBotを起動するのですが,このプログラムが起動している間, Slackとコネクションが繋がり,Botが動きます. ずっと動かすならば,

while(1) {sleep 60;}

などにしておくといいでしょう.

今回はrandomチャンネルにHelloと書かれるとWorldと返し, それ以外の場合はSlackと返すようになっています.

$bot->on();のtext=>''の部分で条件を付けるのですが,今回はif文で条件を分岐しています.

最後に

YAPC::Tokyoに参加します. yapcjapan.org

kstm Advent Calendar 1日目の記事に「学会にいこう」 と言う記事があります. 学会もカンファレンスも自分の知見を広め深める場です.selee氏の記事の通り学生特権があるので,早いうちから参加するといいと思います.

明日はugwis氏の「6桁の数字を読み取る」です.

参考

  1. Slack API 推奨Tokenについて
  2. Slack APIのTokenの取得・場所
  3. perlで簡単にSlack Botを作るモジュールを公開した
  4. PerlでSlackの雑談Bot作ってみた