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

时间:2019-03-14 14:38:26

标签: botframework

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

enter image description here

我将此卡从机器人中发送到了团队频道。有人单击按钮时,有什么方法可以更新卡或消息(禁用按钮)?

2 个答案:

答案 0 :(得分:1)

关键是要确保在使用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();
    });
  • 注意:可能还有另一种方法。我只是发现这是最简单的,因为您需要最少保存所有channelDataconversation信息和activity.id
  • 如何存储该活动以供以后使用取决于您自己。如果将其存储在构造函数中,它将在每条消息上重新实例化(C#SDK),或者任何用户都可以更改它(JS SDK)。您可以考虑使用writing custom storage
  • 活动保留所有channelData。通过指定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);
  • 注意:您可以使用任何内容更新活动。我换出了完全不同的自适应卡

之前:

enter image description here

之后:

enter image description here

答案 1 :(得分:0)

我已经使用中间件进行了尝试,但是一直得到:“该机器人不属于对话名册”。问题:我的机器人正在更新用户写的消息,所以我需要特殊权限吗?

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