☎️

【Slack ボット】自分へのメンションを検知する

2022/07/31に公開

はじめに

Slack ボットを開発していると、自分や特定の人へのメンションをトリガーに何かしたくなるときがあります。

app.message(/.@居残三郎.*/, async ({ say }) => {
  await say(`He is busy.`);
});

ただメンションは特殊な形式で扱われているため、上記コードではメンションをトリガーにできません。

解決方法

以下は message をログ出力した結果です。

app.message(/.*/, async ({ message }) => {
  await console.log(message);
});
{
  client_msg_id: '714f1eef-6af9-4364-ab3e-9321643e2659',
  type: 'message',
  text: '<@U02S6C74BQU> こちら進捗いかがでしょうか?',
  user: 'UC734HMC4',
  ts: '1659193619.446509',
  team: 'TC7E8TQKX',
  blocks: [ { type: 'rich_text', block_id: '29Bc5', elements: [Array] } ],
  channel: 'C02JD5ATBH7',
  event_ts: '1659193619.446509',
  channel_type: 'channel'
}

メンションは <@user id> の形式で扱われているので、トリガーにしたいユーザー ID を指定してあげれば解決です。

app.message(/.*<@UC734HMC4>.*/, async ({ say }) => {
  await say(`He is busy.`);
});

おまけ

ユーザー ID の確認方法

ユーザー名をタップして「Copy link」。

コピーした URL の team/ 以降がユーザー ID(yyyy)となります。
https://xxxx.slack.com/team/yyyy

ボットからメンションを飛ばす

app.message('help', async ({ client, message }) => {
  await client.chat.postMessage({
    channel: 'CC6JF4EDN',
    // eslint-disable-next-line
    // @ts-ignore message.user does not exist on type
    text: `<@${message.user}> is asking for help in <#${message.channel}>.`
  });
});

おわりに

こちらを応用すると以下のようなボットも作れます!

【freee 人事労務 + Slack】メンションはボットに対応させて休日を満喫する

Slack ではチャネルメンションや #<channel 名> など、他にも特殊な形式で扱われるものがあります。
そういったものをトリガーにしたい場合は、メッセージの中身をログ出力して確かめてみましょう。

参考資料

以下は各言語での Slack ボットのサンプルコードです。

Discussion