Как получить идентификатор канала Slack DM для приложения Slack

#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 , которые могут или не могут быть для вас препятствием:

  1. Для этого требуются более сильные области разрешений OAuth, чем те, которые требуются для инициализации частной DM с пользователем, чем chat.postMessage (токен бота с chat:write недостаточен), и
  2. Это может каким-то образом закончить открытие уже открытого диалога…
    • Я протестировал этот метод с помощью токена пользователя.
    • У пользователя для этого токена уже был канал DM с приложением! (Разве это не означает, что диалог уже открыт?)
    • Как ни странно, первый ответ был is_opened: false (и последующие ответы были is_opened: true ).

3. app_home_opened

Событие app_home_opened срабатывает, когда пользователь открывает домашнюю страницу вашего приложения. Если вы обработаете это событие, вы можете сохранить channel его в полезной нагрузке события на своем сервере и использовать его позже, избавив от необходимости последующего вызова conversations.open .

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

4. Лучший способ …?

Из-за описанных выше недостатков, если кто-нибудь знает лучший способ получить идентификатор канала App Home для пользователя Slack, пожалуйста, прокомментируйте этот ответ!

Ответ №3:

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

  1. перейдите к сообщению в канале
  2. перейдите к другим действиям.
  3. выберите копировать ссылку

Идентификатором канала будет строка, следующая archives/ , например: {myorg}.slack.com/archives/{channel_ID}

Использование этого подхода будет работать для любого канала в приложении slack, хотя вряд ли это лучший подход, поскольку он является ручным, а не чем-то более программным.