javascript - 在 Teams 平台上更新 BotFramework v4 中的事件

标签 javascript node.js botframework

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

enter image description here

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

最佳答案

关键是确保在使用 updateActivity() 时,使用由 Teams channel 创建的正确事件 ID。您还需要确保更新的事件获取为其设置的所有 Teams 数据。

onTurn 中,捕获传出事件,以便您可以轻松保存所有必要的 Teams channel 数据:

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 .
  • 事件保留所有 channel 数据。通过指定 saveMe 标志,我们确保保存正确的事件

实例化一些关键变量:

const teamsChannel = '19:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a199c59791919790c292c59091d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e1d5c9d3c4c0c58fd2cad8d1c4" rel="noreferrer noopener nofollow">[email protected]</a>';
const serviceUrl = 'https://smba.trafficmanager.net/amer/';
  • 注意:获取这些变量的最简单方法是从 Teams 向机器人发送消息,同时在传入的事件上设置断点
  • 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

关于javascript - 在 Teams 平台上更新 BotFramework v4 中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55165282/

相关文章:

java - 在 Java 中创建 JWT,在 Node 中验证很热?

javascript - context.sendActivity(CardFactory.oauthCard(...)) 看起来更简单,但不起作用

javascript - 更优雅/有效的方式来连续获取 6 个连续的前一个 DOM 元素?

javascript - 使用 MapBox java-script SDK 显示位置

javascript - 一旦事件触发,即使我 `$.unbind(' 事件')`,所有处理程序都会触发。有没有办法防止事件处理程序在事件发生后触发?

node.js - botbuilder-applicationinsights - 启用用户话语日志记录

c# - 在android中访问azure中的机器人

Javascript 函数不适用于 html 中的多个按钮单击

Heroku 上的 Node.js - Memcached 使用

javascript - 使异步代码像同步一样工作 - Javascript