Javascript 在Teams平台上更新BotFramework v4中的活动

Javascript 在Teams平台上更新BotFramework v4中的活动,javascript,node.js,botframework,Javascript,Node.js,Botframework,我使用bot框架v4开发了一个bot,使用NodeJS,并部署在团队的多个通道上。有没有办法更新机器人发送的消息?我尝试在BotFrameworkAdapter中实现updateActivity()函数。但是,它不会更新活动 我已将此卡从机器人发送到团队频道。当有人单击按钮时,是否有办法更新卡或消息(禁用按钮)?关键是确保在使用updateActivity()时,使用团队频道创建的正确活动ID。您还需要确保更新后的活动获得了所有团队数据集。 在onTurn中,捕获外出活动,以便轻松保存所有必要

我使用bot框架v4开发了一个bot,使用NodeJS,并部署在团队的多个通道上。有没有办法更新机器人发送的消息?我尝试在BotFrameworkAdapter中实现updateActivity()函数。但是,它不会更新活动


我已将此卡从机器人发送到团队频道。当有人单击按钮时,是否有办法更新卡或消息(禁用按钮)?

关键是确保在使用
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
    可能因地理区域而异
发送第一个活动并存储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)。你可以考虑。
更新保存的活动:

// 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活动”。知道我们为什么会出现这个错误吗?