Как может Slack-бот обнаруживать прямое сообщение или сообщение в канале?
TL; DR: через API-интерфейс Slack, как я могу различать сообщение в канале против прямого сообщения?
У меня работает Slack-бот с использованием RTM API, позвольте назвать его Edi. И он отлично работает, пока все команды начинаются с "@edi"; например "Помощь @edi". В настоящее время он отвечает на любой канал, являющийся членом и прямым сообщением. Тем не менее, я хочу обновить бота, чтобы при прямом сообщении не было необходимости запускать команду с помощью "@edi"; например "@edi help" в канале, но "помощь" в прямом сообщении. Я не вижу ничего конкретного, чтобы различать их, но я попытался использовать конечную точку channel.info и подсчитал количество людей в "членах"; однако этот метод работает только на общедоступном канале. Для частных каналов и прямых сообщений конечная точка возвращает ошибку "channel_not_found".
Спасибо заранее.
Ответы
Ответ 1
Я разговаривал с Джеймсом в Slack, и он дал мне простой способ определить, является ли сообщение DM или нет; если идентификатор канала начинается с:
- C, это общедоступный канал
- D, это DM с пользователем
- G, это либо частный канал, либо многоязычный DM
Однако эти значения не заданы в камне и могут измениться в какой-то момент или будут добавлены.
Итак, если этот синтаксис уходит, другой способ обнаружить DM для использования как channels.info, так и groups.info. Если оба они возвращают "false" для поля "ok", то вы знаете его DM.
Примечание:
- channels.info предназначен только для общедоступных каналов
- groups.info для частных каналов и только для нескольких лиц.
Информация о бонусе:
Как только вы обнаружите, что сообщение является DM, используйте либо идентификатор пользователя, либо идентификатор канала и найдите его в результатах im.list; если вы его найдете, то вы будете знать его DM для бота.
- "id" из im.list - это идентификатор канала
- "пользователь" из im.list - это идентификатор пользователя от лица DMing с ботом
- Вы не передаете идентификатор пользователя ботов, потому что его извлекли из токена
Ответ 2
FYI по состоянию на июль 2017 года, для событий "message.im" (через приложение "Подписки к событиям приложения" ), полезная нагрузка события, похоже, теперь возвращает дополнительные поля, чтобы определить, поступает ли сообщение от вашего собственного бота (вставленного здесь из моего журналы):
INFO[0012] got Slack message: (bot.SlackMessage) {
SlackEvent: (bot.SlackEvent) {
Type: (string) (len=7) "message",
EventTs: (string) (len=17) "1501076832.063834",
User: (string) ""
},
SubType: (string) (len=11) "bot_message",
Channel: (string) (len=9) "D6CJWD132",
Text: (string) (len=20) "this is my bot reply",
Username: (string) (len=15) "Myapp Local",
BotID: (string) (len=9) "B6DAZKTGG",
Ts: (string) (len=17) "1501076832.063834"
}
Ответ 3
Функция info также доступна для частных каналов с помощью метода Slack API groups.info. Это работает также для прямых каналов сообщений с несколькими участниками, поскольку они представляют собой особую форму частных каналов.
Вы можете использовать groups.list, чтобы получить идентификаторы всех частных каналов, включая. прямые каналы сообщений с несколькими участниками.
Обратите внимание, что groups.list будет возвращать только частные каналы, к которым был приглашен пользователь или бот, к которому принадлежит токен доступа.
Ответ 4
Slack добавил API для разговоров некоторое время назад. Вы должны использовать его, чтобы различать PM/канал, а не полагаться на префикс.
Из документации API беседы:
Каждый канал имеет уникальный для команды идентификатор, который начинается с одного буквенного префикса, C, G или D. Когда канал совместно используется командами (см. Раздел "Разработка для совместно используемых каналов"), префикс идентификатора канала может быть измененным, например, частный канал с идентификатором G0987654321 может стать идентификатором C0987654321.
Это одна из причин, по которой вы должны использовать методы разговоров вместо предыдущих методов API! Вы не можете полагаться на уникальный идентификатор частного общего канала, который остается постоянным в течение всего срока его службы.
Получить разговор информацию, используя conversations.info метод и проверить is_im
флаг. is_im == true
означает, что разговор является прямым сообщением между двумя выдающимися личностями или пользователем и ботом.