#slack-api
#slack-api
Вопрос:
Я создал простое приложение Slack App, единственной целью которого является отправка сообщения на канал. Я понимаю, что существует conversations.list
API для перечисления всех общедоступных каналов для получения правильного идентификатора.
Однако в качестве первого шага я просто хочу отправить сообщение на сам канал приложения. Если я использую D… ID работает так, как ожидалось. Приглашение по каналу не требуется. Но как мне получить этот идентификатор? conversations.list
возвращает только общедоступные каналы, но не сам канал приложения.
Ответ №1:
В Slack нет такого понятия, как канал приложения. Между каждым пользователем и вашим приложением / ботом есть канал DM. В этих условиях, чтобы отправить сообщение DM из вашего приложения / бота пользователю, вам нужно знать ID
этого пользователя и указать его в качестве channel
аргумента postMessage
запроса API.
Комментарии:
1. Итак, у каждого пользователя есть канал DM с приложением, верно?
2. Да, и идентификатор пользователя может использоваться в качестве идентификатора такого канала.
3. Теперь я понял. Это проясняет ситуацию. Спасибо.
4. @RuslanIsay при дальнейшей проверке это действительно верно только для
chat.postMessage
(см. «Начать разговор в главном окне приложения пользователя» ). Другие методы API, которые ожидают идентификатор канала, не будут принимать идентификатор пользователя.
Ответ №2:
Возможность передавать идентификатор пользователя Slack as channel
несколько уникальна для chat.postMessage
. Если вы попробуете это с другими методами API, которые ожидают только идентификатор канала ( conversations.info
) , вы получите "error": "channel_not_found"
. В документах указано:
Начните диалог в главном окне приложения пользователя
Начните диалог с пользователями в главном окне вашего приложения.
При
chat:write
включенной области видимости вызовитеchat.postMessage
и передайте идентификатор пользователя (U0G9QF9C6
) в качестве значенияchannel
для отправки на домашний канал приложения этого пользователя. Вместо этого вы можете использовать их идентификатор канала прямого сообщения (например, найденный вim.open
, например).
Источник: https://api.slack.com/methods/chat.postMessage#app_home
Примечание: описанное выше поведение предполагает, что вы используете токен бота. Если вместо этого вы предоставите токен пользователя, вы сами сделаете пользователя DM.
Теперь, если вам * действительно * нужно получить идентификатор домашнего канала приложения пользователя для использования за пределами chat.postMessage
, продолжайте читать… Вот три способа сделать это, каждый со своими недостатками:
1. chat.postMessage
Ну, стоит упомянуть, что если вы собираетесь использовать chat.postMessage
, он возвращает разрешенный идентификатор канала в своем ответе : "channel": "D01234ABCDE"
. Вы можете сохранить это для последующего использования.
2. conversations.open
Метод API im.open
, упомянутый в приведенных выше документах, был переименован в conversations.open
, который можно использовать для получения идентификатора домашнего канала приложения пользователя:
- Используйте токен пользователя и установите
users
идентификатор бота приложения или - Используйте токен бота и установите
users
идентификатор пользователя.
Тем не менее, я заметил некоторые странности conversations.open
, которые могут или не могут быть для вас препятствием:
- Для этого требуются более сильные области разрешений OAuth, чем те, которые требуются для инициализации частной DM с пользователем, чем
chat.postMessage
(токен бота сchat:write
недостаточен), и - Это может каким-то образом закончить открытие уже открытого диалога…
- Я протестировал этот метод с помощью токена пользователя.
- У пользователя для этого токена уже был канал DM с приложением! (Разве это не означает, что диалог уже открыт?)
- Как ни странно, первый ответ был
is_opened: false
(и последующие ответы былиis_opened: true
).
3. app_home_opened
Событие app_home_opened
срабатывает, когда пользователь открывает домашнюю страницу вашего приложения. Если вы обработаете это событие, вы можете сохранить channel
его в полезной нагрузке события на своем сервере и использовать его позже, избавив от необходимости последующего вызова conversations.open
.
Поскольку событие происходит только тогда, когда пользователь открывает домашнюю страницу приложения вашего приложения, этот подход является скорее оптимизацией, чем автономным решением.
4. Лучший способ …?
Из-за описанных выше недостатков, если кто-нибудь знает лучший способ получить идентификатор канала App Home для пользователя Slack, пожалуйста, прокомментируйте этот ответ!
Ответ №3:
Вы можете получить идентификатор канала канала приложения через графический интерфейс, если вы:
- перейдите к сообщению в канале
- перейдите к другим действиям.
- выберите копировать ссылку
Идентификатором канала будет строка, следующая archives/
, например: {myorg}.slack.com/archives/{channel_ID}
Использование этого подхода будет работать для любого канала в приложении slack, хотя вряд ли это лучший подход, поскольку он является ручным, а не чем-то более программным.