☎️
【Slack ボット】自分へのメンションを検知する
はじめに
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