Отправка проактивных сообщений из Azure функций на ботсервис - узел - PullRequest
1 голос
/ 12 марта 2020

Я использую botframework v4, но, переходя с v3, я не нашел никакой документации, похожей на код, который я использую ниже, но для v4, относительно отправки проактивных сообщений из Azure Приложение функции

Ниже приведен код, который я использовал ранее, но у меня возникли проблемы с адаптацией:

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 Функции снова оказывается трудным.

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 12 марта 2020

Здорово, что вы делаете переход с v3 на v4! Вы смотрели на Отправлять проактивные уведомления пользователям ? Этот пример довольно прост и может использоваться в функции Azure.

Сначала вы получаете ссылку на беседу в своем боте, вызывая TurnContext.getConversationReference(context.activity);. Это ссылка, которую вы можете использовать в своей проактивной функции, чтобы открыть диалог. В вашем случае вы предоставляете это через тело запроса в проактивную функцию, поэтому я сделаю то же самое в моем примере.

Мой пример проактивной конечной точки написан на Typescript, однако он работает аналогично обычному Javascript. Создайте триггер HTTP в Azure Функции и используйте следующий код. Я добавил комментарии для большей ясности.

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, как в обычном боте. Вы даже можете получить объект адаптера там, если вы будете sh.

await adapter.continueConversation(conversationReference, async turnContext => {
    // Sign user out
    turnContext.adapter.signOutUser(turnContext, 'connection-name');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...