Slackを独自アプリケーションで拡張する
チャットBotを作成する
チャット内で任意のメッセージに反応する仕組みを作るには、チャットBotというプログラムが便利です。SlackではBot Userを作成し、そのBotユーザーとして動作するプログラムを作成します。
Bot Userを作成する
Building Slack apps(https://api.slack.com/slack-apps)画面の「Create a Slack app」ボタンをクリックして、アプリを作成します。
次の画面で「Create New App」ボタンをクリックするとダイアログが表示されます。そこで、アプリケーションの名前(ここでは ferretbot)とワークスペースを指定して「Create App」ボタンをクリックします。
これで、ferretbotという名前のSlackアプリケーションが作成されます。設定画面でアプリケーションの用途を指定します。ここではBotsを指定します。
続いてBotユーザーを追加するため、「Add a Bot User」ボタンをクリックします。
次の画面でBotユーザーのユーザー名と表示名を指定します(ここではferretbot)。「Add Bot User」ボタンをクリックして、ユーザー名などの情報を保存します。
画面左上の Basic Information をクリックして、元の画面に戻ります。Install your app to your workspace をクリックしてメニューの詳細を表示し、「Install App to Workspace」ボタンをクリックしてアプリケーションをインストールします。
次の画面で、作成したBotユーザー(ferretbot)のワークスペースへの追加を確認する認証画面が表示されるので、「Authorize」ボタンをクリックして許可します。
Slackの画面でサイドバーを見てみると、Appsにferretbotが追加されたことが確認できます。
Basic Information画面に戻り、画面下部のアイコンを設定する箇所(Display Information)で、Botユーザーにアイコンを設定します。ここでは、素材のプチッチ(http://putiya.com/html/animal/animal_feretto_cute01b_02.html)のフェレットイラストを使わせてもらいました。
次に、画面左側のメニューから「Install App」をクリックします。この画面に表示してある、Bot User OAuth Access Token(xoxb-
から始まる文字列)をコピーします。このTokenを使用してSlackとメッセージの送受信を行います。
最後にSlackで任意のチャンネルに、Botユーザー(ferretbot)を招待します。
ここまででBotユーザーの作成は完了です。次は実際にプログラムを作成して、チャットBotが動作するようにします。
Botプログラムを作成する
チャットBotのプログラムを作成します。何もないところからチャットBotのプログラムを作成するのは大変なので、今回はSlackのチャットBot作成に便利なフレームワークを使用します。以下にいくつか紹介します。
- Botkit(https://github.com/howdyai/botkit):JavaScript製
- slack-ruby-bot(https://github.com/slack-ruby/slack-ruby-bot):Ruby製
- slackbot(https://github.com/lins05/slackbot):Python製
他にも様々なプログラミング言語用のフレームワークやライブラリーが存在するので、Library and Tools(https://api.slack.com/community)のページを参照してください。
ここでは、Pythonで作られたslackbotを用いてBotプログラムを作成します。
環境を用意する
まずはPythonをインストールして、slackbotライブラリーをインストールします。PythonはPython 3系を使用してください。Pythonのインストール手順は、下記のページを参照してください。
- 1.3 Pythonのインストール - Python Boot Camp Text(http://pycamp.pycon.jp/textbook/1_install.html#python-install)
次にBotを開発するためのPython仮想環境(venvといいます)を作成します。ferretbotというディレクトリの下に「venv」という名前の仮想環境を作成します。その後、仮想環境に「slackbot」というライブラリーをインストールします。pip install slackbot
を実行すると、依存する各種ライブラリーをインターネットからダウンロードしてslackbotがインストールされます。
$ mkdir ferretbot # ferretbot ディレクトを作成 $ cd ferretbot $ python3.6 -m venv venv # venv という名前の仮想環境を作成 $ source venv/bin/activate # 仮想環境を有効にする→プロンプトが変わる (venv) $ pip install slackbot # slackbot をインストールする
仮想環境についての詳細は、下記のページを参照してください。
- 6. サードパーティ製パッケージと venv - Python Boot Camp Text(http://pycamp.pycon.jp/textbook/6_venv.html)
単純なBotプログラムを作成する
まずは単純な応答をするBotプログラムを作成してみます。Botの元となるコードをrun.py
というファイルに以下のように記述します。
from slackbot.bot import Bot def main(): bot = Bot() bot.run() if __name__ == "__main__": main() cat //} //list[slackbot-settings-py][slackbot_settings.py]{ # SlackのBot User OAuth Access Tokenを設定 API_TOKEN = "xoxb-XXXXXXXXX-YYYYYYYYYYYYYY" # プラグインのパッケージ名を指定 PLUGINS = [ 'ferretbot.plugins', ]
slackbotではプラグインとして様々な応答をするプログラムを作成します。まずは簡単な挨拶に応えるプラグインを作成します。このファイルはferretbot/plugins/
ディレクトリの下に作成します。このディレクトリに作成したプラグインは、Botプログラム起動時に自動的に読み込まれます。
from slackbot.bot import respond_to from slackbot.bot import listen_to # メンションでの「こんにちは」に反応する @respond_to('こんにちは') def hello(message): # 応答メッセージとしてメンションで返す message.reply('こんにちはー') # メッセージに「おはよう」があると反応する @listen_to('おはよう') def help(message): # 通常のメッセージとして送信する message.send('おはようございます')
このプログラムについて少し解説します。respond_to()
、listen_to()
は、どちらもBotプログラムがどういうメッセージの文字列に反応するかを指定しています。前者はBotユーザー(ferretbot)に対してのメンションのみに反応しますが、後者は通常のメッセージ中に「おはよう」という文字列があると反応します。反応した時のメッセージ送信には、それぞれ異なるメソッドが使われています。reply()
は指定したメッセージをメンションで返し、send()
は通常のメッセージとして送信します。
また、ferretbot/plugins/
ディレクトリに空の__init__.py
を作成します。このファイルは、プラグインを読み込むために必要です。
では実際にBotプログラムを動かしてみましょう。先ほど作成した仮想環境(venv)が有効な状態で、bot.py
を実行します。
(venv) $ python run.py
正常に動作すると、SlackチャンネルにいるBotユーザー(ferretbot)のアイコンがアクティブになります。Slackで話しかけると、「あいさつプラグイン」の内容にあわせて、あいさつを返してくれます。
これで、Slackで会話するBotプログラムが動くようになりました。あとは「あいさつプラグイン」を拡張したり、他の動作をするプラグインを追加することで、Botに様々な動作をさせることができます。
確認のために、現在のファイル/ディレクトリ構成を以下に示します。
. ├── ferretbot │ └── plugins # プラグインを格納するディレクトリ │ ├── __init__.py # プラグインを読み込むためのファイル │ └── hello.py # あいさつプラグイン ├── run.py # Botプログラムの実行プログラム ├── slackbot_settings.py # 設定ファイル └── venv/ # Python仮想環境用のファイル群
プラグインを追加する
ここから、簡単な機能のプラグインをいくつか作成してみます。プラグインのプログラムはferretbot/plugins/
に格納します。
まずは、絵文字のリアクションするプラグインを作成してみましょう。Slackbotはmessage.react('絵文字')
と書くことで、メッセージに対して絵文字でのリアクションができます。以下のようなプログラムをferretbot/plugins/reaction.py
に保存して、Botプログラムを実行します。
from slackbot.bot import listen_to @listen_to('カレー') def curry(message): """カレーの絵文字でリアクションする""" message.react('curry') @listen_to('ビール') def beer(message): """ビルの絵文字でリアクションする""" message.react('beer')
メッセージの中に「カレー」「ビール」の文字列が含まれていると、ferretbotが絵文字でリアクションしてくれます。
メッセージの中身を受け取るプラグインを作成します。Slackbotのrespond_to、listen_toの引数に正規表現を用いることで、メッセージの一部をパラメーターとして取得できます。
from slackbot.bot import respond_to @respond_to('(.*)ちょうだい') def giveme(message, something): message.reply('{}あるよー'.format(something))
このプラグインを有効にすると、ferretbotに対して「~ちょうだい」というメッセージを送ると「~あるよー」というように返してくれます。
ここでは例として単純なプラグインのプログラムを紹介していますが、アイデア次第で様々な動作をBotプログラムにさせることが可能です。ぜひ、独自のBotプログラムを作ってSlackを便利に活用してみてください。
ここで作成したferretbotのコードは、下記のURLで公開しています。
- ferretbot https://github.com/takanory/ferretbot
また、筆者が作成しているBotのプログラムを下記のURLで公開しています。このBotプログラムは、PyCon JPというイベントのスタッフが参加するSlackで使用しています。データベース(sqlite)や、Google、Jira、Wikipediaなどの各種APIも使用しているので、参考にしてみてください。
- pyconjpbot https://github.com/pyconjp/pyconjpbot
Slackを公開チャットにする
Slackのワークスペースに参加するには招待メールを送ってもらうか、あらかじめ登録されたドメインのメールアドレスを持っている必要があります。この仕様はクローズドなチャットには適していますが、Slackをコミュニティのメンバーが参加できるオープンなチャットとして使用するのには不便です。
そこで、SlackのAPIを使用して自動的に招待メールを送信する機能を作成します。大きく分けると、以下の2種類の方法があります
- slackin:Herokuなどにデプロイできる招待メール送信専用の小さなWebサーバー(https://github.com/rauchg/slackin)
- Googleフォーム:Googleが提供する汎用的なフォーム
今回は、Googleフォームを使用した自動招待メールの送信機能について説明します。
SlackのAPIトークンの取得
まずは、APIトークンを作成します。下記のURLにアクセスし「Create token」ボタンを押してLegacy token(xoxp-
から始まる文字列)を生成します。
Googleフォームを作成する
次にGoogleフォームを作成します。Googleドライブ(https://drive.google.com/)にアクセスします。「新規→その他→Googleフォーム」を選択して、Googleフォームを新規作成します。
Googleフォームを編集し、タイトルと入力項目としてメールアドレスを指定します。以下のように設定しました。
- 記述式
- メールアドレス形式でチェック
- 必須
次にこのフォームに書き込まれたときに、招待メールを送信するプログラムを作成します。Googleフォームにプログラムを書くには、メニューから「スクリプト エディタ...」を選択します。
スクリプトには以下のような内容を記述します。workspaceには使用しているSlackワークスペースのドメインを、tokenには先ほど作成したLegacy tokenを指定します。
var workspace = "your-domain.slack.com"; var token = "xoxp-XXXXXX-YYYYY"; function submitForm(e){ var itemResponses = e.response.getItemResponses(); var itemResponse = itemResponses[0]; var email = itemResponse.getResponse(); var url = "https://" + workspace +"/api/users.admin.invite" var payload = { "email": email, "token": token, "set_active": true } var options = { "method": "post", "payload": payload } UrlFetchApp.fetch(url, options); }
このスクリプトとGoogleフォームを関連付けます。メニューから「編集→現在のプロジェクトのトリガー」を選択します。
するとプロジェクトのトリガーを設定するためのダイアログが表示されます。「トリガーが設定されていません...クリックしてください。」のテキストをクリックします。
フォームから送信された時に先ほど作成したsubmitFormが事項されるようにトリガーを設定します。「保存」ボタンをクリックするとGoogleでの権限の確認画面が表示されます。権限を許可するとトリガーが設定され、フォームにメールアドレスを登録すると招待メールが送信されるようになりました。
Googleフォームの動作を確認する
Googleフォームにメールアドレスを入力して、招待メールが送信されるか動作確認します。なお、Slackに登録済のメールアドレスには招待メールは送信されないため、example+invite@gmail.com
のように、Gmailの場合は+任意のキーワード
を使用して、別のメールアドレスを指定してください。
スクリプトが正常に動作すると入力メールアドレスに対してSlackから招待メールが届きます。あとは「Join Now」ボタンをクリックすれば、Slackワークスペースに参加できます。
以上で、Googleフォームを使用して任意のSlackワークスペースの招待メールを自動送信できるようになりました。あとはコミュニティなどのWebページにこのGoogleフォームへのリンクを載せれば、誰でもワークスペースに参加できるようなります。
まとめ
今回はSlackの各種APIを使って、Slackと連携する独自アプリケーションを作成する方法について開設しました。Slackは多数のAPIが提供されており、メッセージの表現方法も多彩です。全てを一度に理解することは難しいですが、ドキュメントは整備されているので必要に応じて少しずつ理解を深めていくことがおすすめです。
今回はcurl、Python、Google Appsスクリプト(JavaScript)と様々な方法でSlackのAPIを使用しました。これ以外に使い慣れているプログラミング言語があれば、ぜひその言語を使ってSlackと連携するアプリケーションを作成してみてください。
今回で連載「基礎から応用までしっかり学ぶSlack入門」は終了です。ぜひ、このサービスを便利に楽しく使いこなして、仕事やコミュニティ活動に役立ててもらえればと思います。