Hello Wor.log

IT系大学生4人による備忘録のようなもの

PythonでSlackBOTを作る

こんにちは、お久しぶりです。CPPXのCです。 今回はPythonで作るSlack BOTについてのお話をします。

備忘録的に書いていくので、これから作るぞ!って人にはあまり参考にならないかも。 ただし、このBOT自体は写経していくだけでも簡単に動くようなものなので、あまり詰まることはないと思います。ぼくはトークン取得が一番手間取りました。

では本題に入っていきましょう。

概要

そもそもSlack BOTとはなんぞやという話です。 この記事を読んでいる人が知らないとは思えませんが、一応説明しておくと、Slackのチャンネルに常駐させ、事前に決めておいた文言がチャット内に現れると、事前に入力しておいた応答を返すものを言います。 文字通り典型的なBOTというやつです。

今回はそれをPythonを使って簡単に作ってみましょうという記事になります。 SlackにはBOTを簡単につくれるサービスもあるみたいですが(しかも結構高機能なような)、そんなことは知りません。Pythonが好きだからPythonで作ってやろうという話です。

一応Pythonで作ることにメリットはあって、Pythonで動かせるようなものなら何でもBOTの機能に取り込めるというとこがウリです。なんならテーブルゲームゲームマスターとか、カードゲームのディーラーとかやらせることだってできます。好き放題です。

スクレイピングをしていろんなサイトから情報をとってきたりなんかもできちゃいます。攻撃にならない程度に抑えましょうね。

事前準備

Python環境の準備

事前準備をしましょう。まあ当然ですがPythonの環境と、ライブラリを入れる環境が必要です。pipで十分でしょう。

アカウントの取得

プログラムに触れる前にほかにやらなくてはならないことがあります。 Bot用のアカウントの取得です。自分のアカウントにBotの機能を付けたって別にいいですが、自分では遊べない感じになりますので、別のアカウントを取得してしまいましょう!

とはいえこれはSlackチームに別のアドレスで入ればいいだけですので割愛します。

トークンの取得

これが結構わかりにくいです。以下のリンクにBOTにしたいアカウントにログインしてからアクセスします。 すでにトークンがあればここに表示されます。複数チームに参加しているアドレスなら、複数チーム分が表示されます。1プロフィールにつき1個BOTを設定できるって感じですね。

Legacy Tokens | Slack api.slack.com

f:id:cppx:20170918210514p:plain
こんなやつです

Legacy Tokens に飛べない場合は、以下のリンクに飛びます。 Generate test Tokens なるものがあると思うので、それをクリックしましょう。トークンができるはずです。

Web API | Slack

api.slack.com

slackbotライブラリの準備

pip install slackbot 

をしておきましょう。使います。

準備ができたらさっそくプログラムを書いていきましょう!

構成

Slack BOTを作るためにはいくつかのファイルが必要です。以下のような構成にするといいでしょう。

slack-bot/
    ├─run.py
    ├─slackbot_settings.py
    └─plugins/
         ├─__init__.py
         └─my_mention.py

ソースコード

いよいよソースコードです。とはいえほとんど説明することがありません。以下のように書けばまあ動くでしょう。 コード中にコメント文と補足をすこし挟みます。

まずはslackbot_settings.py。

# slackbot_settings.py
# coding: utf-8

# botアカウントのトークンを指定
API_TOKEN = "xxxx-xxxx-xxxx-xxxx"

# デフォルトの返答
DEFAULT_REPLY = "BOT開発のテスト中です。この投稿は自動投稿です。"

# プラグインスクリプトを置いてあるサブディレクトリ名のリスト、リストなので複数可だけど、まとめなさいよ
PLUGINS = ['plugins']

BOTのセッティングです。特に説明することもないでしょう。 ここでセットしたデフォルトの返答はプラグイン内でセットすると上書きされますので注意。 基本はプラグイン内で設定することになります。

次に本体であるrun.py。

from slackbot.bot import Bot

def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    print("Start SlackBot")
    main()

BOTを走らせるメインプログラムですね。特筆することはないです。 BOTを動かすときはこれを起動していないといけません。ローカルでサーバーで動かす場合は動かしっぱなしなのであんまり気にしないとは思いますが、テストで何回も起動することになるので覚えておきましょう。

最後にpluginsの中のmy_mention.py。 BOTの返事や反応語句を決定するプログラムです。

# coding: utf-8

from slackbot.bot import respond_to  # メンションで反応
from slackbot.bot import listen_to  # チャンネル内発言で反応
from slackbot.bot import default_reply  # 該当する応答がない場合に反応

# @respond_to('string')     bot宛のメッセージ
#                           stringは正規表現が可能 「r'string'」
# @listen_to('string')      チャンネル内のbot宛以外の投稿
#                           メンションでは反応しないことに注意
#                           他の人へのメンションでは反応する
#                           正規表現可能
# @default_reply()          DEFAULT_REPLY と同じ働き
#                           正規表現を指定すると、他のデコーダにヒットせず、
#                           正規表現にマッチするときに反応

# message.reply('string')   @発言者名: string でメッセージを送信
# message.send('string')    string を送信
# message.react('icon_emoji')  発言者のメッセージにリアクション(スタンプ)する

@default_reply()
def default(message):
    message.reply("デフォルトの返答")

@listen_to("反応語句")
def listen(message):
    message.reply("返事")

@respond_to("反応語句")
def respod(message):
    message.reply("返事")

反応語句、返答ともに自由に設定できます。関数名はかぶっても大丈夫です。 ここでほかのプログラムを読んでゲームをさせたりなんてことも楽しそうです。 message.reactではリアクションを押してくれますが、同じリアクションを二度押そうとするとエラーが起きちゃうみたいなので、なるべく同じリアクションを押すような関数は作らないほうがいいでしょう。 反応語句を複数送ると、該当するすべての返事を返します。

とりあえずはこんな感じでしょうか? 気が向けばいろいろと追加していくので、気になったらまた見てください。

次の更新はいつになることやら。