Почему коннектор Slack службы ботов Azure не пересылает события и интерактивные сообщения? - PullRequest
2 голосов
/ 18 июня 2020

Обновление: 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 и других каналов?

Спасибо!

  • Ли

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Ваш вопрос многогранен, поэтому я постараюсь разбить его на более мелкие части.

Как обстоят дела с предлагаемыми действиями в Slack?

Предлагаемые действия не поддерживаются в Slack, но SDK Bot Builder считает, что это так. Это давняя ошибка. Я только что снова сообщил об этом на странице документации, которую вы связали: https://github.com/MicrosoftDocs/bot-docs/issues/1742

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

Почему карты героев не работают в Slack?

Сначала я должен упомянуть, что карты героев работают только с разъемом Slack, а не с адаптером Slack . Похоже, вы используете коннектор, так что все должно быть в порядке.

Я подозреваю, что ваша проблема связана с тем, как вы настроили настройки своего бота на стороне Slack. В Bot Framework есть шаг c, который кажется важным, если вы хотите, чтобы кнопки работали. Если вы точно следовали do c и все еще не можете заставить кнопки работать, возможно, стоит покопаться в документации по Slack API .

Как мне только разрешить однократное нажатие кнопки?

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

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

Есть другой подход, который работает на большем количестве каналов, чем просто Slack. Это действительно сложно, но если вы хотите решить эту проблему, то вот основные c шаги:

  1. Вам нужно указать идентификатор в данных действия, чтобы помочь вашему боту идентифицировать действие.
  2. Вам необходимо сохранить идентификатор действия, который возвращается, когда вы отправляете действие в Slack.
  3. Вам необходимо связать возвращенный идентификатор действия с идентификатором, который вы вводите в данные действия.
  4. Вам необходимо получить идентификатор действия, используя идентификатор данных действия, когда пользователь нажимает кнопку.
  5. Этот идентификатор необходимо использовать для обновления или удаления действия.

К сожалению нет централизованного руководства, которое могло бы помочь вам в этом, но есть много примеров, объясняющих это, разбросанных по Stack Overflow. Вот хороший: { ссылка }

1 голос
/ 18 июня 2020

Я знаю, что ссылки на другой сайт без дополнительных деталей не одобряются, но у меня недостаточно опыта, чтобы ответить на ваш вопрос. Я подозреваю, что ссылка здесь может направить вас в правильном направлении: Подсказки выбора не переводятся в формат Slack # 3974

Удачи!

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