Microsoft Bot Framework を利用した bot API を公開して、Slack をクライアントとして使えるように構成してみました。
その構築手順と注意点の簡単なメモを残しておきます。
基本的には、次の 2 つの記事をもとにしています。
- 人工知能パーツ Microsoft Cognitive Services を使った表情分析アプリを作ろう! (Emotion API × Bot Framework 編)
- Azure で Web 公開&お手軽 Web Chat を試す
(1) 環境設定
- Bot Framework Channel Emulator をインストールする
- Visual Studio 2015 用の C# テンプレートを ProjectTemplates フォルダーに置く
(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 で実行したときのスクリーン ショットです。
表情分析 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
2017年5月4日 15:02
[…] 以前に Bot Framework で Slack の bot を構成するで作成したメソッドを再利用しています。 こちらは GenericWebHook […]
2017年5月7日 23:26
[…] Bot Framework で Slack の bot を構成するを書きましたが、 今回はこの素因数分解の bot を Logic Apps […]