【问题标题】:Updating an activity in BotFramework v4 on Teams platform在 Teams 平台上更新 BotFramework v4 中的活动
【发布时间】:2019-08-05 12:15:46
【问题描述】:

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

我已将这张卡片从机器人发送到团队频道。当有人点击按钮时,有没有办法更新卡片或消息(禁用按钮)?

【问题讨论】:

    标签: javascript node.js botframework


    【解决方案1】:

    这样做的关键是确保当您使用 updateActivity() 时,您使用的是由 Teams 频道创建的正确活动 ID。您还需要确保更新后的 Activity 获取所有 Teams 数据集。

    onTurn 中,捕获传出活动,以便您可以轻松保存所有必要的 Teams 频道数据:

    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();
        });
    
    • 注意:可能还有其他方法可以做到这一点。我发现这是最简单的,因为您至少需要保存所有 channelDataconversationactivity.id 信息
    • 如何存储该活动以供以后使用取决于您。如果将它存储在构造函数中,它将在每条消息(C# SDK)上重新实例化,或者任何用户都可以更改它(JS SDK)。你可以考虑writing custom storage
    • 活动保留所有通道数据。通过指定 saveMe 标志,我们确保我们保存了正确的活动

    实例化一些关键变量:

    const teamsChannel = '19:8d60061c3d10xxxxxxxxxxxxxxxx@thread.skype';
    const serviceUrl = 'https://smba.trafficmanager.net/amer/';
    
    • 注意:获取这些变量的最简单方法是从 Teams 向机器人发送消息,同时在传入的 activity 上设置断点
    • 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);
    
    • 注意:您可以使用任何内容更新活动。我换掉了完全不同的自适应卡片

    之前:

    之后:

    【讨论】:

    • 我在尝试实现上述方法时收到错误“BotFrameworkAdapter.updateActivity(): missing serviceUrl”。 updateActivity 方法需要 serviceUrl
    • @PratikMathur 对此感到抱歉。有很多试验和错误弄清楚这一点,我的代码有点乱。我已经编辑了我的答案以解决这个问题。你基本上只需要whateverActivity.serviceUrl = yourTeamsServiceUrl
    • 我仍然有同样的问题,因为 updateActivity 需要一个 context.activity 对象。你能分享一下对你有用的代码 sn-p 吗?
    • 我已经更新了我的答案。看来,在我昨晚深夜工作的谵妄中,我错过了一个关键部分。这是a gist of my actual code
    • 我已完成所有更改。但是,现在我收到一个错误“活动导致多个 Skype 活动”。知道为什么会出现此错误吗?
    【解决方案2】:

    我已经尝试过使用中间件,但不断收到:“机器人不是对话名单的一部分”。问:我的机器人正在更新用户写的消息,所以我需要特殊权限吗?

         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);
    

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      相关资源
      最近更新 更多