web-dev-qa-db-ja.com

Slackボットはどのようにしてダイレクトメッセージとチャンネル内のメッセージを検出できますか?

TL; DR:Slack APIを介して、チャネル内のメッセージとダイレクトメッセージをどのように区別できますか?

RTM API、それをEdiと呼びましょう。そして、すべてのコマンドが「@edi」で始まる限り、それは素晴らしい動作をします。例えば、「@ edi help」。メンバーである任意のチャネルへの応答およびダイレクトメッセージ。ただし、ダイレクトメッセージの場合、「@ edi」でコマンドを開始する必要がないようにボットを更新したい。チャンネルでは「edi help」、ダイレクトメッセージでは「help」です。この2つを区別するための具体的な情報は見当たりませんが、channel.infoエンドポイントを使用して「members」の人数をカウントしてみました。ただし、このメソッドはパブリックチャネルでのみ機能しますプライベートチャネルおよびダイレクトメッセージの場合、エンドポイントは「channel_not_found」エラーを返します。

前もって感謝します。

22
Roger

SlackのJamesと話をしたところ、メッセージがDMであるかどうか、チャンネルIDが次で始まるかどうかを判断する簡単な方法を教えてくれました。

  • C、公開チャンネルです
  • D、DMユーザー
  • G、プライベートチャンネルまたはマルチパーソンDM

ただし、これらの値は固定値ではなく、ある時点で変更されるか、追加される可能性があります。

したがって、その構文がなくなると、channels.infoとgroups.infoの両方を使用するためにDMを検出する別の方法です。両方とも「ok」フィールドに対して「false」を返す場合、それはDMです。

注意:

  • channels.infoは公開チャンネル専用です
  • groups.infoはプライベートチャンネルとマルチパーソンDM専用です

ボーナス情報:メッセージがDMであることを検出したら、ユーザーIDまたはチャネルIDを使用してim.listの結果で検索します。見つかった場合、ボットにとってはDMであることがわかります。

  • im.listの「id」はチャンネルIDです
  • im.listの「user」は、ボットとDMしている人のユーザーIDです
  • トークンから抽出されるため、ボットのユーザーIDを渡さないでください。
35
Roger

2017年7月のFYIで、「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"
}
2
seenickcode

Slackは Conversations API を少し前に追加しました。プレフィックスに依存するのではなく、PM /チャネルを区別するために使用する必要があります。

Conversations APIドキュメントから:

各チャネルには、C、G、またはDのいずれかの1文字の接頭辞で始まるチーム固有のIDがあります。チャネルがチーム間で共有される場合(共有チャネルの開発を参照)、チャネルIDの接頭辞は変更される、例えばID G0987654321のプライベートチャネルはID C0987654321になる場合があります。

これが、以前のAPIメソッドの代わりに対話メソッドを使用する必要がある理由の1つです!プライベート共有チャネルの一意のIDは、その存続期間中ずっと一定であることに依存することはできません。

conversations.info メソッドを使用して会話情報を取得し、is_im 国旗。 is_im == trueは、会話が2人の著名な個人またはユーザーとボット間の直接のメッセージであることを意味します。

2
dvor

Info関数は、Slack APIメソッド groups.info を使用するプライベートチャネルでも使用できます。これは、プライベートチャネルの特殊な形式であるため、複数の参加者がいるダイレクトメッセージチャネルでも機能します。

groups.list を使用して、すべてのプライベートチャネルのIDを取得できます。複数の参加者がいるダイレクトメッセージチャネル。

groups.list は、アクセストークンが属するユーザーまたはボットが招待されているプラ​​イベートチャネルのみを返すことに注意してください。

0
Erik Kalkoken