Отправка проактивных сообщений на канал в командах - PullRequest
2 голосов
/ 22 марта 2020

Итак,

Я искал повсюду, прочитал все, что мог найти в топи c, и мне все еще не удается это сделать. Мне удалось отправить проактивное сообщение пользователю, ответить на команду topi c, et c. но я не могу отправить упреждающее сообщение (создать новое сообщение) в канале команды.

Есть ли доступный пример (я не смог его найти)? MS Docs для NodeJS, кажется, показывает пример передачи сообщений каждому пользователю в команде, но не сам канал.

Я исследовал исходный код, и channelData жестко закодирован в null внутри botFrameworkAdapter.js, что только добавляет путаницы.

Итак, код basi c:

const builder = require('botbuilder');
const adapter = new builder.BotFrameworkAdapter({
    appId: 'XXX',
    appPassword: 'YYY'
});

const conversation = {
  channelData: {
    //I have all this (saved from event when bot joined the Team)
  },
  ...
  // WHAT THIS OBJECT NEEDS TO BE TO SEND A SIMPLE "HELLO" TO A CHANNEL?
  // I have all the d
};

adapter.createConversation(conversation, async (turnContext) => {
  turnContext.sendActivity('HELLO'); //This may or may not be needed?
});

Кто-нибудь делал это с Node? Если да, может ли кто-нибудь показать мне рабочий пример (с правильно сконструированным conversation объектом)?

* РЕДАКТИРОВАТЬ *

Как предложил Хилтон в ответе ниже, я попытался использовать ConnectorClient напрямую, но он возвращает ресурс недоступен (/v3/conversations)

Вот код, который я использую (буквально только это, просто пытаюсь отправить демонстрационное сообщение):

const path = require('path');
const { ConnectorClient, MicrosoftAppCredentials } = require('botframework-connector');

const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });

const serviceUrl = 'https://smba.trafficmanager.net/emea/';

async function sendToChannel() {
    MicrosoftAppCredentials.trustServiceUrl(serviceUrl);

    var credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
    var client = new ConnectorClient(credentials, { baseUri: serviceUrl });

    var conversationResponse = await client.conversations.createConversation({
        bot: {
            id: process.env.MicrosoftAppId,
            name: process.env.BotName
        },
        isGroup: true,
        conversationType: "channel",
        id: "19:XXX@thread.tacv2"
    });

    var acivityResponse = await client.conversations.sendToConversation(conversationResponse.id, {
        type: 'message',
        from: { id: process.env.MicrosoftAppId },
        text: 'This a message from Bot Connector Client (NodeJS)'
    });

}

sendToChannel();

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Хорошо, вот как я это сделал. Я публикую его здесь для дальнейшего использования.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : я до сих пор не знаю, как использовать его с botbuilder, как было задано в моем первоначальном вопросе, и этот ответ будет использовать ConnectorClient, что является приемлемым (по крайней мере для меня). Исходя из указаний Хилтона и проблемы с GitHub, которую я видел ранее (https://github.com/OfficeDev/BotBuilder-MicrosoftTeams/issues/162#issuecomment -434978847 ), я наконец-то заставил ее работать. Документация MS не очень полезна, поскольку они всегда используют переменную context, которая доступна, когда ваш бот отвечает на сообщение или действие, и они хранят записи этих контекстов внутри, пока бот работает. Однако, если ваш бот перезапускается по какой-либо причине или вы хотите сохранить свои данные в базе данных для последующего использования, это путь к go.

Итак, код (NodeJS):

const path = require('path');
const { ConnectorClient, MicrosoftAppCredentials } = require('botframework-connector');

const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });

const serviceUrl = 'https://smba.trafficmanager.net/emea/';

async function sendToChannel() {
    MicrosoftAppCredentials.trustServiceUrl(serviceUrl);

    var credentials = new MicrosoftAppCredentials(process.env.MicrosoftAppId, process.env.MicrosoftAppPassword);
    var client = new ConnectorClient(credentials, { baseUri: serviceUrl });

    var conversationResponse = await client.conversations.createConversation({
        bot: {
            id: process.env.MicrosoftAppId,
            name: process.env.BotName
        },
        isGroup: true,
        conversationType: "channel",
        channelData: {
            channel: { id: "19:XXX@thread.tacv2" }
        },
        activity: {
            type: 'message',
            text: 'This a message from Bot Connector Client (NodeJS)'
        }
    });

}

sendToChannel();

ПРИМЕЧАНИЕ : Как отметил Хилтон, serviceUrl также необходимо загрузить из вашей базы данных вместе с идентификатором канала. Он доступен внутри действия, которое вы получаете изначально, когда ваш бот добавлен в команду / канал / группу вместе с channelId, который вам также понадобится, и вам нужно сохранить их для дальнейшего использования (не кодируйте их жестко, как в примере ).

Итак, нет отдельных createConversation и sendActivity, все это в одном вызове.

Спасибо Хилтон за ваше время и размытое изображение моей руки в MS Docs:)

Надеюсь, это поможет кому-то еще

0 голосов
/ 22 марта 2020

(я заменяю свой предыдущий ответ, так как думаю, что он намного лучше соответствует ситуации).

Я рассмотрел этот вопрос подробнее и выполнил трассировку Фиддлера, чтобы получить более полный ответ. Я не Node парень, так что я не уверен, что это переведет 100% , но давайте посмотрим.

По сути, вы хотите отправить в следующую конечную точку: https://smba.trafficmanager.net/emea/v3/conversations/19: [RestOfYourChannelId] / Activities

, и вы будете публиковать сообщение, подобное следующему:

{
  "type": "message",
  "from": {
    "id": "28:[rest of bot user id]",
    "name": "[bot name]"
  },
  "conversation": {
    "isGroup": true,
    "conversationType": "channel",
    "id": "19:[RestOfYourChannelId]"
  },
  "text": "Test Message"
}

Однако для публикации на этой конечной точке вы нужно аутентифицироваться к нему должным образом. Это можно сделать и напрямую связаться с конечной точкой, но на самом деле проще просто использовать встроенные механизмы. Это означает получение и сохранение беседы, когда бот впервые устанавливается на канал. В этом файле показано, как это сделать (посмотрите, как он получает и сохраняет разговор по ссылке в функции this.onConversationUpdate). В этом же примере в другом файле показано, как использовать эту ссылку на разговор для фактической отправки проактивного сообщения - см. здесь , где используется adapter.continueConversation.

One члены команды ботов Microsoft также показывают это в аналогичных подробностях по поводу здесь . Он также добавляет MicrosoftAppCredentials.trustServiceUrl(ref.serviceUrl);, что может быть необходимо при определенных обстоятельствах (если у вас есть проблемы с безопасностью, попробуйте).

Это должно покрыть то, что вам нужно, поэтому дайте ему go и дайте мне знать, если у вас все еще есть трудности.

...