我有一个使用 NodeJS 使用 Bot Framework v4 开发的机器人,并部署在 Teams 中的多个 channel 上。有没有办法更新机器人发送的消息?我尝试在 BotFrameworkAdapter 中实现 updateActivity() 函数。但是,它不会更新事件。
我已将这张卡从机器人发送到 Teams channel 。当有人点击按钮时,有没有办法更新卡片或消息(禁用按钮)?
最佳答案
关键是确保在使用 updateActivity()
时,使用由 Teams channel 创建的正确事件 ID。您还需要确保更新的事件获取为其设置的所有 Teams 数据。
在 onTurn
中,捕获传出事件,以便您可以轻松保存所有必要的 Teams channel 数据:
public onTurn = async (turnContext: TurnContext) => {
turnContext.onSendActivities(async (ctx, activities, nextSend) => {
activities.forEach(async (activity) => {
if (activity.channelData.saveMe) {
this.savedActivity = activity;
}
});
return await nextSend();
});
- 注意:可能还有另一种方法可以做到这一点。我发现这是最简单的,因为您需要将所有
channelData
、conversation
信息和activity.id
保存在最小值 - 如何存储该事件以供以后使用取决于您。如果将其存储在构造函数中,它将在每条消息上重新实例化(C# SDK),或者任何用户都可以更改它(JS SDK)。您可能会考虑 writing custom storage .
- 事件保留所有 channel 数据。通过指定 saveMe 标志,我们确保保存正确的事件
实例化一些关键变量:
const teamsChannel = '19:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a199c59791919790c292c59091d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e1d5c9d3c4c0c58fd2cad8d1c4" rel="noreferrer noopener nofollow">[email protected]</a>';
const serviceUrl = 'https://smba.trafficmanager.net/amer/';
- 注意:获取这些变量的最简单方法是从 Teams 向机器人发送消息,同时在传入的
事件
上设置断点 serviceUrl
可能因地理区域而异
发送第一个事件并存储 ID:
// This ensures that your bot can send to Teams
turnContext.activity.conversation.id = teamsChannel;
turnContext.activity.serviceUrl = serviceUrl;
MicrosoftAppCredentials.trustServiceUrl(serviceUrl);
// Add the saveMe flag
yourActivity.channelData = { saveMe: true };
const response = await turnContext.sendActivity(yourActivity);
this.activityToUpdateId = response.id;
- 如何存储该 ID 以供以后使用取决于您。如果将其存储在构造函数中,它将在每条消息上重新实例化(C# SDK),或者任何用户都可以更改它(JS SDK)。您可能会考虑 writing custom storage .
更新您保存的事件:
// New data
const card2 = CardFactory.adaptiveCard(adaptiveCard2);
// Set the saved activity.id and new activity data (an adaptiveCard, in this example)
this.savedActivity.id = this.activityToUpdateId;
this.savedActivity.attachments = [card2];
发送更新:
await turnContext.updateActivity(this.savedActivity);
- 注意:您可以使用任何内容更新事件。我更换了完全不同的自适应卡
之前:
之后:
关于javascript - 在 Teams 平台上更新 BotFramework v4 中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55165282/