我认为实现这一点的一种方法是使用 BackChannel,它增加了机器人与通过 WebChat 嵌入机器人的页面进行通信的能力。它将允许您:
- 将事件发送到托管 WebChat 实例的页面
- 侦听托管 WebChat 实例的页面中的事件
第一部分当然是 HTML 页面,它将包含您放在一起的内容,以及发送/监听事件的逻辑。可以在这里找到带有基本逻辑的示例页面,下面是带有事件相关代码的图像。
现在,您需要准备好您的机器人来监听和发送事件。中有一个示例,Node.js
显示了如何执行此操作。
将其移植到C#
, 就像监听和发送事件类型的活动一样简单。一个示例代码(使用前面提到的 HTML 页面的事件):
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Event &&
string.Equals(activity.Name, "buttonClicked", StringComparison.InvariantCultureIgnoreCase))
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
Activity reply = activity.CreateReply("I see that you just pushed that button");
await connector.Conversations.ReplyToActivityAsync(reply);
}
if (activity.Type == ActivityTypes.Message)
{
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
// return our reply to the user
var reply = activity.CreateReply();
reply.Type = ActivityTypes.Event;
reply.Name = "changeBackground";
reply.Value = activity.Text;
await connector.Conversations.ReplyToActivityAsync(reply);
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
最重要的是,在您的 HTML 页面中,您必须使用页面 URL 向机器人发送事件,并且机器人必须侦听该事件以获取值