Отправка уведомлений веб-канала действий пользователям в Microsoft Teams
Статья
Веб-канал действий Microsoft Teams позволяет пользователям рассматривать элементы, требующие внимания, уведомляя их об изменениях. Вы можете использовать API-интерфейсы уведомлений веб-канала действий в Microsoft Graph, чтобы расширить эту функцию для приложений. Это позволяет вашим приложениям предоставлять более широкие возможности и лучше привлекать пользователей, помогая поддерживать их в курсе изменений в используемых ими средствах и рабочих процессах.
Основные сведения об уведомлении веб-канала действий
Уведомления веб-канала действий в Microsoft Teams состоят из нескольких битов информации, отображаемой вместе, как показано на следующем рисунке.
К компонентам относятся:
Субъект, инициировавший действие
Значок, представляющий тип действия
Причина, по которой субъект выполнил действие
Предварительный просмотр текста
Метка времени
Место действия
В следующем примере показано, как эти компоненты вместе предоставляют сведения об уведомлении. В этом примере показано уведомление о пользователе, упомянутом в сообществе Yammer.
Требования к использованию API уведомлений канала действий
API веб-канала действий работают с приложением Teams. Ниже приведены требования к отправке уведомлений веб-канала действий.
Манифест приложения Teams должен содержать Azure AD идентификатор приложения, добавленный в webApplicationInfo раздел. Дополнительные сведения см. в разделе Схема манифеста.
Типы действий должны быть объявлены activities в разделе . Дополнительные сведения см. в разделе Схема манифеста.
Приложение Teams должно быть установлено для получателя лично, в команде или чате , в котором он участвует. Дополнительные сведения см. в разделе Установка приложения Teams.
Изменения манифеста приложения Teams
В этом разделе описываются изменения, которые необходимо добавить в манифест приложения Teams. Обратите внимание, что вы должны использовать версию манифеста приложения Teams или более позднюю.1.7
Azure AD идентификатор приложения (идентификатор клиента).
resource
string
Ресурс, связанный с приложением Azure AD. Также называется URL-адресом ответа или перенаправления на портале Azure.
Примечание.
Если несколько приложений Teams в одной область (команда, чат или пользователь) используют одно и то же приложение Azure AD, может возникнуть ошибка. Убедитесь, что вы используете уникальные приложения Azure AD.
изменения раздела действий
"activities":
{
"activityTypes": [
{
"type": "taskCreated",
"description": "Task Created Activity",
"templateText": "{actor} created task {taskId} for you"
},
{
"type": "approvalRequired",
"description": "Deployment requires your approval",
"templateText": "{actor} created a new deployment {deploymentId}"
}
]
}
Параметр
Тип
Описание
type
string
Тип действия. Он должен быть уникальным в определенном манифесте.
description
string
Понятное краткое описание. Это будет отображаться в клиенте Microsoft Teams.
templateText
string
Текст шаблона для уведомления о действии. Параметры можно объявить, инкапсулировав параметры в {}.
Примечание.
actor — это специальный параметр, который всегда принимает имя вызывающего объекта. В делегированных вызовах actor — имя пользователя. В вызовах только для приложений оно принимает имя приложения Teams.
Установка приложения Teams
Приложения Teams можно установить в команде, чате или лично для пользователя, а также распространять их несколькими способами. Дополнительные сведения см. в разделе Методы распространения приложений Teams. Как правило, загрузка неопубликованных приложений предпочтительна для целей разработки. После разработки вы можете выбрать правильный метод распространения в зависимости от того, хотите ли вы распространить на один клиент или на всех клиентов.
Дополнительные сведения о том, какие разделы поддерживаются для каждого сценария, см. в конкретных API. Пользовательские текстовые разделы поддерживаются во всех сценариях.
Примечание.
Значок действия основан на контексте, в который выполняется запрос. Если запрос выполняется с делегированными разрешениями, фотография пользователя отображается в качестве аватара, а значок приложения Teams — как значок действия. В контексте только приложения в качестве аватара используется значок приложения Teams, а значок действия опущен.
Пример 1. Уведомление пользователя о задаче, созданной в чате
В этом примере показано, как отправить уведомление веб-канала действий для новой задачи, созданной в чате. В этом случае приложение Teams должно быть установлено в чате с идентификатором chatId , а пользователь 569363e2-4e49-4661-87f2-16f245c5d66a также должен быть частью чата.
// Code snippets are only available for the latest version. Current version is 5.x
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Chats.Item.SendActivityNotification.SendActivityNotificationPostRequestBody
{
Topic = new TeamworkActivityTopic
{
Source = TeamworkActivityTopicSource.EntityUrl,
Value = "https://graph.microsoft.com/v1.0/chats/{chatId}",
},
ActivityType = "taskCreated",
PreviewText = new ItemBody
{
Content = "New Task Created",
},
Recipient = new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.aadUserNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"userId" , "569363e2-4e49-4661-87f2-16f245c5d66a"
},
},
},
TemplateParameters = new List<KeyValuePair>
{
new KeyValuePair
{
Name = "taskId",
Value = "12322",
},
},
};
await graphClient.Chats["{chat-id}"].SendActivityNotification.PostAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new SendActivityNotificationPostRequestBody();
$topic = new TeamworkActivityTopic();
$topic->setSource(new TeamworkActivityTopicSource('entityurl'));
$topic->setValue('https://graph.microsoft.com/v1.0/chats/{chatId}');
$requestBody->setTopic($topic);
$requestBody->setActivityType('taskCreated');
$previewText = new ItemBody();
$previewText->setContent('New Task Created');
$requestBody->setPreviewText($previewText);
$recipient = new TeamworkNotificationRecipient();
$recipient->set@odatatype('microsoft.graph.aadUserNotificationRecipient');
$additionalData = [
'userId' => '569363e2-4e49-4661-87f2-16f245c5d66a',
];
$recipient->setAdditionalData($additionalData);
$requestBody->setRecipient($recipient);
$templateParametersKeyValuePair1 = new KeyValuePair();
$templateParametersKeyValuePair1->setName('taskId');
$templateParametersKeyValuePair1->setValue('12322');
$templateParametersArray []= $templateParametersKeyValuePair1;
$requestBody->setTemplateParameters($templateParametersArray);
$graphServiceClient->chats()->byChatId('chat-id')->sendActivityNotification()->post($requestBody);
Пример 2. Уведомление пользователя о задаче, созданной в команде
В этом примере показано, как отправить уведомление о веб-канале действий для команды. В этом примере владелец команды уведомляет о новой созданной задаче, требующей внимания.
// Code snippets are only available for the latest version. Current version is 5.x
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Teams.Item.SendActivityNotification.SendActivityNotificationPostRequestBody
{
Topic = new TeamworkActivityTopic
{
Source = TeamworkActivityTopicSource.EntityUrl,
Value = "https://graph.microsoft.com/v1.0/teams/{teamId}",
},
ActivityType = "taskCreated",
PreviewText = new ItemBody
{
Content = "New Task Created",
},
Recipient = new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.aadUserNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"userId" , "569363e2-4e49-4661-87f2-16f245c5d66a"
},
},
},
TemplateParameters = new List<KeyValuePair>
{
new KeyValuePair
{
Name = "taskId",
Value = "12322",
},
},
};
await graphClient.Teams["{team-id}"].SendActivityNotification.PostAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new SendActivityNotificationPostRequestBody();
$topic = new TeamworkActivityTopic();
$topic->setSource(new TeamworkActivityTopicSource('entityurl'));
$topic->setValue('https://graph.microsoft.com/v1.0/teams/{teamId}');
$requestBody->setTopic($topic);
$requestBody->setActivityType('taskCreated');
$previewText = new ItemBody();
$previewText->setContent('New Task Created');
$requestBody->setPreviewText($previewText);
$recipient = new TeamworkNotificationRecipient();
$recipient->set@odatatype('microsoft.graph.aadUserNotificationRecipient');
$additionalData = [
'userId' => '569363e2-4e49-4661-87f2-16f245c5d66a',
];
$recipient->setAdditionalData($additionalData);
$requestBody->setRecipient($recipient);
$templateParametersKeyValuePair1 = new KeyValuePair();
$templateParametersKeyValuePair1->setName('taskId');
$templateParametersKeyValuePair1->setValue('12322');
$templateParametersArray []= $templateParametersKeyValuePair1;
$requestBody->setTemplateParameters($templateParametersArray);
$graphServiceClient->teams()->byTeamId('team-id')->sendActivityNotification()->post($requestBody);
Пример 3. Уведомление пользователя о событии с помощью пользовательского раздела
Как показано в предыдущих примерах, можно связать с различными аспектами команды или чата. Однако если вы хотите связать с аспектом, который не является частью команды или не представлен Microsoft Graph, или вы хотите настроить имя, можно задать источник topictext объекта в и передать для него настраиваемое значение. Кроме того, требуется при webUrl использовании topic источника в качестве text.
В приведенном выше примере уведомления Yammer используется пользовательский раздел, так как ресурсы Yammer не поддерживаются Microsoft Graph.
Примечание.
webUrl должен начинаться с домена Microsoft Teams (например, teams.microsoft.com).
// Code snippets are only available for the latest version. Current version is 5.x
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Teams.Item.SendActivityNotification.SendActivityNotificationPostRequestBody
{
Topic = new TeamworkActivityTopic
{
Source = TeamworkActivityTopicSource.Text,
Value = "Deployment Approvals Channel",
WebUrl = "https://teams.microsoft.com/l/message/19:448cfd2ac2a7490a9084a9ed14cttr78c@thread.skype/1605223780000?tenantId=c8b1bf45-3834-4ecf-971a-b4c755ee677d&groupId=d4c2a937-f097-435a-bc91-5c1683ca7245&parentMessageId=1605223771864&teamName=Approvals&channelName=Azure%20DevOps&createdTime=1605223780000",
},
ActivityType = "approvalRequired",
PreviewText = new ItemBody
{
Content = "New deployment requires your approval",
},
Recipient = new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.aadUserNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"userId" , "569363e2-4e49-4661-87f2-16f245c5d66a"
},
},
},
TemplateParameters = new List<KeyValuePair>
{
new KeyValuePair
{
Name = "deploymentId",
Value = "6788662",
},
},
};
await graphClient.Teams["{team-id}"].SendActivityNotification.PostAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new SendActivityNotificationPostRequestBody();
$topic = new TeamworkActivityTopic();
$topic->setSource(new TeamworkActivityTopicSource('text'));
$topic->setValue('Deployment Approvals Channel');
$topic->setWebUrl('https://teams.microsoft.com/l/message/19:448cfd2ac2a7490a9084a9ed14cttr78c@thread.skype/1605223780000?tenantId=c8b1bf45-3834-4ecf-971a-b4c755ee677d&groupId=d4c2a937-f097-435a-bc91-5c1683ca7245&parentMessageId=1605223771864&teamName=Approvals&channelName=Azure%20DevOps&createdTime=1605223780000');
$requestBody->setTopic($topic);
$requestBody->setActivityType('approvalRequired');
$previewText = new ItemBody();
$previewText->setContent('New deployment requires your approval');
$requestBody->setPreviewText($previewText);
$recipient = new TeamworkNotificationRecipient();
$recipient->set@odatatype('microsoft.graph.aadUserNotificationRecipient');
$additionalData = [
'userId' => '569363e2-4e49-4661-87f2-16f245c5d66a',
];
$recipient->setAdditionalData($additionalData);
$requestBody->setRecipient($recipient);
$templateParametersKeyValuePair1 = new KeyValuePair();
$templateParametersKeyValuePair1->setName('deploymentId');
$templateParametersKeyValuePair1->setValue('6788662');
$templateParametersArray []= $templateParametersKeyValuePair1;
$requestBody->setTemplateParameters($templateParametersArray);
$graphServiceClient->teams()->byTeamId('team-id')->sendActivityNotification()->post($requestBody);
Пример 4. Уведомление участников команды о событии
В этом примере показано, как отправить уведомление о веб-канале действий всем участникам команды. В этом примере участники команды уведомляют о новом событии.
// Code snippets are only available for the latest version. Current version is 5.x
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Teams.Item.SendActivityNotification.SendActivityNotificationPostRequestBody
{
Topic = new TeamworkActivityTopic
{
Source = TeamworkActivityTopicSource.Text,
Value = "Weekly Virtual Social",
WebUrl = "Teams webUrl",
},
PreviewText = new ItemBody
{
Content = "It will be fun!",
},
ActivityType = "eventCreated",
Recipient = new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.teamMembersNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"teamId" , "7155e3c8-175e-4311-97ef-572edc3aa3db"
},
},
},
};
await graphClient.Teams["{team-id}"].SendActivityNotification.PostAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new SendActivityNotificationPostRequestBody();
$topic = new TeamworkActivityTopic();
$topic->setSource(new TeamworkActivityTopicSource('text'));
$topic->setValue('Weekly Virtual Social');
$topic->setWebUrl('Teams webUrl');
$requestBody->setTopic($topic);
$previewText = new ItemBody();
$previewText->setContent('It will be fun!');
$requestBody->setPreviewText($previewText);
$requestBody->setActivityType('eventCreated');
$recipient = new TeamworkNotificationRecipient();
$recipient->set@odatatype('microsoft.graph.teamMembersNotificationRecipient');
$additionalData = [
'teamId' => '7155e3c8-175e-4311-97ef-572edc3aa3db',
];
$recipient->setAdditionalData($additionalData);
$requestBody->setRecipient($recipient);
$graphServiceClient->teams()->byTeamId('team-id')->sendActivityNotification()->post($requestBody);
В этом примере показано, как отправить уведомление о веб-канале действий всем участникам канала. В этом примере участники канала уведомляют о новом событии.
// Code snippets are only available for the latest version. Current version is 5.x
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Teams.Item.SendActivityNotification.SendActivityNotificationPostRequestBody
{
Topic = new TeamworkActivityTopic
{
Source = TeamworkActivityTopicSource.Text,
Value = "Weekly Virtual Social",
WebUrl = "Teams webUrl",
},
PreviewText = new ItemBody
{
Content = "It will be fun!",
},
ActivityType = "eventCreated",
Recipient = new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.channelMembersNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"teamId" , "7155e3c8-175e-4311-97ef-572edc3aa3db"
},
{
"channelId" , "19:0ea5de04de4743bcb4cd20cb99235d99@thread.tacv2"
},
},
},
};
await graphClient.Teams["{team-id}"].SendActivityNotification.PostAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new SendActivityNotificationPostRequestBody();
$topic = new TeamworkActivityTopic();
$topic->setSource(new TeamworkActivityTopicSource('text'));
$topic->setValue('Weekly Virtual Social');
$topic->setWebUrl('Teams webUrl');
$requestBody->setTopic($topic);
$previewText = new ItemBody();
$previewText->setContent('It will be fun!');
$requestBody->setPreviewText($previewText);
$requestBody->setActivityType('eventCreated');
$recipient = new TeamworkNotificationRecipient();
$recipient->set@odatatype('microsoft.graph.channelMembersNotificationRecipient');
$additionalData = [
'teamId' => '7155e3c8-175e-4311-97ef-572edc3aa3db',
'channelId' => '19:0ea5de04de4743bcb4cd20cb99235d99@thread.tacv2',
];
$recipient->setAdditionalData($additionalData);
$requestBody->setRecipient($recipient);
$graphServiceClient->teams()->byTeamId('team-id')->sendActivityNotification()->post($requestBody);
В этом примере показано, как отправить уведомление о веб-канале действий всем участникам чата. В этом примере участники чата уведомляют о новом событии.
// Code snippets are only available for the latest version. Current version is 5.x
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Chats.Item.SendActivityNotification.SendActivityNotificationPostRequestBody
{
Topic = new TeamworkActivityTopic
{
Source = TeamworkActivityTopicSource.Text,
Value = "Weekly Virtual Social",
WebUrl = "Teams webUrl",
},
PreviewText = new ItemBody
{
Content = "It will be fun!",
},
ActivityType = "eventCreated",
Recipient = new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.chatMembersNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"chatId" , "19:d65713bc498c4a428c71ef9353e6ce20@thread.v2"
},
},
},
};
await graphClient.Chats["{chat-id}"].SendActivityNotification.PostAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$requestBody = new SendActivityNotificationPostRequestBody();
$topic = new TeamworkActivityTopic();
$topic->setSource(new TeamworkActivityTopicSource('text'));
$topic->setValue('Weekly Virtual Social');
$topic->setWebUrl('Teams webUrl');
$requestBody->setTopic($topic);
$previewText = new ItemBody();
$previewText->setContent('It will be fun!');
$requestBody->setPreviewText($previewText);
$requestBody->setActivityType('eventCreated');
$recipient = new TeamworkNotificationRecipient();
$recipient->set@odatatype('microsoft.graph.chatMembersNotificationRecipient');
$additionalData = [
'chatId' => '19:d65713bc498c4a428c71ef9353e6ce20@thread.v2',
];
$recipient->setAdditionalData($additionalData);
$requestBody->setRecipient($recipient);
$graphServiceClient->chats()->byChatId('chat-id')->sendActivityNotification()->post($requestBody);
Пример 7. Уведомление нескольких пользователей об ожидающих запросах на утверждение финансов
В следующем примере показано, как отправить уведомление о веб-канале действий нескольким пользователям в массовом режиме. В этом примере несколько заинтересованных лиц уведомляют о ожидающих запросах на утверждение финансирования.
// Code snippets are only available for the latest version. Current version is 5.x
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Teamwork.SendActivityNotificationToRecipients.SendActivityNotificationToRecipientsPostRequestBody
{
Topic = new TeamworkActivityTopic
{
Source = TeamworkActivityTopicSource.EntityUrl,
Value = "https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/{teamsAppId}",
},
ActivityType = "pendingFinanceApprovalRequests",
PreviewText = new ItemBody
{
Content = "Internal spending team has a pending finance approval requests",
},
Recipients = new List<TeamworkNotificationRecipient>
{
new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.aadUserNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"userId" , "569363e2-4e49-4661-87f2-16f245c5d66a"
},
},
},
new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.aadUserNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"userId" , "ab88234e-0874-477c-9638-d144296ed04f"
},
},
},
new TeamworkNotificationRecipient
{
OdataType = "microsoft.graph.aadUserNotificationRecipient",
AdditionalData = new Dictionary<string, object>
{
{
"userId" , "01c64f53-69aa-42c7-9b7f-9f75195d6bfc"
},
},
},
},
TemplateParameters = new List<KeyValuePair>
{
new KeyValuePair
{
Name = "pendingRequestCount",
Value = "5",
},
},
};
await graphClient.Teamwork.SendActivityNotificationToRecipients.PostAsync(requestBody);
Настройка оповещений о том, как уведомления оповещают вас
Пользователи Microsoft Teams могут настраивать уведомления, которые они видят в веб-канале, в виде баннера и т. д. Уведомления, созданные с помощью API веб-канала действий, также можно настроить. Пользователи могут выбирать способ уведомления с помощью параметров в Microsoft Teams. Приложения Teams будут отображаться в списке для выбора пользователем, как показано на следующем снимке экрана.
Пользователи могут нажать кнопку Изменить рядом с приложением и настроить уведомления, как показано в следующем примере. Отображается description поле в манифесте приложения Teams.
Вопросы и ответы
Кому нужно установить приложение Teams?
У целевого пользователя должно быть установлено приложение Teams, которое отправляет уведомления.
Может ли пользователь отправлять уведомления себе?
Нет, пользователь не может отправлять уведомления себе. В этом сценарии используйте разрешения приложения.
Может ли приложение Teams управлять отображением уведомлений для пользователя?
Нет, изменять параметры уведомлений могут только пользователи.
Я установил свое приложение; Почему в учетной записи пользователя не отображаются параметры уведомлений?
Параметры появятся после отправки первого уведомления приложением Teams. Это сокращает количество параметров, которые видят пользователи.
Я начал получать ошибку 409 (конфликт); как ее устранить?
ConflictОшибки в основном возникают, когда несколько приложений Teams, установленных в одной область (команда, чат, пользователь и т. д.), имеют одинаковый Azure AD appId в webApplicationInfo разделе манифеста. В этом случае вы получите сообщение об ошибке, Found multiple applications with the same Azure AD App ID 'Your AzureAD AppId'.например . Убедитесь, что вы используете уникальные приложения Azure AD для уникальных приложений Teams. Обратите внимание, что одно и то же приложение Teams можно установить в нескольких областях (например, команда и пользователь).