Как сохранить активные сообщения, отправленные на бот? - PullRequest
0 голосов
/ 29 апреля 2019

Я отправляю сообщение своему боту с помощью Microsoft BotConnector, но они не регистрируются как обычные сообщения.Для записи сообщений в БД я написал специальный регистратор:

class CustomLogger {
    /**
     * Log an activity to the transcript file.
     * @param activity Activity being logged.
     */
    constructor() {
        this.conversations = {};
    }

    logActivity(activity) {

        if (activity) {
            console.log("Log information")
        }


        if (!activity) {
            throw new Error("Activity is required.");
        }
        if (activity.conversation) {
            var id = activity.conversation.id;
            if (id.indexOf("|" !== -1)) {
                id = activity.conversation.id.replace(/\|.*/, "");
            }
        }

        if (activity.type === "message") {
            Conv.create({
                text: activity.text,
                conv_id: activity.conversation.id,
                from_type: activity.from.role,
                message_id: activity.id || activity.replyToId
            }).then(() => {
                console.log("logged");
            });
            delete this.conversations[id];
        }
    }
}

, он прекрасно работает с обычными сообщениями, но не работает с сообщениями, которые отправляются на

POST / v3 / разговор /{разговорId} / деятельность

через соединитель бота Microsoft.

Когда я отправляю сообщение с помощью соединителя бота, он не регистрирует запрос через действие.

Код, который яиспользую для отправки активных сообщений:

/**
 * Send message to the user.
 */
function sendMessage(token, conversation, name) {

  var config = {
    headers: { "Authorization": "Bearer " + token }
  };

  var bodyParameters = {
    "type": "message",
    "text": name
  }

  axios.post(
    'https://smba.trafficmanager.net/apis/v3/conversations/29:XXXXXXXXXXXXXXX/activities',
    bodyParameters,
    config
  ).then((response) => {
    console.log(response)
  }).catch((error) => {
    console.log(error)
  });
}


let name = "Hey, How was your week?";
let conversation = "29:XXXXXXXXXXXXXXX";

run(conversation, name);

1 Ответ

0 голосов
/ 02 мая 2019

Вместо того, чтобы использовать REST API для отправки проактивных сообщений пользователям, я бы рекомендовал использовать адаптер BotFramework для продолжения разговора с пользователем. Когда вы отправляете предупреждающее сообщение от адаптера, действие проходит через промежуточное программное обеспечение регистратора и сохраняется в хранилище. Если вы хотите инициировать проактивное сообщение из функции Azure, вы можете настроить другую конечную точку обмена сообщениями в файле индекса, который вы вызываете из функции. Посмотрите на фрагменты кода ниже.

index.js

// Listen for incoming notifications and send proactive messages to user.
server.get('/api/notify/:conversationID', async (req, res) => {
    const { conversationID } = req.params;
    const conversationReference = conversationReferences[conversationID];

    await adapter.continueConversation(conversationReference, async turnContext => {
        await turnContext.sendActivity('proactive hello');
    });


    res.setHeader('Content-Type', 'text/html');
    res.writeHead(200);
    res.write('<html><body><h1>Proactive messages have been sent.</h1></body></html>');
    res.end();
});

Для получения более подробной информации я хотел бы взглянуть на этот Пример активных сообщений . Он находится в ветви samples-work-in-progress и может немного измениться, но это отличный пример того, как настроить проект для отправки проактивного сообщения с конечной точки Restify.

Надеюсь, это поможет!

...