web-dev-qa-db-fra.com

Comment un bot Slack peut-il détecter un message direct ou un message dans un canal?

TL; DR: Comment différencier les messages d'un canal par rapport aux messages directs via les API Slack?

J'ai un bot Slack qui utilise l'API RTM, appelons-le Edi. Et cela fonctionne très bien tant que toutes les commandes commencent par "@edi"; par exemple. "Aide @edi". Il répond actuellement à tout canal dont il est membre et envoie des messages directs. Cependant, j'aimerais mettre à jour le bot pour que, lorsqu'il s'agit d'un message direct, il ne soit pas nécessaire de lancer une commande avec "@edi"; par exemple. "@edi help" dans un canal, mais "help" dans un message direct. Je ne vois rien de spécifique pour différencier les deux, mais j'ai quand même essayé d'utiliser le point de terminaison channel.info et de compter le nombre de personnes dans les "membres"; Cependant, cette méthode ne fonctionne que sur le canal public. Pour les canaux privés et les messages directs, le noeud final renvoie une erreur "channel_not_found".

Merci d'avance.

21
Roger

J'ai parlé à James à Slack et il m'a donné un moyen simple de déterminer si un message est un DM ou non; si un identifiant de chaîne commence par:

  • C, c'est une chaîne publique
  • D, c'est un DM avec l'utilisateur
  • G, c'est soit un canal privé, soit un DM multi-personne

Cependant, ces valeurs ne sont pas figées dans le marbre et pourraient changer ou être complétées à un moment donné.

Donc, si cette syntaxe disparaît, un autre moyen de détecter un DM pour utiliser à la fois channel.info et groups.info. S'ils retournent tous deux «faux» pour le champ «ok», alors vous savez que c'est un DM.

Remarque:

  • channels.info est destiné aux chaînes publiques uniquement
  • groups.info est réservé aux chaînes privées et aux DM multi-personnes

Informations sur le bonus: Une fois que vous avez détecté qu’un message est un message DM, utilisez l’ID utilisateur ou l’ID du canal et recherchez-le dans les résultats de im.list; si vous le trouvez, vous saurez que c’est un DM au bot.

  • “Id” de im.list est l'identifiant de la chaîne
  • "Utilisateur" de im.list est l’identifiant de la personne DM avec le bot
  • Vous ne transmettez pas l’ID utilisateur du bot, car il est extrait du jeton.
34
Roger

Pour rappel, à partir de juillet 2017, pour les événements "message.im" (via les abonnements aux événements de votre application), la charge d'événements semble maintenant renvoyer des champs supplémentaires pour détecter si le message provient de votre propre bot (collé ici dans mes journaux):

    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"
}
2
seenickcode

Slack a ajouté Conversations API il y a quelque temps. Vous devriez l'utiliser pour différencier PM/canal au lieu de compter sur le préfixe.

De la documentation de l'API Conversations:

Chaque canal a un identifiant unique à l’équipe qui commence par un préfixe simple lettre, C, G ou D. Lorsqu'un canal est partagé par plusieurs équipes (voir Développement de canaux partagés), le préfixe de cet être changé, par exemple un canal privé avec l'ID G0987654321 peut devenir l'ID C0987654321.

C'est l'une des raisons pour lesquelles vous devriez utiliser les méthodes de conversation au lieu des méthodes de l'API précédentes! Vous ne pouvez pas compter sur l'ID unique d'un canal partagé privé qui reste constant pendant toute sa durée de vie.

Obtenez des informations sur la conversation en utilisant conversations.info méthode et vérifiez le drapeau is_im. is_im == true signifie que la conversation est un message direct entre deux individus distingués ou un utilisateur et un bot.

0
dvor

La fonction info est également disponible pour les canaux privés avec la méthode de l'API Slack groups.info . Cela fonctionne également pour les canaux de messages directs avec plusieurs participants, car ils constituent une forme spéciale de canaux privés.

Vous pouvez utiliser groups.list pour obtenir les identifiants de tous les canaux privés. canaux de messages directs avec plusieurs participants.

Notez que groups.list ne renverra que les canaux privés, auxquels l'utilisateur ou le bot auquel appartient le jeton d'accès a été invité.

0
Erik Kalkoken