Чтобы предотвратить (или, по крайней мере, предотвратить) спам, ваш бот может отправлять проактивные сообщения только на каналы или групповые чаты, где он уже установлен. В этом случае вам нужно будет сохранить необходимую информацию из полученного вами события dialogUpdate membersAdded.
Для чатов 1: 1 можно создать новый разговор с пользователем, однако ваш бот нуждается в этом. знать идентификатор пользователя, чтобы сделать это. Обычно это достигается путем получения списка группового чата или команды, в которой установлен ваш бот.
По существу, невозможно отправить полностью проактивное сообщение - бот должен быть установлен и / или иметь некоторое количество информации о том, куда оно отправляло сообщение ранее.
Если вы можете получить правильные разрешения, можно предварительно установить вашего бота. См. Эту статью для получения более подробной информации об этом подходе: https://docs.microsoft.com/en-us/graph/teams-proactive-messaging
Несмотря на то, что он находится в C#, этот образец может оказаться полезным, поскольку он демонстрирует минимальный объем информации, требуемый для порядок отправки проактивных сообщений каждому типу назначения (который одинаков для разных языков): https://github.com/clearab/teamsProactiveMessaging.
Соответствующий файл находится ниже:
public class MessageSender : IMessageSender
{
private ConnectorClient conClient;
private string serviceUrl;
public MessageSender(string serviceUrl, string id, string password)
{
MicrosoftAppCredentials.TrustServiceUrl(serviceUrl);
conClient = new ConnectorClient(new Uri(serviceUrl), id, password);
}
public async Task<ResourceResponse> SendOneToOneMessage(string conversationId, Activity activity)
{
return await conClient.Conversations.SendToConversationAsync(conversationId, activity);
}
public async Task<ConversationResourceResponse> CreateOneToOneConversation(string userId, string tenantId)
{
var members = new List<ChannelAccount>()
{
new ChannelAccount
{
Id = userId
}
};
ConversationParameters conParams = new ConversationParameters
{
Members = members,
TenantId = tenantId
};
return await this.conClient.Conversations.CreateConversationAsync(conParams);
}
public async Task<ConversationResourceResponse> CreateAndSendChannelMessage(string channelId, Activity activity)
{
ConversationParameters conParams = new ConversationParameters
{
ChannelData = new TeamsChannelData
{
Channel = new ChannelInfo(channelId)
},
Activity = activity
};
ConversationResourceResponse response = await this.conClient.Conversations.CreateConversationAsync(conParams);
return response;
}
public async Task<ResourceResponse> SendReplyToConversationThread(string threadId, Activity activity)
{
return await this.conClient.Conversations.SendToConversationAsync(threadId, activity);
}
}