Поделиться через


Отправка и получение сообщений

Диалоговые боты взаимодействуют с пользователями через обмен сообщениями, что обеспечивает простое взаимодействие. Он может имитировать реальные беседы с пользователями с помощью текстовых или голосовых взаимодействий. Необходимо убедиться, что беседы бота являются интерактивными, динамическими, адаптивными и понятными для пользователей.

Содержимое сообщения

Взаимодействие между ботом и пользователем может включать различные типы содержимого сообщений, которые:

Тип содержимого От пользователя к боту От бота к пользователю
Форматированный текст и эмодзи ✔️ ✔️
Изображения ✔️ ✔️
Адаптивные карточки ✔️

Использование сообщений с форматированным текстом и эмодзи

Бот Teams может отправлять форматированный текст и эмодзи. Teams поддерживает эмодзи через UTF-16, например U+1F600 для улыбающегося лица.

Использование сообщений с рисунками

Чтобы сделать сообщение бота всплывающем, пользователь может добавить изображения в виде вложений:

  • Изображения могут иметь размер до 1024 × 1024 пикселей и 1 МБ в формате PNG, JPEG или GIF. Анимированные GIF-файлы не поддерживаются.

  • Высоту и ширину каждого изображения можно указать с помощью XML. В Markdown размер изображения по умолчанию — 256×256. Например:

    • ✔️ : <img src="http://aka.ms/Fo983c" alt="Duck on a rock" height="150" width="223"></img>.
    • ❌: ![Duck on a rock](http://aka.ms/Fo983c).

Дополнительные сведения о вложениях см. в статье Добавление мультимедийных вложений в сообщения.

Использование адаптивных карточек

Бот беседы может включать адаптивные карточки, которые упрощают бизнес-процессы. Адаптивные карточки предоставляют расширенные настраиваемые текст, речь, изображения, кнопки и поля ввода. Вы можете создавать адаптивные карточки в боте и отображаться в нескольких приложениях, таких как Teams, ваш веб-сайт и т. д.

Дополнительные сведения см. в разделе:

В следующем коде показан пример отправки простой адаптивной карточки:

Пример. Отправка простой адаптивной карточки
{
    "type": "AdaptiveCard",
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.5",
    "body": [
    {
        "items": [
        {
            "size": "large",
            "text": " Simple Adaptivecard Example with a Textbox",
            "type": "TextBlock",
            "weight": "bolder",
            "wrap": true
        },
        ],
        "spacing": "extraLarge",
        "type": "Container",
        "verticalContentAlignment": "center"
    }
    ]
}

Отправка и получение сообщений

Отправка и получение сообщений — это основная функция бота. Это позволяет боту:

В чате каждое сообщение является Activity объектом типа messageType: message. Когда кто-то отправляет сообщение, Microsoft Teams публикует его боту. Teams отправляет объект JSON в конечную точку обмена сообщениями бота и разрешает только одну конечную точку для обмена сообщениями. Затем бот проверяет сообщение, чтобы определить его тип и ответит соответствующим образом.

Основные беседы управляются через соединитель Bot Framework, который представляет собой один REST API. Этот API позволяет боту взаимодействовать с Teams и другими каналами. Пакет SDK Bot Builder предлагает следующие возможности:

  • Простой доступ к соединителю Bot Framework.
  • Средства для управления потоком беседы и состоянием.
  • Простые способы добавления когнитивных служб, таких как обработка естественного языка (NLP).

Бот получает сообщения из Teams с помощью Text свойства и может отправлять пользователям один или несколько ответов.

Дополнительные сведения см. в разделе атрибуция пользователей для сообщений бота.

В следующей таблице перечислены действия, которые бот может получать и выполнять действия.

Тип сообщения Объект полезных данных Scope
Действие получения сообщения Действие сообщения Все
Получение действия по изменению сообщения Действие изменения сообщения Все
Действие получения отмены сообщения Действие отмены сообщения Все
Действие получения сообщения обратимого удаления Действие обратимого удаления сообщений Все

Действие получения сообщения

Чтобы получить текстовое Text сообщение, используйте свойство Activity объекта . В обработчике активности бота используйте объект контекста поворота Activity для чтения одного запроса сообщения.

В следующем коде показан пример получения действия сообщения:


protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
  // Sends an activity to the sender of the incoming activity.
  await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken);
}

Получение уведомления о прочтении

Параметр Уведомления о прочтении в Teams позволяет отправителю сообщения чата получать уведомления о том, что его сообщение было прочитано получателем в чатах "один на один" и в групповых чатах. После того как получатель прочитает сообщение, рядом с ним появится значок Просмотрено . Вы также можете настроить бота для получения событий получения уведомлений о прочтении с помощью параметра Уведомления о прочтении . Событие уведомления о прочтении помогает улучшить взаимодействие с пользователем следующими способами:

  • Вы можете настроить бота для отправки последующего сообщения, если пользователь приложения не прочитал сообщение в личном чате.

  • Вы можете создать цикл обратной связи с помощью уведомлений о прочтении, чтобы настроить взаимодействие с ботом.

Примечание.

  • Уведомления о прочтении поддерживаются только в сценариях чата между пользователями и ботами.
  • Уведомления о прочтении ботов не поддерживают области группового, канала и группового чата.
  • Если администратор или пользователь отключает параметр Уведомления о прочтении , бот не получает событие уведомления о прочтении.

Чтобы получать события уведомлений о прочтении для бота, убедитесь в следующем:

    
"webApplicationInfo": {
    
     "id": "38f0ca43-1c38-4c39-8097e-47f62c686500",
     "resource": ""
},
"authorization": {
    "permissions": {
    "orgwide": [],
     "resourceSpecific": [
        {
        "name": "ChatMessageReadReceipt.Read.Chat",
        "type": "Application"
        }
        ]
     }
 }
    

Вы также можете добавить разрешения RSC с помощью API Graph. Дополнительные сведения см. в статье consentedPermissionSet.

  • Переопределите метод OnTeamsReadReceiptAsync обработчиком IsMessageRead .

    Вспомогательный IsMessageRead метод полезен для определения того, считывается ли сообщение получателями. compareMessageId Если значение меньше или равно LastReadMessageId, сообщение было прочитано. Переопределите OnTeamsReadReceiptAsync метод для получения уведомлений о прочтении с помощью IsMessageRead вспомогательного метода:

    
    protected override async Task OnTeamsReadReceiptAsync(ReadReceiptInfo readReceiptInfo, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken) 
    {
        var lastReadMessageId = readReceiptInfo.LastReadMessageId;
       if (IsMessageRead("{id of the message that you care}", LastReadMessageId))
       {
            await turnContext.SendActivityAsync(MessageFactory.Text("User read the bot's message"), cancellationToken);    
        }
    }
    

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

    {
        "name": "application/vnd.microsoft.readReceipt",
        "type": "event",
        "timestamp": "2023-08-16T17:23:11.1366686Z",
        "id": "f:b4783e72-9d7b-2ed9-ccef-ab446c873007",
        "channelId": "msteams",
        "serviceUrl": "https://smba.trafficmanager.net/amer/",
        "from": {
            "id": "29:1-8Iuh70W9pRqV8tQK8o2nVjxz33RRGDKLf4Bh7gKnrzN8s7e4vCyrFwjkPbTCX_Co8c4aXwWvq3RBLr-WkkVMw",
            "aadObjectId": "5b649834-7412-4cce-9e69-176e95a394f5"
        },
        "conversation": {
            "conversationType": "personal",
            "tenantId": "6babcaad-604b-40ac-a9d7-9fd97c0b779f",
            "id": "a:1xlimp68NSUxEqK0ap2rXuwC9ITauHgV2M4RaDPkeRhV8qMaFn-RyilMZ62YiVdqs8pp43yQaRKvv_U2S2gOS5nM-y_pOxVe4BW1qMGPtqD0Bv3pw-nJXF0zhDlZHMZ1Z"
        },
        "recipient": {
            "id": "28:9901a8b6-4fef-428b-80b1-ddb59361adeb",
            "name": "Test Bot"
        },
        "channelData": {
            "tenant": {
                "id": "6babcaad-604b-40ac-a9d7-9fd97c0b779f"
            }
        },
        "value": {
            "lastReadMessageId": "1692206589131"
        }
    }
    
    
  • Параметр администратора квитанции на чтение или пользовательский параметр включен для клиента, чтобы бот получал события получения уведомлений о прочтении. Администратор или пользователь должны включить или отключить параметр уведомления о прочтении.

После включения бота в сценарии чата пользователя бота бот быстро получает событие уведомления о прочтении, когда пользователь считывает сообщение бота. Вы можете отслеживать вовлеченность пользователей, подсчитывая количество событий, а также отправлять контекстное сообщение.

Получение действия по изменению сообщения

При редактировании сообщения бот получает уведомление о действии изменения сообщения.

Чтобы получить уведомление об изменении сообщения в боте, можно переопределить OnTeamsMessageEditAsync обработчик.

Ниже приведен пример уведомления об изменении сообщения с использованием OnTeamsMessageEditAsync при редактировании отправленного сообщения:


protected override async Task OnTeamsMessageEditAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken) 
{ 
var replyActivity = MessageFactory.Text("message is updated"); 
await turnContext.SendActivityAsync(replyActivity, cancellationToken); 
} 

Отправка сообщения

Чтобы отправить текстовое сообщение, укажите строку, которую нужно отправить в качестве действия. В обработчике действий бота используйте метод объекта контекста поворота SendActivityAsync для отправки одного ответа сообщения. Используйте метод объекта для отправки SendActivitiesAsync нескольких ответов.

В следующем коде показан пример отправки сообщения при добавлении пользователя в беседу:


protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
{
  // Sends an activity to the sender of the incoming activity.
  await turnContext.SendActivityAsync(MessageFactory.Text($"Hello and welcome!"), cancellationToken);
}

Примечание.

  • Разделение сообщений происходит, когда текстовое сообщение и вложение отправляются в одной и той же полезной нагрузке действия. Teams разделяет это действие на два отдельных действия: одно с текстовым сообщением, а другое с вложением. При разделении действия вы не получаете идентификатор сообщения в ответ, который используется для упреждающего обновления или удаления сообщения. Вместо разбиения сообщений рекомендуется отправлять отдельные действия.
  • Отправленные сообщения можно локализовать для обеспечения персонализации. Дополнительные сведения см. в статье Локализация приложения.

Сообщения, отправляемые между пользователями и ботами, включают в себя данные внутреннего канала в сообщении. Эти данные позволяют боту правильно взаимодействовать по этому каналу. Пакет SDK Bot Builder позволяет изменять структуру сообщений.

Действие получения отмены сообщения

При отмене удаления сообщения бот получает уведомление об активности отмены сообщения.

Чтобы получить уведомление о действиях отмены сообщения в боте, можно переопределить OnTeamsMessageUndeleteAsync обработчик.

Ниже приведен пример уведомления об OnTeamsMessageUndeleteAsync отмене сообщения при восстановлении удаленного сообщения.


protected override async Task OnTeamsMessageUndeleteAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
{ 
var replyActivity = MessageFactory.Text("message is undeleted"); 
await turnContext.SendActivityAsync(replyActivity, cancellationToken); 
} 

Действие получения сообщения обратимого удаления

При обратимом удалении сообщения бот получает уведомление об активности обратимого удаления сообщения.

Чтобы получить уведомление об активности сообщения обратимого удаления в боте, можно переопределить OnTeamsMessageSoftDeleteAsync обработчик.

В следующем примере показано уведомление об активности обратимого удаления сообщений с использованием OnTeamsMessageSoftDeleteAsync при обратимом удалении сообщения:


protected override async Task OnTeamsMessageSoftDeleteAsync(ITurnContext<IMessageDeleteActivity> turnContext, CancellationToken cancellationToken) 
{ 
var replyActivity = MessageFactory.Text("message is soft deleted"); 
await turnContext.SendActivityAsync(replyActivity, cancellationToken); 
} 

Обновление и удаление сообщений, отправленных ботом

Важно!

Примеры кода в этом разделе основаны на версии 4.6 и более поздних версиях пакета SDK Bot Framework. Если вы ищете документацию по более ранним версиям, см. раздел пакет SDK для ботов версии 3 в папке Устаревшие пакеты SDK документации.

Бот может динамически обновлять сообщения после их отправки, а не сохранять их в виде статических снимков данных. Сообщения также можно удалить с помощью метода DeleteActivity Bot Framework.

Примечание.

Бот не может обновлять или удалять сообщения, отправленные пользователем в Microsoft Teams.

Обновление сообщений

Вы можете использовать динамические обновления сообщений для таких сценариев, как обновления опроса, изменение действий, доступных после нажатия кнопки, или любое другое асинхронное изменение состояния.

Новое сообщение не обязательно должно совпадать по типу с исходным. Например, если исходное сообщение содержит вложение, новое сообщение может быть простым текстовым сообщением.

Чтобы обновить существующее сообщение, передайте новый объект Activity с существующим идентификатором действия в метод UpdateActivityAsync класса TurnContext.

// Send initial message
var response = await turnContext.SendActivityAsync(MessageFactory.Attachment(card.ToAttachment()), cancellationToken);
var activityId = response.Id; // Fetch activity id.

// MessageFactory.Text(): Specifies the type of text data in a message attachment.
var newActivity = MessageFactory.Text("The new text for the activity");
newActivity.Id = activityId;

// UpdateActivityAsync(): A method that can participate in update activity events for the current turn.
await turnContext.UpdateActivityAsync(newActivity, cancellationToken);

Теперь, когда вы обновили сообщения, обновите существующую карточку при выборе кнопки для входящих действий.

Обновить карточки

Чтобы обновить существующую карточку при выборе кнопки, вы можете использовать ReplyToId входящую активность.

Чтобы обновить существующую карточку при выборе кнопки, передайте новый объект Activity с обновленной карточкой и ReplyToId как идентификатор действия для метода UpdateActivityAsync класса TurnContext.

// Returns a message activity that contains an attachment.
var activity = MessageFactory.Attachment(card.ToAttachment());
activity.Id = turnContext.Activity.ReplyToId;

// A method that can participate in update activity events for the current turn.
await turnContext.UpdateActivityAsync(activity, cancellationToken);

Теперь, когда у вас есть обновленные карточки, вы можете удалять сообщения с помощью Bot Framework.

Удаление сообщений

В Bot Framework каждое сообщение имеет уникальный идентификатор действия. Сообщения можно удалить с помощью метода DeleteActivity Bot Framework.

Чтобы удалить сообщение, передайте идентификатор этого действия методу DeleteActivityAsync класса TurnContext.

foreach (var activityId in _list)
{
    // When overridden in a derived class, deletes an existing activity in the conversation.
    await turnContext.DeleteActivityAsync(activityId, cancellationToken);
}

Отправка предлагаемых действий

Предлагаемые действия позволяют боту предоставлять кнопки, которые пользователь может выбрать для ввода данных. Предлагаемые действия улучшают взаимодействие с пользователем, позволяя пользователю отвечать на вопрос или делать выбор с помощью кнопки, а не вводить ответ с помощью клавиатуры. Когда пользователь нажимает кнопку, она остается видимой и доступной в расширенных карточках, но не для предлагаемых действий. Это не позволяет пользователю выбирать устаревшие кнопки в беседе.

Чтобы добавить предлагаемые действия в сообщение, задайте suggestedActions свойство объекта действия, чтобы указать список карта объектов действий, представляющих кнопки, которые будут представлены пользователю. Дополнительные сведения см. в статье sugestedActions.

Ниже приведен пример реализации и опыта предлагаемых действий.

"suggestedActions": {
    "actions": [
      {
        "type": "imBack",
        "title": "Action 1",
        "value": "Action 1"
      },
      {
        "type": "imBack",
        "title": "Action 2",
        "value": "Action 2"
      }
    ],
    "to": [<list of recepientIds>]
  }

Ниже показан пример предлагаемых действий.

Действия, предлагаемые ботом

Примечание.

  • SuggestedActions поддерживаются только для чат-ботов с текстовыми сообщениями и адаптивными карточками.
  • SuggestedActions не поддерживаются для чат-ботов с вложениями для любого типа беседы.
  • imBack — это единственный поддерживаемый тип действия, и Teams отображает до шести предлагаемых действий.

Отправка сообщений в данных канала Teams

Объект channelData содержит сведения, относящиеся к Teams, и является окончательным источником идентификаторов команд и каналов. При необходимости эти идентификаторы можно кэшировать и использовать в качестве ключей для локального хранилища. В TeamsActivityHandler пакете SDK извлекает важную информацию из channelData объекта, чтобы сделать его доступным. Однако вы всегда можете получить доступ к исходным данным из turnContext объекта .

Объект channelData не включается в сообщения в личных беседах, так как они происходят за пределами канала.

Типичный channelData объект в действии, отправляемом боту, содержит следующие сведения:

  • eventType: тип события Teams передается только в случаях событий беседы в боте Teams.
  • tenant.id: Microsoft Entra идентификатор клиента передается во всех контекстах.
  • team: передается только в контекстах канала, а не в личном чате.
  • channel: передается только в контекстах каналов, когда упоминается бот, или для событий в каналах в командах, где бот добавляется.
  • channelData.teamsTeamId:Устаревшие. Это свойство включается только для обеспечения обратной совместимости.
  • channelData.teamsChannelId:Устаревшие. Это свойство включается только для обеспечения обратной совместимости.

В следующем коде показан пример объекта channelData (событие channelCreated):

"channelData": {
    "eventType": "channelCreated",
    "tenant": {
        "id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
    },
    "channel": {
        "id": "19:693ecdb923ac4458a5c23661b505fc84@thread.skype",
        "name": "My New Channel"
    },
    "team": {
        "id": "19:693ecdb923ac4458a5c23661b505fc84@thread.skype"
    }
}

Данные канала Teams

Объект channelData содержит сведения, относящиеся к Teams, и является окончательным источником идентификаторов команд и каналов. При необходимости эти идентификаторы можно кэшировать и использовать в качестве ключей для локального хранилища. В TeamsActivityHandler пакете SDK извлекает важную информацию из channelData объекта, чтобы сделать его доступным. Однако вы всегда можете получить доступ к исходным данным из turnContext объекта .

Объект channelData не включается в сообщения в личных беседах, так как они происходят за пределами канала.

Типичный channelData объект в действии, отправляемом боту, содержит следующие сведения:

  • eventType: тип события Teams передается только в случаях изменения канала.
  • tenant.id: Microsoft Entra идентификатор клиента передается во всех контекстах.
  • team: передается только в контекстах канала, а не в личном чате.
    • id: GUID для канала.
    • name: имя команды передается только в случаях (how-to/conversations/subscribe-to-conversation-events.md#team-renamed).
  • channel: передается только в контекстах каналов, когда упоминается бот, или для событий в каналах в командах, где бот добавляется.
  • channelData.teamsTeamId:Устаревшие. Это свойство включается только для обеспечения обратной совместимости.
  • channelData.teamsChannelId:Устаревшие. Это свойство включается только для обеспечения обратной совместимости.

Пример объекта channelData

В следующем коде показан пример объекта channelData (событие channelCreated):

"channelData": {
    "eventType": "channelCreated",
    "tenant": {
        "id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
    },
    "channel": {
        "id": "19:693ecdb923ac4458a5c23661b505fc84@thread.skype",
        "name": "My New Channel"
    },
    "team": {
        "id": "19:693ecdb923ac4458a5c23661b505fc84@thread.skype"
    }
}

Коды состояния из интерфейсов API бесед бота

Обеспечьте соответствующую обработку этих ошибок в приложении Teams. В следующей таблице перечислены коды ошибок и описания, при которых создаются ошибки.

Код состояния Код ошибки и значения сообщений Описание Повторный запрос Действие разработчика
400 Код: Bad Argument
Сообщение: *сценарий
Недопустимые полезные данные запроса, предоставляемые ботом. Дополнительные сведения см. в сообщении об ошибке. Нет Переоценка полезных данных запроса на наличие ошибок. Проверьте возвращенное сообщение об ошибке для получения дополнительных сведений.
401 Код: BotNotRegistered
Сообщение. Регистрация для этого бота не найдена.
Регистрация этого бота не найдена. Нет Проверьте идентификатор и пароль бота. Убедитесь, что идентификатор бота (Microsoft Entra ID) зарегистрирован на портале разработчика Teams или через регистрацию канала бота Azure в Azure с включенным каналом Teams.
403 Код: BotDisabledByAdmin
Сообщение. Администратор клиента отключил этот бот
Администратор заблокированных взаимодействий между пользователем и приложением бота. Администратор необходимо разрешить использование приложения для пользователя в политиках приложений. Дополнительные сведения см. в разделе Политики приложений. Нет Остановите публикацию в беседе до тех пор, пока пользователь явно не инициирует взаимодействие с ботом, указывая, что бот больше не заблокирован.
403 Код: BotNotInConversationRoster
Сообщение. Бот не входит в список бесед.
Бот не является частью беседы. Приложение необходимо переустановить в беседе. Нет Перед отправкой другого запроса на беседу подождите installationUpdate событие, указывающее на то, что бот будет добавлен снова.
403 Код: ConversationBlockedByUser
Сообщение. Пользователь заблокировал беседу с ботом.
Пользователь заблокировал бот в личном чате или канале с помощью параметров модерации. Нет Удалите беседу из кэша. Остановите попытки публикации в беседах, пока пользователь явно не инициирует взаимодействие с ботом, указывая, что бот больше не заблокирован.
403 Код: ForbiddenOperationException
Сообщение. Бот не установлен в личных область пользователя
Упреждающее сообщение отправляется ботом, который не устанавливается в личных область. Нет Перед отправкой другого запроса на беседу установите приложение в личных область.
403 Код: InvalidBotApiHost
Сообщение: Недопустимый узел API бота. Для клиентов GCC вызовите https://smba.infra.gcc.teams.microsoft.com.
Бот назвал общедоступную конечную точку API для беседы, которая принадлежит клиенту GCC. Нет Обновите URL-адрес службы для беседы https://smba.infra.gcc.teams.microsoft.com и повторите запрос.
403 Код: NotEnoughPermissions
Сообщение: *сценарий
У бота нет необходимых разрешений для выполнения запрошенного действия. Нет Определите требуемое действие из сообщения об ошибке.
404 Код: ActivityNotFoundInConversation
Сообщение: беседа не найдена.
Указанный идентификатор сообщения не найден в беседе. Сообщение не существует или удаляется. Нет Проверьте, является ли идентификатор отправленного сообщения ожидаемым значением. Удалите идентификатор, если он был кэширован.
404 Код: ConversationNotFound
Сообщение: беседа не найдена.
Беседа не найдена, так как она не существует или удалена. Нет Проверьте, является ли отправленный идентификатор беседы ожидаемым значением. Удалите идентификатор, если он был кэширован.
412 Код: PreconditionFailed
Сообщение. Сбой предварительного условия, повторите попытку.
Сбой предварительного условия для одной из зависимостей из-за нескольких одновременных операций в одном диалоге. Да Повторите попытку с экспоненциальной задержкой.
413 Код: MessageSizeTooBig
Сообщение: слишком большой размер сообщения.
Размер входящего запроса был слишком велик. Дополнительные сведения см. в разделе Форматирование сообщений бота. Нет Уменьшите размер полезных данных.
429 Код: Throttled
Сообщение: Слишком много запросов. Также возвращает время повторной попытки после.
Слишком много запросов, отправленных ботом. Дополнительные сведения см. в разделе Ограничение скорости. Да Повторите попытку с помощью Retry-After заголовка для определения времени отката.
500 Код: ServiceError
Сообщение: *различные
Внутренняя ошибка сервера. Нет Сообщите о проблеме в сообществе разработчиков.
502 Код: ServiceError
Сообщение: *различные
Проблема с зависимостью службы. Да Повторите попытку с экспоненциальной задержкой. Если проблема не исчезнет, сообщите о ней в сообществе разработчиков.
503 Служба недоступна. Да Повторите попытку с экспоненциальной задержкой. Если проблема не исчезнет, сообщите о ней в сообществе разработчиков.
504 Время ожидания шлюза. Да Повторите попытку с экспоненциальной задержкой. Если проблема не исчезнет, сообщите о ней в сообществе разработчиков.

Руководство по повторным попыткам кодов состояния

Общие рекомендации по повторным попыткам для каждого кода состояния перечислены в следующей таблице. Бот должен избегать повторных попыток кодов состояния, которые не указаны:

Код состояния Стратегия повторных попыток
403 Повторите попытку, вызвав API https://smba.infra.gcc.teams.microsoft.com GCC для InvalidBotApiHost.
412 Повторите попытку с экспоненциальной задержкой.
429 Повторите попытку с помощью Retry-After заголовка, чтобы определить время ожидания в секундах и между запросами, если доступно. В противном случае повторите попытку с экспоненциальной задержкой с идентификатором потока, если это возможно.
502 Повторите попытку с экспоненциальной задержкой.
503 Повторите попытку с экспоненциальной задержкой.
504 Повторите попытку с экспоненциальной задержкой.

Заголовки запросов бота

Текущие исходящие запросы к боту не содержат в заголовке или URL-адресе сведения, которые помогают ботам направлять трафик без распаковки всех полезных данных. Действия отправляются боту через URL-адрес, аналогичный https://< your_domain>/api/messages. Поступают запросы на отображение идентификатора беседы и идентификатора клиента в заголовках.

Поля заголовка запроса

Во все запросы, отправляемые ботам, добавляются два нестандартных поля заголовка запроса как для асинхронного потока, так и для синхронного потока. В следующей таблице приведены поля заголовка запроса и их значения:

Ключ поля Значение
x-ms-conversation-id Идентификатор беседы, соответствующий действию запроса, если применимо, подтверждено или проверено.
x-ms-tenant-id Идентификатор клиента, соответствующий беседе в действии запроса.

Если идентификатор клиента или беседы отсутствует в действии или не был проверен на стороне службы, значение будет пустым.

На рисунке показаны поля заголовков.

Получать только указанные сообщения

Чтобы позволить ботам получать только те сообщения канала или чата, где находится @mentionedбот , необходимо отфильтровать сообщения. Используйте следующий фрагмент кода, чтобы позволить боту получать только те сообщения, где это @mentioned:

    // When ChannelMessage.Read.Group or ChatMessage.Read.Chat RSC is in the app manifest, this method is called even when bot is not @mentioned.
    // This code snippet allows the bot to ignore all messages that do not @mention the bot.
    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
            // Ignore the message if bot was not mentioned. 
            // Remove this if block to process all messages received by the bot.
            if (!turnContext.Activity.GetMentions().Any(mention => mention.Mentioned.Id.Equals(turnContext.Activity.Recipient.Id, StringComparison.OrdinalIgnoreCase)))
            {
                return;
            }
            // Sends an activity to the sender of the incoming activity.
            await turnContext.SendActivityAsync(MessageFactory.Text("Using RSC the bot can receive messages across channels or chats in team without being @mentioned."));
    }

Если вы хотите, чтобы бот получал все сообщения, фильтровать @mention сообщения не нужно.

Пошаговые инструкции

Следуйте инструкциям из пошагового руководства по созданию бота для бесед Teams.

Следующее действие

Беседы с ботом в канале и групповом чате

См. также

События бесед в вашем боте Teams