Упреждающий обмен сообщениями для ботов
Важно!
Эта статья основана на пакете SDK Bot Framework версии 3. Если вы ищете текущую документацию по пакету SDK версии 4.6 или более поздней, см. раздел Боты для бесед.
Упреждающее сообщение — это сообщение, отправляемое ботом для начала беседы. Существует множество различных причин для инициирования беседы ботом, в том числе:
- Приветственные сообщения для личных бесед бота.
- Опрос ответов.
- Уведомления о внешних событиях.
Отправка сообщения для запуска нового потока беседы отличается от отправки сообщения в ответ на существующую беседу. Когда бот инициирует новую беседу, у него нет существующей беседы для публикации сообщения. Чтобы отправить упреждающее сообщение, выполните следующие шаги:
- Решите, что вы собираетесь сказать
- Получите уникальный идентификатор пользователя и идентификатор клиента
- Отправка сообщения
При создании упреждающих сообщений обязательно вызовите MicrosoftAppCredentials.TrustServiceUrl
и передайте туда URL-адрес службы, прежде чем создавать объект ConnectorClient
, используемый для отправки сообщения. В противном случае приложение получит ответ 401: Unauthorized
. Дополнительные сведения см. в примерах.
Рекомендации по упреждающим сообщениям
Отправка упреждающих сообщений пользователям может быть эффективным способом общения с ними. Однако с точки зрения пользователя сообщение отображается без причины. Если есть приветственное сообщение, это первый раз, когда они взаимодействуют с вашим приложением. Важно использовать эту функциональность и предоставить пользователю полную информацию, чтобы он понял назначение этого сообщения.
Как правило, упреждающие сообщения относятся к одной из двух категорий: приветствиям или уведомлениям.
Приветствия
При использовании упреждающего обмена сообщениями для отправки приветственного сообщения пользователю убедитесь, что с точки зрения пользователя сообщение отображается без запроса с его стороны. Если есть приветственное сообщение, это первый раз, когда они взаимодействуют с вашим приложением. К лучшим приветственным сообщениям относятся:
- Почему получено это сообщение: пользователю должно быть понятно, почему он получает это сообщение. Если бот был установлен в канале и вы отправили приветствие всем пользователям, сообщите, в каком канале он установлен и кто его установил.
- Что вы можете предложить: что могут пользователи делать с вашим приложением? Какая от него может быть польза?
- Что делать дальше: пригласите пользователей попробовать выполнить команду или каким-то иным образом взаимодействовать с вашим приложением.
Уведомления
При использовании упреждающего обмена сообщениями для отправки уведомлений необходимо убедиться, что у пользователей есть четкий путь для выполнения общих действий на основе вашего уведомления и четкое понимание причин возникновения уведомления. Хорошие уведомления обычно включают в себя:
- Что произошло: четкое указание на то, что именно стало причиной получения уведомления.
- С кем/чем это произошло: должно быть ясно, обновление какого элемента (или какое иное событие) вызвало необходимость отправки уведомления.
- Кто это сделал: кто предпринял действия, которые привели к отправке оповещения.
- Что пользователи могут сделать по этому поводу: обеспечьте пользователям удобные средства реагирования на ваше уведомление.
- Как они могут отказаться: укажите пользователям способ отказаться от дополнительных уведомлений.
Получение необходимых сведений о пользователе
Боты могут создавать новые беседы с отдельным пользователем Microsoft Teams, получив уникальный идентификатор пользователя и идентификатор клиента. Эти значения можно получить с помощью одного из следующих методов:
- Получение списка команд из канала, где установлено приложение.
- Кэширование их при взаимодействии пользователя с ботом в канале.
- Когда пользователь @упомянут в беседе канала, в которой участвует бот.
- Кэширование их при получении события
conversationUpdate
установки приложения в личной области или добавлении новых участников в канал или групповой чат.
Заранее установите приложение с помощью Graph
Примечание.
Упреждающая установка приложений с помощью graph находится в бета-версии.
Иногда бывает нужно заблаговременно отправить сообщения пользователям, которые ранее не устанавливали ваше приложение или не взаимодействовали с ним. Например, вы хотите использовать корпоративный коммуникатор для отправки сообщений всей организации. В этом сценарии можно использовать API Graph для упреждающей установки приложения для пользователей, а затем кэшировать необходимые значения из события conversationUpdate
, получаемого приложением после установки.
Вы можете установить только приложения, которые находятся в каталоге приложений организации или в Магазине Microsoft Teams.
Подробные сведения см. в документации Graph по установке приложений для пользователей. В .NET также есть пример.
Примеры
Убедитесь, что вы прошли проверку подлинности и получили маркер носителя , прежде чем создавать беседу с помощью REST API.
POST {Service URL of your bot}/v3/conversations
{
"bot": {
"id": "c38eda0f-e780-49ae-86f0-afb644203cf8",
"name": "The Bot"
},
"members": [
{
"id": "29:012d20j1cjo20211"
}
],
"channelData": {
"tenant": {
"id": "197231joe-1209j01821-012kdjoj"
}
}
}
Укажите id
в качестве идентификатора приложения бота и name
в качестве имени бота. Вы можете получить members
id
из объекта ботов, TurnContext
например turnContext.Activity.From.Id
. Аналогичным образом, id
клиента, из объекта ботов TurnContext
, например turnContext.Activity.ChannelData.Tenant.Id
.
Необходимо предоставить ИД пользователя и ИД клиента. В случае успешного вызова API возвращает следующий объект отклика:
{
"id":"a:1qhNLqpUtmuI6U35gzjsJn7uRnCkW8NiZALHfN8AMxdbprS1uta2aT-jytfIlsZR3UZeg3TsIONNInBHsdjzj3PtfHuhkxxvS1jZZ61UAbw8fIdXcNSJyTJm7YvHFOgxo"
}
Этот идентификатор является уникальным идентификатором беседы личного чата. Сохраните это значение и повторно используйте его для будущих взаимодействий с пользователем.
Использование .NET
В этом примере используется пакет NuGet Microsoft.Bot.Connector.Teams.
// Create or get existing chat conversation with user
var response = client.Conversations.CreateOrGetDirectConversation(activity.Recipient, activity.From, activity.GetTenantId());
// Construct the message to post to conversation
Activity newActivity = new Activity()
{
Text = "Hello",
Type = ActivityTypes.Message,
Conversation = new ConversationAccount
{
Id = response.Id
},
};
// Post the message to chat conversation with user
await client.Conversations.SendToConversationAsync(newActivity, response.Id);
Использование Node.js
var address =
{
channelId: 'msteams',
user: { id: userId },
channelData: {
tenant: {
id: tenantId
}
},
bot:
{
id: appId,
name: appName
},
serviceUrl: session.message.address.serviceUrl,
useAuth: true
}
var msg = new builder.Message().address(address);
msg.text('Hello, this is a notification');
bot.send(msg);
Создание беседы на канале
Бот, добавленный в команду, может публиковать сообщения на канале, создавая новые цепочки ответов. Если вы используете пакет SDK Node.js Teams, используйте startReplyChain()
, чтобы получить полный адрес с правильным идентификатором действия и идентификатором беседы. Если вы используете C#, см. следующий пример.
В качестве альтернативы можно использовать REST API и отправить запрос POST к ресурсу /conversations
.
Примеры создания беседы канала
Пример .NET из этого примера
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Connector.Teams.Models;
using Microsoft.Teams.TemplateBotCSharp.Properties;
using System;
using System.Threading.Tasks;
namespace Microsoft.Teams.TemplateBotCSharp.Dialogs
{
[Serializable]
public class ProactiveMsgTo1to1Dialog : IDialog<object>
{
public async Task StartAsync(IDialogContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var channelData = context.Activity.GetChannelData<TeamsChannelData>();
var message = Activity.CreateMessageActivity();
message.Text = "Hello World";
var conversationParameters = new ConversationParameters
{
IsGroup = true,
ChannelData = new TeamsChannelData
{
Channel = new ChannelInfo(channelData.Channel.Id),
},
Activity = (Activity) message
};
MicrosoftAppCredentials.TrustServiceUrl(serviceUrl, DateTime.MaxValue);
var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
var response = await connectorClient.Conversations.CreateConversationAsync(conversationParameters);
context.Done<object>(null);
}
}
}
Дополнительные ресурсы
Platform Docs