По документам, Упреждающий обмен сообщениями для ботов :
Боты могут создавать новые разговоры с отдельным пользователем Microsoft Teams, если ваш бот имеет информацию о пользователе, полученную в результате предыдущего добавленияв личном, групповом или групповом чатах.Эта информация позволяет вашему боту заблаговременно уведомлять их.Например, если ваш бот был добавлен в команду, он мог бы запросить состав команды и отправить пользователям отдельные сообщения в личных чатах, или пользователь мог бы @mention другим пользователем, чтобы заставить бота отправить этому пользователю прямое сообщение.
Примечание. Расширение Microsoft.Bot.Builder.Teams все еще находится в предварительной версии для V4, поэтому образцы и код для него довольно сложно найти.
Добавление промежуточного программного обеспечения
В Startup.cs
:
var credentials = new SimpleCredentialProvider(Configuration["MicrosoftAppId"], Configuration["MicrosoftAppPassword"]);
services.AddSingleton(credentials);
[...]
services.AddBot<YourBot>(options =>
{
options.CredentialProvider = credentials;
options.Middleware.Add(
new TeamsMiddleware(
new ConfigurationCredentialProvider(this.Configuration)));
[...]
Подготовка вашего бота
В вашем основном <YourBot>.cs
:
private readonly SimpleCredentialProvider _credentialProvider;
[...]
public <YourBot>(ConversationState conversationState, SimpleCredentialProvider CredentialProvider)
{
_credentialProvider = CredentialProvider;
[...]
Отправкасообщение
var teamConversationData = turnContext.Activity.GetChannelData<TeamsChannelData>();
var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl), _credentialProvider.AppId, _credentialProvider.Password);
var userId = <UserIdToSendTo>;
var tenantId = teamConversationData.Tenant.Id;
var parameters = new ConversationParameters
{
Members = new[] { new ChannelAccount(userId) },
ChannelData = new TeamsChannelData
{
Tenant = new TenantInfo(tenantId),
},
};
var conversationResource = await connectorClient.Conversations.CreateConversationAsync(parameters);
var message = Activity.CreateMessageActivity();
message.Text = "This is a proactive message.";
await connectorClient.Conversations.SendToConversationAsync(conversationResource.Id, (Activity)message);
Примечание: если вам нужно получить ID пользователя, вы можете использовать:
var members = (await turnContext.TurnState.Get<IConnectorClient>().Conversations.GetConversationMembersAsync(
turnContext.Activity.GetChannelData<TeamsChannelData>().Team.Id).ConfigureAwait(false)).ToList();
Кроме того, мне не понадобилось это в моем тестировании, но если вы получите401 ошибка, вам может понадобиться доверять Teams ServiceUrl :
MicrosoftAppCredentials.TrustServiceUrl(turnContext.Activity.ServiceUrl);
Ресурсы