2016-12-12 15 views
15

TL; DR: W interfejsie API Slack, jak odróżnić wiadomość w kanale od wiadomości bezpośredniej?W jaki sposób bot Slack może wykryć bezpośrednią wiadomość lub wiadomość na kanale?

Mam działającego bota Slacka za pomocą API RTM, nazwijmy to Edi. Działa dobrze, o ile wszystkie polecenia zaczynają się od "@edi"; na przykład "@edi help". Obecnie odpowiada na każdy kanał, którego jest członkiem i bezpośrednie wiadomości. Chciałbym jednak zaktualizować bota tak, aby kiedy był to bezpośredni komunikat, nie będzie potrzeby uruchamiania polecenia z "@edi"; na przykład "@edi help" na kanale, ale "help" w bezpośredniej wiadomości. Nie widzę nic szczególnego dla rozróżnienia między tymi dwoma, ale spróbowałem użyć punktu końcowego channel.info i zliczenia liczby osób w "członkach"; jednak ta metoda działa tylko na kanale publicznym. W przypadku kanałów prywatnych i wiadomości bezpośrednich punkt końcowy zwraca błąd "channel_not_found".

Z góry dziękuję.

Odpowiedz

24

Rozmawiałem z Jamesem w Slack i dał mi prosty sposób, aby ustalić, czy wiadomość jest DM, czy nie; jeśli identyfikator kanału zaczyna się od:

  • C, jest to kanał publiczny
  • D, to DM z użytkownikiem
  • G, to albo prywatny kanał lub wielo-osobowe DM

Jednak wartości te nie są ustawione w kamień i mogą w pewnym momencie ulec zmianie lub zostać dodane do.

Więc jeśli ta składnia zniknie, to inny sposób na wykrycie DM, aby użyć zarówno kanałów.info, jak i groups.info. Jeśli oba zwracają "false" dla pola "ok", to wiesz, że to DM.

Uwaga:

  • channels.info jest na kanałach publicznych tylko
  • groups.info jest na kanałach prywatnych i wieloosobowych DMS INFO tylko

Bonus: Po wykryć że wiadomość to DM, użyj ID użytkownika lub ID kanału i wyszukaj go w wynikach im.list; jeśli go znajdziesz, wtedy będziesz wiedział, że to bzdury dla bota.

  • „id” z im.list jest ID kanału
  • „użytkownik” w im.Lista jest identyfikator użytkownika z osobą DM'ing z bota
  • Nie Pass w bota ID użytkownika, ponieważ jest uzyskiwany z tokena
+0

Praca nad tym samym problemem i znalazła prywatny kanał, który zaczyna się od litery "W". –

0

Funkcja informacji jest również dostępna dla kanałów prywatnych z metodą Slack API groups.info. Działa to również w przypadku bezpośrednich kanałów wiadomości z wieloma uczestnikami, ponieważ są one specjalną formą kanałów prywatnych.

Możesz użyć numeru groups.list, aby uzyskać identyfikatory wszystkich prywatnych kanałów. bezpośrednie kanały wiadomości z wieloma uczestnikami.

Pamiętaj, że groups.list zwraca tylko prywatne kanały, do których został zaproszony użytkownik lub bot, do którego należy token dostępu.

+0

Próbowałem grupy. informacje o DM i zwróciło błąd "channel_not_found". Ale Twoje informacje pomogły mi znaleźć rozwiązanie. Jeśli obie groups.info i channels.info wrócą z błędem, to jest to DM. Zrobiłem wstępny test i wydaje się, że działa. Dziękuję Ci. – Roger

2

FYI od lipca 2017 roku, za „wiadomości. Im "zdarzenia" (za pośrednictwem subskrypcji zdarzeń aplikacji), ładunek zdarzeń wydaje się teraz zwracać dodatkowe pola, aby wykryć, czy wiadomość pochodzi z własnego bota (wkleiłem tutaj z moich dzienników):

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" 
} 
Powiązane problemy