Slackに投稿したメッセージをAzure Functionsで受け、BOTの開始をSlackに通知します。
関数の作成とバインド設定
Azure Functionsの関数をJavaScriptで作成します。
関数のテンプレートから「Generic webhook」を選択し、JavaScriptで関数を作成します。
関数が作成されたら「統合」を選択し、トリガーの設定を変更します。
「Webhook type」をデフォルトの「Generic JSON」から「Slack」に変更します。
Slackカスタムインテグレーションの設定
Slackに投稿されたメッセージをAzure Functionsに送信するようにSlackを設定します。
SlackのAppディレクトリから「発信Webフック」を検索し、カスタムインテグレーションに追加します。
「発信Webフック」の設定を開き、メッセージを送信するURLを設定します。
URLには「https://{Functon App名}.azurewebsites.net/api/{関数名}?clientId={任意のclientId }」の形式でAzure Functionsの関数のURLを入力し、設定した「clientId」と「トークン」をメモにひかえておきます。
その他の項目は任意で設定をします。
clientIdとトークンの設定
Slackの設定が終わったら、控えておいたSlackの「clientId」と「トークン」をAzure Functionsに登録します。
関数の「管理」から「新しい関数キーの追加」をクリックします。
「名前」、「値」にそれぞれ先ほどのSlackの「clientId」、「トークン」を記入し、右の「保存」をクリックして設定を保存します。
関数のスクリプトエディタに戻り、「</>関数のURLの取得」をクリックします。
「キー」に追加したclientIdが追加され、選択するとSlackに設定したURLが表示されることが確認できます。
スクリプト
スクリプトは以下のように作成しました。
module.exports = function (context, data) {
// 1. フォームデータをオブジェクトに変換
var body_elements = data.split('&')
var body = {}
for(let elem of body_elements){
elem = elem.split('=')
body[elem[0]] = elem[1]
}
// 2. slackbotからのメッセージを除外
if (body.user_name != 'slackbot') {
// 3. Slackにレスポンス
context.res = {text: 'BOT Start!'}
}
else {
context.res = {};
}
context.done();
}
スクリプトの説明
レスポンスを速くするため、単純な処理でメッセージを処理しています。
1. フォームデータをオブジェクトに変換
Slackから送信されるフォームデータを扱いやすいようにオブジェクトに変換します。
2. slackbotからのメッセージの除外
Slackの設定によりますが、slackbotからのメッセージで関数が起動してしまうことがあるため、「user_name」を参照してslackbotからのメッセージでは処理を中断させます。
3. Slackにレスポンス
Slackにレスポンスを返し、BOTの実行を通知します。
実行結果
Slackの設定したチャンネルにメッセージを投稿すると、BOTの開始を通知する「BOT Start!」のメッセージがBOTから返されました。
まとめ
ここまでが、Azure FunctionsでSlack BOTを作成するための基本の操作となります。
次回は、Azure Functionsで受けたメッセージからURLを抽出してAzure Queue Storageに格納するまでを作成します。