前書き(飛ばしていいです)
slackbotといえばhubot!
そんなふうに考えていた時期が俺にもありました
Hubotは 髪! 神!
とはいえ、今から CoffeeScript を学ぶのは難しい。
なにせ、プロトタイプ作成納期が21日(作ることになったのが18日の日が落ちたあと)。
やってやれないこともないだろうけど、実装する機能の勉強時間を考えるとかなり厳しい。
アドベントカレンダーも書かなきゃいけないし。
いずれHubotに載せ替えるとしても、今はPythonでやりたい。
あります。あるんです。Pythonで使えるSlackbotライブラリが!
PythonのslackbotライブラリでSlackボットを作る
このページを参考に、Pythonを使ってSlackbotを作ってみました。
Slackで利用するBotアカウントを作成
まずは、Botとして受け答えしてくれるインターフェースを作らなければ何もできません。
ここからBotアカウントを作成します。
ワークスペースにサインインしていない場合、先ずサインインします。
Botアカウントの名前を入れて、ボットインテグレーションを追加します。
APIトークンが発行されるので、それをメモしておきます。
このBotアカウントのトークンを使うことが、1つめのコツになります。
考えてみたら当たり前なのですが、古い情報ですとレガシートークンを利用したりしていますので、注意が必要です。
slackbotのインストール
おなじみ、pipを利用してインストールします。
# pip3 install slackbot
これだけ。
ディレクトリ構造の作成
以下の形で作成します。
slackbot
├ run.py
├ slackbot_settings.py
├ plugins
│ ├ __init__.py
│ └ my_mention.py
└ libs
├ __init__.py
└ my_functions.py
slackbot: トップレベルディレクトリ。名前は何でも良いです。
run.py: slackbotを起動するためのファイル。
slackbot_settings.py: slackbotの設定用ファイル。
plugins: botの機能を追加するためのディレクトリ。
my_mention.py: slackbotの機能ファイル。名前は何でも良いです。
libs: my_mentions.pyから呼び出すモジュールの配置ディレクトリ。適当に作りました。
my_functions.py: 裏で動くためのモジュールファイル。適当に作りました。
初期設定
# -*- coding: utf-8 -*-
from slackbot.bot import Bot
def main():
bot = Bot()
bot.run()
if __name__ == "__main__":
print('start slackbot')
main()
# -*- coding: utf-8 -*-
# botアカウントのトークンを指定
API_TOKEN = "xxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"
# このbot宛のメッセージで、どの応答にも当てはまらない場合の応答文字列
DEFAULT_REPLY = "何言ってんだこいつ"
# プラグインスクリプトを置いてあるサブディレクトリ名のリスト
PLUGINS = ['plugins']
起動確認
$ python3 run.py
エラーなく、start slackbot
と表示されれば問題ありません。
Ctrl+C
で終了します。
メンションの作成
# -*- coding: utf-8 -*-
from slackbot.bot import respond_to # @botname: で反応するデコーダ
from slackbot.bot import listen_to # チャネル内発言で反応するデコーダ
from slackbot.bot import default_reply # 該当する応答がない場合に反応するデコーダ
from libs import my_functions # 外部関数の読み込み
# @respond_to('string') bot宛のメッセージ
# stringは正規表現が可能 「r'string'」
# @listen_to('string') チャンネル内のbot宛以外の投稿
# @botname: では反応しないことに注意
# 他の人へのメンションでは反応する
# 正規表現可能
# @default_reply() DEFAULT_REPLY と同じ働き
# 正規表現を指定すると、他のデコーダにヒットせず、
# 正規表現にマッチするときに反応
# ・・・なのだが、正規表現を指定するとエラーになる?
# message.reply('string') @発言者名: string でメッセージを送信
# message.send('string') string を送信
# message.react('icon_emoji') 発言者のメッセージにリアクション(スタンプ)する
# 文字列中に':'はいらない
@respond_to('メンション')
def mention_func(message):
message.reply('私にメンションと言ってどうするのだ') # メンション
@listen_to('リッスン')
def listen_func(message):
message.send('誰かがリッスンと投稿したようだ') # ただの投稿
message.reply('君だね?') # メンション
ここのポイントは、外部モジュールを読み込む際にfrom libs import <モジュール名>
にする事です。
run.pyから起動しているため、run.pyから見た相対パスで読み込む必要があります。
run.pyを起動して、このように反応したら成功です。
あとは、アイデア次第です。
Enjoy your bot!