Обновление: 30 июня 2020 г.
После дополнительного тестирования у меня есть сведения, которые могут помочь кому-то распознать мою проблему.
Проблема, похоже, в том, что Slack отправка данных в Azure Bot Services, но эти данные не пересылаются в мой код. Я смог использовать эмулятор бота без каких-либо проблем, и веб-чат Azure работает нормально.
Я знаю, что конфигурация Slack для URL-адреса перенаправления OAuth верна (я смог добавить своего бота в Slack ) и URL-адрес запроса для событий верен (они отправили «вызов», и он подтвержден). Я подписался на точные области действия и события, которые указаны в документации Microsoft, и я убедился, что параметры интерактивности и событий включены.
Когда пользователь вводит текст в канал Slack моего бота, мое приложение получает "сообщение", и мой код может отправлять ответ, поэтому похоже, что Microsoft может обмениваться данными между собой для обычных сообщений. Я не получаю никаких данных, когда пользователи впервые присоединяются к моему боту (например, ConversationUpdate) или если они нажимают кнопку в диалоговом окне. Я вижу, как Slack отправляет данные при нажатии кнопки, они просто никогда не приходят.
В качестве теста я скопировал конечную точку обмена сообщениями из настроек своего бота Azure и вставил ее в интерактивный URL-адрес Slack и когда я нажимаю кнопку в Slack, я вижу данные, которые отправляет Slack (к сожалению, в формате, который мой код не может обработать).
Исходное сообщение
У меня есть приложение Bot Framework (v4), которое я написал на nodejs. Он работает хорошо, и у меня есть ActivityHandler, который реагирует на людей, которых добавляют в беседу, и когда они отправляют сообщения. Я смог получить проактивный обмен сообщениями, и все было замечательно, пока я не попытался заставить работать интерактивность.
Я начал использовать пример кода кнопки из документации Microsoft:
let reply = MessageFactory.suggestedActions(['Red', 'Yellow', 'Blue'], 'What is the best color?');
await turnContext.sendActivity(reply);
Это отлично работает в эмуляторе, но в Slack отображается в виде маркированного списка. Похоже, именно так "предлагаемые действия" обрабатываются в Slack .
Я изменил свой код, чтобы использовать «карту героя»:
let card = CardFactory.heroCard(
'What is the best color?',
undefined,
CardFactory.actions([
{
type: 'imBack',
title: 'Color Red',
value: 'Red Value'
}
])
);
let reply = MessageFactory.attachment(card);
await turnContext.sendActivity(reply);
Это в эмуляторе работает нормально, за исключением того, что мое приложение считает, что пользователь ввел «Красное значение», а кнопка остается на экране и по-прежнему активна. Возможно, я смогу обойти это, но кнопка вообще не работает в Slack. Он отображается нормально, но я не получаю уведомления в своем приложении.
При нажатии кнопки отображается HTTP-запрос на:
https://{MY_SLACK}.slack.com/api/chat.attachmentAction?_x_id=f8d003c3-1592436018.632&_x_csid=NcWi3y50lFU&slack_route={OTHER_SLACK_STUFF}
И я вижу, что запрос отправляет все типы данных, в том числе:
payload: {"actions":[{"id":"1","name":"imBack","text":"Color Red","type":"button","value":"Red Value","style":"default"}],"attachment_id":"2","callback_id":"{MAGIC_NUMBER}:{TEAM_ID}","channel_id":"{CHANNEL_ID}","message_ts":"1592435983.056000","prompt_app_install":false,"team_id":"{TEAM_ID}"}
Я не знаю, как увидеть что-нибудь полезное на Azure портале - параметр аналитики для моего бота, похоже, не работает, а параметр действий только говорит " Написать бот-сервис ». Я не вижу никаких признаков того, что сообщение переходит из Slack в Azure.
Я разрабатываю локально и настроил ngrok, чтобы моя конечная точка обмена сообщениями в Azure могла быть установлена на https://69fe1382ce17.ngrok.io/api/messages На стороне Slack я настроил URL-адрес запроса интерактивности на https://slack.botframework.com/api/Actions URL-адрес запроса на подписку на событие https://slack.botframework.com/api/Events/ {MY_BOT_NAME}
Мне нужен набор кнопок с разными параметрами, и когда пользователь нажимает одну из них, мой бот получает какое-то «значение» вместо текста сообщения. Я также хотел бы, чтобы кнопка была go подальше, чтобы пользователь не мог отправлять повторяющиеся команды. Было бы хорошо, если бы карта героя свернулась, и на экране отобразилась только подсказка.
Существуют ли какие-либо интерактивные опции, которые работают для Slack и других каналов?
Спасибо!