Slackを独自アプリケーションで拡張する

2018年5月9日(水)
鈴木 たかのり
連載6回目となる今回は、Slackの機能を拡張するためにアプリケーションを作成する。

チャットBotを作成する

チャット内で任意のメッセージに反応する仕組みを作るには、チャットBotというプログラムが便利です。SlackではBot Userを作成し、そのBotユーザーとして動作するプログラムを作成します。

Bot Userを作成する

Building Slack apps(https://api.slack.com/slack-apps)画面の「Create a Slack app」ボタンをクリックして、アプリを作成します。

Slackアプリケーションを作成する

Slackアプリケーションを作成する

次の画面で「Create New App」ボタンをクリックするとダイアログが表示されます。そこで、アプリケーションの名前(ここでは ferretbot)とワークスペースを指定して「Create App」ボタンをクリックします。

ferretbotアプリケーションをこれで

ferretbotアプリケーションをこれで

これで、ferretbotという名前のSlackアプリケーションが作成されます。設定画面でアプリケーションの用途を指定します。ここではBotsを指定します。

アプリケーションの設定を行う

アプリケーションの設定を行う

続いてBotユーザーを追加するため、「Add a Bot User」ボタンをクリックします。

Bor Userを追加する

Bor Userを追加する

次の画面でBotユーザーのユーザー名と表示名を指定します(ここではferretbot)。「Add Bot User」ボタンをクリックして、ユーザー名などの情報を保存します。

ユーザー名を指定する

ユーザー名を指定する

画面左上の Basic Information をクリックして、元の画面に戻ります。Install your app to your workspace をクリックしてメニューの詳細を表示し、「Install App to Workspace」ボタンをクリックしてアプリケーションをインストールします。

アプリケーションをワークススペースに追加する

アプリケーションをワークススペースに追加する

次の画面で、作成したBotユーザー(ferretbot)のワークスペースへの追加を確認する認証画面が表示されるので、「Authorize」ボタンをクリックして許可します。

Botユーザーをワークスペースに追加する

Botユーザーをワークスペースに追加する

Slackの画面でサイドバーを見てみると、Appsにferretbotが追加されたことが確認できます。

サイドバーにferretbotが追加された

サイドバーにferretbotが追加された

Basic Information画面に戻り、画面下部のアイコンを設定する箇所(Display Information)で、Botユーザーにアイコンを設定します。ここでは、素材のプチッチ(http://putiya.com/html/animal/animal_feretto_cute01b_02.html)のフェレットイラストを使わせてもらいました。

Botユーザーにアイコンを設定する

Botユーザーにアイコンを設定する

次に、画面左側のメニューから「Install App」をクリックします。この画面に表示してある、Bot User OAuth Access Token(xoxb-から始まる文字列)をコピーします。このTokenを使用してSlackとメッセージの送受信を行います。

Bot User OAuth Access Tokenを確認する

Bot User OAuth Access Tokenを確認する

最後にSlackで任意のチャンネルに、Botユーザー(ferretbot)を招待します。

ferretbotを招待する

ferretbotを招待する

ここまででBotユーザーの作成は完了です。次は実際にプログラムを作成して、チャットBotが動作するようにします。

Botプログラムを作成する

チャットBotのプログラムを作成します。何もないところからチャットBotのプログラムを作成するのは大変なので、今回はSlackのチャットBot作成に便利なフレームワークを使用します。以下にいくつか紹介します。

他にも様々なプログラミング言語用のフレームワークやライブラリーが存在するので、Library and Tools(https://api.slack.com/community)のページを参照してください。

ここでは、Pythonで作られたslackbotを用いてBotプログラムを作成します。

環境を用意する

まずはPythonをインストールして、slackbotライブラリーをインストールします。PythonはPython 3系を使用してください。Pythonのインストール手順は、下記のページを参照してください。

次にBotを開発するためのPython仮想環境(venvといいます)を作成します。ferretbotというディレクトリの下に「venv」という名前の仮想環境を作成します。その後、仮想環境に「slackbot」というライブラリーをインストールします。pip install slackbotを実行すると、依存する各種ライブラリーをインターネットからダウンロードしてslackbotがインストールされます。

リスト5:slackbotのインストール

$ mkdir ferretbot              # ferretbot ディレクトを作成
$ cd ferretbot
$ python3.6 -m venv venv       # venv という名前の仮想環境を作成
$ source venv/bin/activate     # 仮想環境を有効にする→プロンプトが変わる
(venv) $ pip install slackbot  # slackbot をインストールする

仮想環境についての詳細は、下記のページを参照してください。

単純なBotプログラムを作成する

まずは単純な応答をするBotプログラムを作成してみます。Botの元となるコードをrun.pyというファイルに以下のように記述します。

リスト6: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プログラム起動時に自動的に読み込まれます。

リスト8:hello.py

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を実行します。

リスト9:Botプログラムを実行

(venv) $ python run.py

正常に動作すると、SlackチャンネルにいるBotユーザー(ferretbot)のアイコンがアクティブになります。Slackで話しかけると、「あいさつプラグイン」の内容にあわせて、あいさつを返してくれます。

ferretbotとあいさつを交わす

ferretbotとあいさつを交わす

これで、Slackで会話するBotプログラムが動くようになりました。あとは「あいさつプラグイン」を拡張したり、他の動作をするプラグインを追加することで、Botに様々な動作をさせることができます。

確認のために、現在のファイル/ディレクトリ構成を以下に示します。

リスト10:ファイル構成

.
├── ferretbot
│     └── plugins             # プラグインを格納するディレクトリ
│            ├── __init__.py  # プラグインを読み込むためのファイル
│            └── hello.py     # あいさつプラグイン
├── run.py                     # Botプログラムの実行プログラム
├── slackbot_settings.py       # 設定ファイル
└── venv/                      # Python仮想環境用のファイル群

プラグインを追加する

ここから、簡単な機能のプラグインをいくつか作成してみます。プラグインのプログラムはferretbot/plugins/に格納します。

まずは、絵文字のリアクションするプラグインを作成してみましょう。Slackbotはmessage.react('絵文字')と書くことで、メッセージに対して絵文字でのリアクションができます。以下のようなプログラムをferretbot/plugins/reaction.pyに保存して、Botプログラムを実行します。

リスト11:reaction.py

from slackbot.bot import listen_to

@listen_to('カレー')
def curry(message):
    """カレーの絵文字でリアクションする"""
    message.react('curry')

@listen_to('ビール')
def beer(message):
    """ビルの絵文字でリアクションする"""
    message.react('beer')

メッセージの中に「カレー」「ビール」の文字列が含まれていると、ferretbotが絵文字でリアクションしてくれます。

ferretbotが絵文字でリアクションする

ferretbotが絵文字でリアクションする

メッセージの中身を受け取るプラグインを作成します。Slackbotのrespond_to、listen_toの引数に正規表現を用いることで、メッセージの一部をパラメーターとして取得できます。

リスト12:giveme.py

from slackbot.bot import respond_to

@respond_to('(.*)ちょうだい')
def giveme(message, something):
    message.reply('{}あるよー'.format(something))

このプラグインを有効にすると、ferretbotに対して「~ちょうだい」というメッセージを送ると「~あるよー」というように返してくれます。

ferretbotがなにかをくれる

ferretbotがなにかをくれる

ここでは例として単純なプラグインのプログラムを紹介していますが、アイデア次第で様々な動作をBotプログラムにさせることが可能です。ぜひ、独自のBotプログラムを作ってSlackを便利に活用してみてください。

ここで作成したferretbotのコードは、下記のURLで公開しています。

また、筆者が作成しているBotのプログラムを下記のURLで公開しています。このBotプログラムは、PyCon JPというイベントのスタッフが参加するSlackで使用しています。データベース(sqlite)や、Google、Jira、Wikipediaなどの各種APIも使用しているので、参考にしてみてください。

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-から始まる文字列)を生成します。

Legacy tokenを生成する

Legacy tokenを生成する

Googleフォームを作成する

次にGoogleフォームを作成します。Googleドライブ(https://drive.google.com/)にアクセスします。「新規→その他→Googleフォーム」を選択して、Googleフォームを新規作成します。

Googleフォームを新規作成する

Googleフォームを新規作成する

Googleフォームを編集し、タイトルと入力項目としてメールアドレスを指定します。以下のように設定しました。

  • 記述式
  • メールアドレス形式でチェック
  • 必須
Googleフォームを編集する

Googleフォームを編集する

次にこのフォームに書き込まれたときに、招待メールを送信するプログラムを作成します。Googleフォームにプログラムを書くには、メニューから「スクリプト エディタ...」を選択します。

メニューからスクリプト エディタ...を選択

メニューからスクリプト エディタ...を選択

スクリプトには以下のような内容を記述します。workspaceには使用しているSlackワークスペースのドメインを、tokenには先ほど作成したLegacy tokenを指定します。

リスト13:コード.gs

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の場合は+任意のキーワードを使用して、別のメールアドレスを指定してください。

Googleフォームにメールアドレスを入力

Googleフォームにメールアドレスを入力

スクリプトが正常に動作すると入力メールアドレスに対してSlackから招待メールが届きます。あとは「Join Now」ボタンをクリックすれば、Slackワークスペースに参加できます。

自動送信されたSlack招待メール

自動送信されたSlack招待メール

以上で、Googleフォームを使用して任意のSlackワークスペースの招待メールを自動送信できるようになりました。あとはコミュニティなどのWebページにこのGoogleフォームへのリンクを載せれば、誰でもワークスペースに参加できるようなります。

まとめ

今回はSlackの各種APIを使って、Slackと連携する独自アプリケーションを作成する方法について開設しました。Slackは多数のAPIが提供されており、メッセージの表現方法も多彩です。全てを一度に理解することは難しいですが、ドキュメントは整備されているので必要に応じて少しずつ理解を深めていくことがおすすめです。

今回はcurl、Python、Google Appsスクリプト(JavaScript)と様々な方法でSlackのAPIを使用しました。これ以外に使い慣れているプログラミング言語があれば、ぜひその言語を使ってSlackと連携するアプリケーションを作成してみてください。

今回で連載「基礎から応用までしっかり学ぶSlack入門」は終了です。ぜひ、このサービスを便利に楽しく使いこなして、仕事やコミュニティ活動に役立ててもらえればと思います。

株式会社ビープラウド

部内のサイトを作るためにZope/Ploneと出会い、その後必要にかられてPythonを使い始める。現在の主な活動は、一般社団法人PyCon JP理事、Pythonボルダリング部(#kabepy)部長、Python mini Hack-a-thon主催、Plone User's Group Japanなど。共著書に『Pythonプロフェッショナルプログラミング 第2版(2015 秀和システム刊)』『Pythonエンジニア養成読本(2015 技術評論社刊)』『Pythonライブラリ厳選レシピ(2015 技術評論社刊)』などがある。趣味は吹奏楽とレゴとペンシルパズル。

Twitter: @takanory
Facebook: https://www.facebook.com/takanory.net

連載バックナンバー

開発ツール技術解説
第6回

Slackを独自アプリケーションで拡張する

2018/5/9
連載6回目となる今回は、Slackの機能を拡張するためにアプリケーションを作成する。
開発ツール技術解説
第5回

Slackと外部アプリケーションを連携させる

2017/12/15
連載5回目となる今回は、外部のアプリケーション連携により、様々な通知をSlackで一元管理する方法を紹介する。
開発ツール技術解説
第4回

Slackの管理設定

2017/10/31
連載の4回目となる今回は、チームを管理する管理者として行うさまざまな設定項目を説明します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています