Slack BotãBoltã§éçºãã
Slackäžã§åãBotãéçºããã®ã«Boltã䜿ã£ãã
Githubã®ã¬ããžããªã«ãµã³ãã«ã³ãŒããããã
ã©ã®ããã«Botã¯åããŠããã
Slackã«BotãåŸ æ©ãããŠããããã£ã³ãã«ïŒãã£ã³ãã«AãšããïŒã§ç¹å®ã®ã¡ãã»ãŒãžãæã€ãšãã£ã³ãã«ãçæããããåå ããããããããã¡ãã»ãŒãžã®äžéšãæ¹ç·šããŠæçš¿ããããããã®ãäœãããã£ãã
ã€ãã³ãçºçæã«ãSlackãµãŒããŒãããã€ããŒããåãåãã«ã¯ãã€ãã³ãã®ãµãã¹ã¯ãªãã·ã§ã³ ã®èšå®ãå¿ èŠãããã
Slack ã¯ãŒã¯ã¹ããŒã¹ã§çºçããã€ãã³ã (ã¡ãã»ãŒãžãæçš¿ããããšãããã¡ãã»ãŒãžã«å¯Ÿãããªã¢ã¯ã·ã§ã³ãæçš¿ããããšããªã©) ããªãã¹ã³ããã«ã¯ãEvents API ã䜿çšããŠã€ãã³ãã¿ã€ãã«ç»é²ããŸãã
Slackã®ç®¡çç»é¢ããEvent Subscriptions ãžè¡ããEnable Events ã®èšå®ããªã³ã«ãããããã«Request URLãç»é²ããã
Slackã¯ã€ãã³ãã«å¯Ÿå¿ããHTTP POSTãªã¯ãšã¹ãããã®Request URLãšã³ããã€ã³ãã«éä¿¡ããã
ããŒã«ã«éçºããªãããããã©ããã£ãŠçšæããããšãããšngrokãšããããŒã«ã䟿å©ã§ããã䜿ãã
ç°¡åã«ãããšãããŒã«ã«PCäžã§çšŒåããŠãããããã¯ãŒã¯ïŒTCPïŒãµãŒãã¹ãå€éšå ¬éã§ãããµãŒãã¹ã§ããäŸãã°ãããŒã«ã«PCã®WebãµãŒããå€éšå ¬éããããšãã§ããŸãã
ngrokã§çºè¡ããURLã¯ã管çç»é¢ããRequest URLãšããŠç»é²ããããããšããŒã«ã«ç°å¢ã§port 3000ã§åäœããŠããããã»ã¹ãå€éšå ¬éã§ããã®ã§ãSlackã¯ãŒã¯ã¹ããŒã¹ã§ã®ã€ãã³ããããŒã«ã«ã®ããã»ã¹ã§ãã£ããã§ããããã«ãªãã
ãŸãšã
Slackã¯ãŒã¯ã¹ããŒã¹ã«Botãåžžé§ããããBotã¯ã€ãã³ãã®çºçãŸã§åŸ
æ©ãã€ãã³ããçºçãããšãRequest URLã«SlackãµãŒããŒãããã€ããŒããéä¿¡ããããã€ããŒããåãåãã®ã°Botã®ãµãŒããŒã§ãããã°ã©ã ãå®è¡ããããããã°ã©ã äžããSlackã¯ãŒã¯ã¹ããŒã¹ã«äœãæäœãå ããã«ã¯ãSlack Web APIã䜿ããSlack Web APIã«ã¯äžã€äžã€ã¹ã³ãŒããããã管çç»é¢ããç»é²ããå¿
èŠãããã
ã¹ã³ãŒãã¯äœã
ã¹ã³ãŒãã¯ãWeb API ã¡ãœããã®åŒã³åºãã Events API ã®ã€ãã³ãã®åä¿¡ãšãã£ã Slack ã§ã®æ©èœãå®è¡ããæš©éãã¢ããªã«ä»äžããããã«äœ¿çšããŸãããŠãŒã¶ãŒãã¢ããªã®ã€ã³ã¹ããŒã«ãããŒã«åŸã£ãŠé²ããšããŠãŒã¶ãŒã¯ã¢ããªããªã¯ãšã¹ãããã¹ã³ãŒããžã®ã¢ã¯ã»ã¹ãèš±å¯ããå¿ èŠããããŸãã
以åã¯ãSlack ã¯ããŸããŸãªæš©éãšæ©èœãèŠæ±ãããããã¹ã³ãŒããæäŸããŠããŸãããã€ãŸãã¢ããªããå¿ èŠãšããªãæš©éããªã¯ãšã¹ãããããšããããããŸããããã®çµæããŠãŒã¶ãŒã¯ãã©ã€ãã·ãŒãšã»ãã¥ãªãã£äžã®æžå¿µããã¢ããªãã€ã³ã¹ããŒã«ããããªããšèããããã«ãªããŸããããã®ããçŸåšã§ã¯ãSlack ã§ã¯ã¢ããªããã®åäœã«å¿ èŠãªå°ããªã¹ã³ãŒãã®ã¿ãéžæã§ããããã«ãªããŸãããããã«ããã以åããããŠãŒã¶ãŒãã¢ããªãã€ã³ã¹ããŒã«ããããã«ãªããŸãã
åè
- https://api.slack.com/lang/ja-jp/hello-world-bolt
- https://api.slack.com/lang/ja-jp/understanding-oauth-scopes-bot
䜿ãããWeb APIã調ã¹ãŠSlackã®ã¹ã³ãŒãã®èšå®ããã
Slackã®Web APIãå©çšããŠSlackã®æäœãããå Žåãã©ã®APIã䜿ãã®ã調ã¹ãã
äŸãã°ãã©ããã®ãã£ã³ãã«ã«ã¡ãã»ãŒãžããã¹ãããå Žåã以äžã®APIã䜿ãã
ãã®ãµã€ãã§èŠããã€ã³ããšããŠã¯Required scopesã®ãšããã

Slackã®ç®¡çç»é¢äžã§Bot TokensãšUser Tokensãç»é²ããªããšããã®SlackããŒã ã«å¯ŸããŠBotã«èªå¯ãäžããŠãªãç¶æ ã§æäœã§ããªãã
åéãèµ·ãã
Slackãã£ã³ãã«ã«åžžé§ããŠåäœãããå ŽåEvents APIã䜿ãããšã«ãªãã
const { App } = require('@slack/bolt');
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
signingSecret: process.env.SLACK_SIGNING_SECRET
});
// Listens to incoming messages that contain "hello"
app.message('hello', async ({ message, say }) => {
// say() sends a message to the channel where the event was triggered
await say(`Hey there <@${message.user}>!`);
});
(async () => {
// Start your app
await app.start(process.env.PORT || 3000);
console.log('â¡ïž Bolt app is running!');
})();
helloãšæã¡èŸŒããšå®è¡ãããéšåã以äžã®ããã«å€æŽããã
app.message('hello', async ({ message, say }) => {
// say() sends a message to the channel where the event was triggered
const result = await getResult();
const result2 = await getResult2();
await say(`Hey there <@${message.user}>!. ${result2.text}`);
});
ãã®ã³ãŒãã3ç§ä»¥äžå®è¡çµäºãŸã§ã«ããããšãã¡ãã»ãŒãžãåéãããŠããŸããSlackã«åäžã®æç« ãäºåæåœãããããšã«ãªãã
è§£æ±ºæ¹æ³ã¯ä»¥äžã«ãŸãšãŸã£ãŠããã
å人çã«ã¯ãããããåéãç¡èŠããæ¹æ³ããæ¡çšããããã£ãã
const slackToken = process.env.SLACK_TOKEN
exports.index = async (event, context) => {
const body = JSON.parse(event.body);
if (!(body.token === slackToken)) return {"statusCode": 401, "body": "Missing Token"}
// åéãããã§ãã¯
if (event.headers['X-Slack-Retry-Num']) {
return { statusCode: 200, body: JSON.stringify({ message: "No need to resend" }) };
}
// ã¡ã€ã³ã®åŠçãããŠãã
...
}
Deploy
å ¬åŒã«ã¯ä»¥äžã®2ã€ã®æ¹æ³ã®deployæ¹æ³ãã®ã£ãŠããã
- Heroku
- AWS Lambda
å®è¡ç°å¢ãšããŠã¯å¥ã«èªåã§Expressã®ãã¬ãŒã ã¯ãŒã¯ã§ã©ããããŠãè¯ããããªã®ã§
- AWS Elastic Beanstalk
ã§ãè¯ãããã ã
- GCP Cloud Functions
ã§ãè¯ãããã
Boltã®åè
Discussion