聊天机器人里的消息和Activity
分类: Azure机器人 ◆ 标签: #Azure Bot Framework SDK #Azure Bot Service #机器人 ◆ 发布于: 2023-08-07 22:48:20

- 开始本章之前建议先熟悉一下:
- https://www.azuredeveloper.cn/article-develop-chat-bot-by-azure-bot-service
- https://www.azuredeveloper.cn/article-hello-bot
同时要根据文章创建好一个项目模板:https://www.azuredeveloper.cn/article-create-a-full-function-chat-bot-project
现在假设您已经有了一个聊天机器人的项目了,使用Visual Studio Code
打开你的项目之后,如下图:
这个项目已经可以单独的运行了,并且会返回用户的输入。
我们先来学习我们怎么样才可以接收和发送消息。
Bot
的事件驱动
我们之前的文章讨论了一个Bot
应用实际参与的几个组件。
物理组件:
Channel
: 就是一个物理的应用,例如微信,Teams
Bot Service
: 用于和Channel
相连,转发消息到Bot
- 运行
Bot
的资源。
逻辑组件:
Channel endpoint
Adapter
Bot Turn Context Handle
Activity
TurnContext
一个消息的流入路径是:用户 -> Channel
-> Adapter
-> Adapter middleware
-> Bot Turn handle
应用的编程主要就是集中在Bot Turn handle
上。
Bot Turn Handle
这个组件的实际表现为Bot
类中定义的一个方法:
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) { await base.OnTurnAsync(turnContext, cancellationToken); }
我们可以在这个方法里对传入或者传出的Activity
进行存取和访问。
Activity
和Turn Handle
我们虽然可以仅仅在Bot
应用只访问OnTurnAsync
这一个方法,但是为了编程的方便,Bot SDK
定义了很多的Activity
类型,每一个Activity
到达OnTurnAsync
之后,会根据类型再次调用对应的类型方法,例如:
OnMembersAddedAsync
, OnMessageActivityAsync
, OnConversationUpdateAsync
方法等等。如果要参考有哪些预定义的Activity
类型,您可以参考:
https://github.com/Microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md
发送一个Card
我们默认创建的模板,仅仅是将用户输入的消息,原封不动的返回了,我们多加一些代码,当用户开始和机器人聊天时,发送一个有趣的欢迎短句:
我们打开文件Bots\TestBot.cs
, 将方法OnMembersAddedAsync
更改为如下的方法:
protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { var welcomeText = "Hello and welcome!"; foreach (var member in membersAdded) { if (member.Id != turnContext.Activity.Recipient.Id) { var card = new HeroCard { Text = "Hello and welcome! please choose a Menu", Buttons = new List<CardAction> { new CardAction(ActionTypes.ImBack, title:"1. Dinner", value:"1"), new CardAction(ActionTypes.ImBack, title:"2. Gift", value: "2"), new CardAction(ActionTypes.ImBack, title:"3. Vacation", value:"3"), }, }; var reply = MessageFactory.Attachment(card.ToAttachment()); await turnContext.SendActivityAsync(reply, cancellationToken); } } }
然后在命令行里运行该Bot
, 并使用Bot Framework Emualtor
来测试,测试结果如下: