Javascript 在Teams平台上更新BotFramework v4中的活动
我使用bot框架v4开发了一个bot,使用NodeJS,并部署在团队的多个通道上。有没有办法更新机器人发送的消息?我尝试在BotFrameworkAdapter中实现updateActivity()函数。但是,它不会更新活动Javascript 在Teams平台上更新BotFramework v4中的活动,javascript,node.js,botframework,Javascript,Node.js,Botframework,我使用bot框架v4开发了一个bot,使用NodeJS,并部署在团队的多个通道上。有没有办法更新机器人发送的消息?我尝试在BotFrameworkAdapter中实现updateActivity()函数。但是,它不会更新活动 我已将此卡从机器人发送到团队频道。当有人单击按钮时,是否有办法更新卡或消息(禁用按钮)?关键是确保在使用updateActivity()时,使用团队频道创建的正确活动ID。您还需要确保更新后的活动获得了所有团队数据集。 在onTurn中,捕获外出活动,以便轻松保存所有必要
我已将此卡从机器人发送到团队频道。当有人单击按钮时,是否有办法更新卡或消息(禁用按钮)?关键是确保在使用
updateActivity()
时,使用团队频道创建的正确活动ID。您还需要确保更新后的活动获得了所有团队数据集。
在onTurn
中,捕获外出活动,以便轻松保存所有必要的团队频道数据:
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)。你可以考虑。
- 活动保留所有通道数据。通过指定saveMe标志,我们可以确保保存正确的活动
const teamsChannel = '19:8d60061c3d10xxxxxxxxxxxxxxxx@thread.skype';
const serviceUrl = 'https://smba.trafficmanager.net/amer/';
- 注意:获取这些变量的最简单方法是从团队向bot发送消息,同时在传入的
活动上设置断点
可能因地理区域而异serviceUrl
// 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)。你可以考虑。
// 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);
- 注意:您可以使用任何内容更新活动。我换掉了完全不同的自适应卡
我使用中间件尝试过这一点,但不断得到:“机器人不属于对话名册”。问题:我的机器人正在更新用户编写的消息,所以我需要特殊权限吗
let ActivityID = context.activity.conversation.id.split("=")[1];
let updatedActivity: Partial<Activity> = {
"id": ActivityID,
"channelId": context.activity.channelId,
"channelData": context.activity.channelData,
"conversation":
{
"name": "",
"id": context.activity.conversation.id,
"isGroup": context.activity.conversation.isGroup,
"conversationType": context.activity.conversation.conversationType,
"tenantId": context.activity.conversation.tenantId
},
"type": "message",
"text": "",
"summary": "",
"attachments": [ attachment ]
} await context.updateActivity(updatedActivity);
let ActivityID=context.activity.conversation.id.split(“=”[1];
let updateActivity:部分={
“id”:活动id,
“channelId”:context.activity.channelId,
“channelData”:context.activity.channelData,
“对话”:
{
“名称”:“,
“id”:context.activity.conversation.id,
“isGroup”:context.activity.conversation.isGroup,
“conversationType”:context.activity.conversation.conversationType,
“tenantId”:context.activity.conversation.tenantId
},
“类型”:“消息”,
“文本”:“,
“摘要”:“摘要”,
“附件”:[附件]
}wait context.updateActivity(updateActivity);
我在尝试实现上述方法时遇到错误“BotFrameworkAdapter.updateActivity():缺少serviceUrl”。updateActivity方法要求serviceUrl@PratikMathur很抱歉。有这么多的尝试和错误弄明白了这一点,我的代码是有点混乱。我编辑了我的答案来解释这一点。基本上,您只需要whateverActivity.serviceUrl=yourTeamsServiceUrl
。由于updateActivity需要一个context.activity对象,所以我仍然存在相同的问题。你能分享一下对你有用的代码片段吗?我已经更新了我的答案。看来,在我昨晚工作到深夜的精神错乱中,我错过了一个关键部分。这是我做的所有改变。但是,现在我收到一个错误“活动导致多个skype活动”。知道我们为什么会出现这个错误吗?