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

Pra*_*hur 2 javascript node.js botframework

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

在此输入图像描述

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

mdr*_*son 5

关键是确保在使用 时updateActivity(),使用由 Teams 频道创建的正确活动 ID。您还需要确保更新的活动获取所有 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();
    });
Run Code Online (Sandbox Code Playgroud)
  • 注意:可能还有另一种方法可以做到这一点。我发现这是最简单的,因为您至少需要保存所有channelDataconversation信息和,activity.id
  • 如何存储该活动以供以后使用取决于您。如果将其存储在构造函数中,它将在每条消息上重新实例化(C# SDK),或者任何用户都可以更改它(JS SDK)。您可能会考虑编写自定义存储
  • 活动保留所有通道数据。通过指定 saveMe 标志,我们确保保存正确的活动

实例化一些关键变量:

const teamsChannel = '19:8d60061c3d10xxxxxxxxxxxxxxxx@thread.skype';
const serviceUrl = 'https://smba.trafficmanager.net/amer/';
Run Code Online (Sandbox Code Playgroud)
  • 注意:获取这些变量的最简单方法是将消息从 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;
Run Code Online (Sandbox Code Playgroud)
  • 如何存储该 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];
Run Code Online (Sandbox Code Playgroud)

发送更新:

await turnContext.updateActivity(this.savedActivity);
Run Code Online (Sandbox Code Playgroud)
  • 注意:您可以使用任何内容更新活动。我更换了完全不同的自适应卡

前:

在此输入图像描述

后:

在此输入图像描述