Skip to main content

聊天机器人里的消息和Activity

分类:  Azure机器人 标签:  #Azure Bot Framework SDK #Azure Bot Service #机器人 发布于: 2023-08-07 22:48:20

同时要根据文章创建好一个项目模板: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进行存取和访问。

ActivityTurn Handle

我们虽然可以仅仅在Bot应用只访问OnTurnAsync这一个方法,但是为了编程的方便,Bot SDK定义了很多的Activity类型,每一个Activity到达OnTurnAsync之后,会根据类型再次调用对应的类型方法,例如:

OnMembersAddedAsyncOnMessageActivityAsyncOnConversationUpdateAsync 方法等等。如果要参考有哪些预定义的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来测试,测试结果如下: