将主动消息从 Azure 函数发送到 botservice - 节点
Sending Proactive Messages from Azure functions to botservice - node
我正在使用 botframework v4,但是从 v3 过来,我没有找到任何与我在下面使用的代码类似的文档,但对于 v4,关于从 Azure Function App 发送主动消息
以下是我之前使用的代码,但在适应时遇到了问题:
var builder = require('botbuilder');
// setup bot credentials
var connector = new builder.ChatConnector({
appId: process.env.MICROSOFT_APP_ID,
appPassword: process.env.MICROSOFT_APP_PASSWORD
});
module.exports = function (context, req) {
if (req.body) {
var savedAddress = req.body.channelAddress;
var inMemoryStorage = new builder.MemoryBotStorage();
var bot = new builder.UniversalBot(connector).set('storage', inMemoryStorage);
sendProactiveMessage(savedAddress, bot)
}
};
function sendProactiveMessage(address, bot) {
var msg = new builder.Message().address(address);
msg.textLocale('en-US');
var img = {
attachments: [{
contentType: "image/jpg",
contentUrl: latestUrl,
}]
};
msg.addAttachment(img.attachments[0]);
msg.text('hello');
bot.send(msg);
}
这适用于 v3 但不适用于 v4。
如果可能的话我也想找到一种注销用户的方法:
await botAdapter.signOutUser(innerDc.context, this.connectionName);
这就是我在机器人本身中的做法,但事实证明再次从 Azure Functions 中这样做很困难。
如有任何帮助,我们将不胜感激。
太好了,您正在从 v3 迁移到 v4!你看过Send proactive notifications to users了吗?这个例子非常简单,可以在 Azure 函数中使用。
首先,您通过调用 TurnContext.getConversationReference(context.activity);
在您的 bot 中检索对话参考。这是您可以在主动功能中用来打开对话的参考。在您的情况下,您通过请求主体将其提供给主动功能,因此我将在我的示例中执行相同的操作。
我的主动端点示例是用 Typescript 编写的,但它在普通 Javascript 中的工作方式相同。在 Azure Functions 中创建一个 HTTP 触发器并使用以下代码。为了清楚起见,我添加了内联评论。
const { BotFrameworkAdapter } = require('botbuilder');
// Create adapter.
// If you need to share this adapter in multiple functions, you could
// instantiate it somewhere else and import it in every function.
const adapter = new BotFrameworkAdapter({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword
});
module.exports = async function (context, req) {
// Validate if request has a body
if (!req.body) {
context.res = {
status: 400,
body: "Please pass a conversation reference in the request body"
};
return;
}
// Retrieve conversation reference from POST body
const conversationReference = req.body;
// Open the conversation and retrieve a TurnContext
await adapter.continueConversation(conversationReference, async turnContext => {
// Send a text activity
// Depending on the channel, you might need to use https://aka.ms/BotTrustServiceUrl
await turnContext.sendActivity('Proactive hello');
});
context.res = {
body: 'Message sent!'
};
};
最后,您可以向此 Azure 函数发出请求,在其中将对话参考作为 application/json
.
类型的正文传递
使用 signOutUser 等功能扩展此示例很简单。您可以调用 continueConversation
函数中的所有函数,就像在普通机器人中一样。如果您愿意,您甚至可以在那里接收适配器对象。
await adapter.continueConversation(conversationReference, async turnContext => {
// Sign user out
turnContext.adapter.signOutUser(turnContext, 'connection-name');
});
我正在使用 botframework v4,但是从 v3 过来,我没有找到任何与我在下面使用的代码类似的文档,但对于 v4,关于从 Azure Function App 发送主动消息
以下是我之前使用的代码,但在适应时遇到了问题:
var builder = require('botbuilder');
// setup bot credentials
var connector = new builder.ChatConnector({
appId: process.env.MICROSOFT_APP_ID,
appPassword: process.env.MICROSOFT_APP_PASSWORD
});
module.exports = function (context, req) {
if (req.body) {
var savedAddress = req.body.channelAddress;
var inMemoryStorage = new builder.MemoryBotStorage();
var bot = new builder.UniversalBot(connector).set('storage', inMemoryStorage);
sendProactiveMessage(savedAddress, bot)
}
};
function sendProactiveMessage(address, bot) {
var msg = new builder.Message().address(address);
msg.textLocale('en-US');
var img = {
attachments: [{
contentType: "image/jpg",
contentUrl: latestUrl,
}]
};
msg.addAttachment(img.attachments[0]);
msg.text('hello');
bot.send(msg);
}
这适用于 v3 但不适用于 v4。
如果可能的话我也想找到一种注销用户的方法:
await botAdapter.signOutUser(innerDc.context, this.connectionName);
这就是我在机器人本身中的做法,但事实证明再次从 Azure Functions 中这样做很困难。
如有任何帮助,我们将不胜感激。
太好了,您正在从 v3 迁移到 v4!你看过Send proactive notifications to users了吗?这个例子非常简单,可以在 Azure 函数中使用。
首先,您通过调用 TurnContext.getConversationReference(context.activity);
在您的 bot 中检索对话参考。这是您可以在主动功能中用来打开对话的参考。在您的情况下,您通过请求主体将其提供给主动功能,因此我将在我的示例中执行相同的操作。
我的主动端点示例是用 Typescript 编写的,但它在普通 Javascript 中的工作方式相同。在 Azure Functions 中创建一个 HTTP 触发器并使用以下代码。为了清楚起见,我添加了内联评论。
const { BotFrameworkAdapter } = require('botbuilder');
// Create adapter.
// If you need to share this adapter in multiple functions, you could
// instantiate it somewhere else and import it in every function.
const adapter = new BotFrameworkAdapter({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword
});
module.exports = async function (context, req) {
// Validate if request has a body
if (!req.body) {
context.res = {
status: 400,
body: "Please pass a conversation reference in the request body"
};
return;
}
// Retrieve conversation reference from POST body
const conversationReference = req.body;
// Open the conversation and retrieve a TurnContext
await adapter.continueConversation(conversationReference, async turnContext => {
// Send a text activity
// Depending on the channel, you might need to use https://aka.ms/BotTrustServiceUrl
await turnContext.sendActivity('Proactive hello');
});
context.res = {
body: 'Message sent!'
};
};
最后,您可以向此 Azure 函数发出请求,在其中将对话参考作为 application/json
.
使用 signOutUser 等功能扩展此示例很简单。您可以调用 continueConversation
函数中的所有函数,就像在普通机器人中一样。如果您愿意,您甚至可以在那里接收适配器对象。
await adapter.continueConversation(conversationReference, async turnContext => {
// Sign user out
turnContext.adapter.signOutUser(turnContext, 'connection-name');
});