重新启动机器人后,主动消息在 MS Teams 中不起作用
Proactive message not working in MS Teams after bot is restarted
我有一个主动消息传递端点,当用户积极参与对话时它可以正常工作。例如,在一个用例中,用户要求检索发票数据,这是异步发生的,并通过主动消息发回。这很好用。但是,如果尝试在几周后继续对话,continueConversation
操作就会失败。如果我进入团队并发起与机器人的新对话,则重新发送主动消息(不更改任何内容)将再次起作用。
在我的一个用例中,机器人需要在未来 1 周以上跟进用户。所以我需要弄清楚如何向团队用户发送主动消息,即使他们最近没有与机器人交谈过。我不确定为什么 continueConversation
不起作用,因为对话 ID 没有改变(并且几个月没有改变,可能永远不会)。
这是我用来发送主动消息的函数。
server.post('/api/notify', async (req, res) => {
//console.log(req.body);
try {
const conversationReference = req.body.conversationReference;
await adapter.continueConversation(conversationReference, async turnContext => {
// If you encounter permission-related errors when sending this message, see
// https://aka.ms/BotTrustServiceUrl
await turnContext.sendActivity(req.body.message);
});
res.setHeader('Content-Type', 'text/html');
res.writeHead(200);
res.write('<html><body><h1>Proactive messages have been sent.</h1></body></html>');
res.end();
} catch (error) {
console.log('Bad Request. Please ensure your message contains the conversation reference and message text.');
console.log(error);
appInsightsClient.trackTrace({
message: `${error.name} - ${path.basename(__filename)}`,
severity: 4,
properties: {'error':error.message,'callStack':error.stack, 'botName': process.env.botName}
});
res.setHeader('Content-Type', 'text/html');
res.writeHead(400);
res.write('<html><body><p>Bad Request. Please ensure your message contains the conversation reference and message text.</p></body></html>');
res.end();
}
});
正如link in my own code所说,
If your bot is restarted, a user awaiting a proactive message cannot receive it unless they have messaged the bot again after it restarted.
这正是问题所在。但是该页面上的说明并未提供完整的详细信息。您必须通过 const { MicrosoftAppCredentials } = require('botframework-connector')
添加 class 并设置要传递的 serviceUrl(已在 conversationReference.serviceUrl
提供)。
因此,通过这些更改,我在发送主动消息之前添加了 MicrosoftAppCredentials.trustServiceUrl(conversationReference.serviceUrl);
,即使在 bot 重新启动后它也开始正常工作。
我有一个主动消息传递端点,当用户积极参与对话时它可以正常工作。例如,在一个用例中,用户要求检索发票数据,这是异步发生的,并通过主动消息发回。这很好用。但是,如果尝试在几周后继续对话,continueConversation
操作就会失败。如果我进入团队并发起与机器人的新对话,则重新发送主动消息(不更改任何内容)将再次起作用。
在我的一个用例中,机器人需要在未来 1 周以上跟进用户。所以我需要弄清楚如何向团队用户发送主动消息,即使他们最近没有与机器人交谈过。我不确定为什么 continueConversation
不起作用,因为对话 ID 没有改变(并且几个月没有改变,可能永远不会)。
这是我用来发送主动消息的函数。
server.post('/api/notify', async (req, res) => {
//console.log(req.body);
try {
const conversationReference = req.body.conversationReference;
await adapter.continueConversation(conversationReference, async turnContext => {
// If you encounter permission-related errors when sending this message, see
// https://aka.ms/BotTrustServiceUrl
await turnContext.sendActivity(req.body.message);
});
res.setHeader('Content-Type', 'text/html');
res.writeHead(200);
res.write('<html><body><h1>Proactive messages have been sent.</h1></body></html>');
res.end();
} catch (error) {
console.log('Bad Request. Please ensure your message contains the conversation reference and message text.');
console.log(error);
appInsightsClient.trackTrace({
message: `${error.name} - ${path.basename(__filename)}`,
severity: 4,
properties: {'error':error.message,'callStack':error.stack, 'botName': process.env.botName}
});
res.setHeader('Content-Type', 'text/html');
res.writeHead(400);
res.write('<html><body><p>Bad Request. Please ensure your message contains the conversation reference and message text.</p></body></html>');
res.end();
}
});
正如link in my own code所说,
If your bot is restarted, a user awaiting a proactive message cannot receive it unless they have messaged the bot again after it restarted.
这正是问题所在。但是该页面上的说明并未提供完整的详细信息。您必须通过 const { MicrosoftAppCredentials } = require('botframework-connector')
添加 class 并设置要传递的 serviceUrl(已在 conversationReference.serviceUrl
提供)。
因此,通过这些更改,我在发送主动消息之前添加了 MicrosoftAppCredentials.trustServiceUrl(conversationReference.serviceUrl);
,即使在 bot 重新启动后它也开始正常工作。