こちらの記事はZennで投稿した「Echo Botから始めるBot Frameworkでボット開発」の再投稿になります。
MicrosoftのBot Frameworkを使ってシンプルなEcho Bot(チャットした内容を繰り返すボット)を動かすまでの手順を紹介します。
Microsoftのドキュメントは用意されているのですが日本語がわかりにくかったりしたので、自分なりの理解でまとめてみました。 特に、開発周りの用語がいまいちわからなかったため、できるかぎり自分の言葉で説明していますが、理解が間違っているところなどありましたら、コメントください。
1❯ dotnet --version
25.0.1011❯ dotnet list package
2 > Microsoft.Bot.Builder.Integration.AspNet.Core 4.11.1まずは、そもそもBot Frameworkとはどんなものなのかから説明します。
Bot Frameworkは、ボット開発をするためのSDKです。 現在使われているのはBot Framework SDK v4となります。
Bot FrameworkはSDKなので、ボット開発に必要ないろいろな物が詰め込まれています。
以下のものが含まれています。
ボットを実装するためのパッケージ(SDK)がBot Builderになります。 ボットの実装する時は、このパッケージを活用して実装していきます。
以下の言語で使うことができます。
ここからは、ボットがどういう仕組みで動いているのかを紹介していきます。
基本的には、ASP.NET CoreのWebアプリケーションの仕組みがベースとなっています。
まずはボット開発で出てくる用語をまとめます。
最初、この辺の用語の意味がよくわからず苦労しました。
続いて、メッセージを受け取ってから、返答するまでの処理の流れについて説明します。 ここでは、Message Activityを受け取るというチャットでメッセージを受けた時の処理を具体例として使用します。
公式ドキュメントより
Bot Framework Serviceとは、Azure Bot Serviceのコンポーネントになります。 チャネル(LINEやslack, Teamsなど)とボットの間で情報のやりとりをします。
実装する上で主に触るのは、手順3, 4部分の処理になります。
ここからは、Echo Botを作成して、実行する手順について紹介してきます。
Echo Botについては、テンプレートが用意されているため、テンプレートから作成します。
まずは、テンプレートをインストールします。
1dotnet new -i Microsoft.Bot.Framework.CSharp.EchoBot次に、プロジェクト名を指定してEcho Botを作成します。
1dotnet new echobot -n EchoBot.NETで作成されるテンプレートのファイルについて説明します。
テンプレートからEcho Botを作成すると以下のようなファイルが生成されます。
1EchoBot
2├── AdapterWithErrorHandler.cs # アダプターで例外を処理
3├── Bots
4│ └── EchoBot.cs # Botのメインロジック
5├── Controllers
6│ └── BotController.cs # webアプリとしてのエンドポイントを実装
7├── DeploymentTemplates
8├── EchoBot.csproj # プロジェクトファイル
9├── Program.cs
10├── Properties
11├── README.md
12├── Startup.cs # 必要なサービスを構成
13├── appsettings.Development.json # 設定ファイル
14├── appsettings.json # 設定ファイル
15└── wwwrootメインロジックを実装しているEchoBot.csの処理は以下のようになります。
1public class EchoBot : ActivityHandler
2{
3 protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
4 {
5 var replyText = $"Echo: {turnContext.Activity.Text}";
6 await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
7 }
8
9 protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
10 {
11 var welcomeText = "Hello and welcome!";
12 foreach (var member in membersAdded)
13 {
14 if (member.Id != turnContext.Activity.Recipient.Id)
15 {
16 await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeText), cancellationToken);
17 }
18 }
19 }
20}OnMessageActivityAsyncメソッドをオーバーライドすることでMessage Activityを受け付けた時の処理を記述します。
Echoボットとして、送られてきた内容をそのまま返す処理はここで実装されています。
まずは、turn contextの中から送られてきたメッセージテキストを取得して、応答メッセージを作成します。
1var replyText = $"Echo: {turnContext.Activity.Text}";次に、SendActivityAsyncメソッドを利用して、応答メッセージをMessage Activityとして送信します。
1await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);OnMembersAddedAsyncメソッドはオーバーライドすることで、ボットと初めて会話した時の処理を実装できます。
ここでは、「Hello and welcome」というメッセージを送信しています。
最後に、作成したボットをローカルで動かしてみます。
まずは、ローカルで動かすためのツールであるBot Framework Emulatorをインストールします。
次に、ボットをローカルで実行します。
1dotnet runローカルでボットの実行ができたら、Bot Framework Emulatorを起動して、ボットと接続します。
接続する時のURLはhttp://localhost:3978/api/messagesとなる。

ボットと接続することでローカルでのテストができるようになります。
ボットとの会話が始まると、まずはOnMembersAddedAsyncメソッドの処理が実行され、メッセージが送られてきます。

ボットにチャットメッセージを送ると、OnMessageActivityAsyncの処理が実行され、同じメッセージがボットから送られてきます。
