Bot Framework で Slack の bot を構成する

Microsoft Bot Framework を利用した bot API を公開して、Slack をクライアントとして使えるように構成してみました。
その構築手順と注意点の簡単なメモを残しておきます。

基本的には、次の 2 つの記事をもとにしています。

(1) 環境設定

(2) bot を Web API として開発

  • テンプレートからプロジェクトを作成する
  • プロジェクトのプロパティで [アセンブリ名] を変更する
  • NuGet で Bot Framework を更新する

(3) Azure App Service に配置

  • Visual Studio から発行する

(4) Bot Framework サイトに登録

  • Web.config の appSettings にアカウント情報を設定するには、Azure Portal の [アプリケーション設定] を利用する
  • Web Chat を構成する
    • HTML に Web Chat を埋め込む
  • Slack bot を構成する
    • Slack の設定を追加するときに表示される手順の通りに進める

 

以下は注意点です。

(1) 開発環境における実行について

ローカルの開発環境においては、
Visual Studio で開始した bot API に Bot Framework Channel Emulator から接続することになりますが、
[デバッグなしで開始 (Ctrl+F5)] では 401 エラーとなります。
[デバッグの開始 (F5)] で実行すれば接続できます。

これは、Controller に BotAuthentication 属性が付けられていることによって、
デバッガーにアタッチされているときは認証不要になるためです。
したがって、開発環境では [デバッグの開始 (F5)] で実行しましょう。

(2) クライアント上でのテキストの表示について

テキストは既定で Markdown 形式です。したがって、記号などを使用するときは注意が必要です。
なお、reply.TextFormat を plain に設定しても、Web Chat では無効のようです。
また、reply.TextFormat を plain に設定しても、Slack ではなぜか * が _ と表示されます。

(3) Activity.Type について

Slack からは、activity.Type が ActivityTypes.Message でない要求が送られてくることがあります。
activity.Type の値により処理を分岐させないと、応答メッセージが重複して表示されてしまいます。

(4) URL の送信について

Slack から URL を送信すると、bot 側で受信するテキストでは、URL が < と > で括られます。

 

素因数分解 bot API のコードを示します。
全体のソースコードは、FactorizationBotApi (GitHub) にあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using Microsoft.Bot.Connector;
namespace FactorizationBotApi
{
[BotAuthentication]
public class MessagesController : ApiController
{
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type != ActivityTypes.Message)
return Request.CreateResponse(HttpStatusCode.OK);
if (string.IsNullOrWhiteSpace(activity.Text))
return Request.CreateResponse(HttpStatusCode.OK);
var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
var echoMessage = $"You sent \"{activity.Text}\".";
await Reply(connector, activity, echoMessage);
var mainMessage = Factorize(activity.Text);
await Reply(connector, activity, mainMessage);
return Request.CreateResponse(HttpStatusCode.OK);
}
static string Factorize(string text)
{
int i;
if (!int.TryParse(text, out i)) return "Send an integer.";
var factorized = MathHelper.Factorize2(Math.Abs(i));
var factorizedString = string.Join(" · ", factorized.Select(p => $"{p.Key}{(p.Value == 1 ? "" : $"^{p.Value}")}"));
return $"{i} = {(i >= 0 ? "" : "-")}{factorizedString}";
}
static async Task Reply(ConnectorClient connector, Activity activity, string message)
{
var reply = activity.CreateReply(message);
await connector.Conversations.ReplyToActivityAsync(reply);
}
}
}

 

Slack で実行したときのスクリーン ショットです。

Factorization bot

 

表情分析 bot については、Bot Framework で Slack bot 構築メモ (Qiita)に書きました。

作成したサンプル
BotSample (GitHub)

バージョン情報
.NET Framework 4.6
Microsoft.Bot.Builder 3.3.0

参照
人工知能パーツ Microsoft Cognitive Services を使った表情分析アプリを作ろう! (Emotion API × Bot Framework 編)
Azure で Web 公開&お手軽 Web Chat を試す
Microsoft Cognitive Services & Bot Framework 概要
Bot Framework Overview

Bot Framework で Slack bot 構築メモ

カテゴリー: クラウド. タグ: , . 2 Comments »

2件のフィードバック to “Bot Framework で Slack の bot を構成する”

  1. Azure Functions で Web API を作成する | Do Design Space Says:

    […] 以前に Bot Framework で Slack の bot を構成するで作成したメソッドを再利用しています。 こちらは GenericWebHook […]

  2. Logic Apps から Slack に通知する | Do Design Space Says:

    […] Bot Framework で Slack の bot を構成するを書きましたが、 今回はこの素因数分解の bot を Logic Apps […]


Azure Functions で Web API を作成する | Do Design Space への返信 コメントをキャンセル