Slack Boltを試してみる

2023/03/19に公開

この記事は個人blogにもアップロードしています。

概要

ChatGPTのAPIをSlackbotを作って試してみたいと思って、先にSlack Boltを試すことになりました。

Boltとは

  • SlackにBotを待機させて、チャンネルの特定の文字が入力されたり、メンションが飛んだりするなどのイベントをリッスンして、サーバからSlackの方に操作を加えることができるます。
  • 質問という文字を検知し、解答を返す。などができます。

ドキュメント

Boltを試してみる

SlackのAppを作る

https://api.slack.com/app で新しくアプリを作成します。

From scratch > appの名前と、使うslackのworkspaceを選択します。

Tokenの設定

Boltで必要なtokenは以下の三つです。

const app = new App({
  token: process.env.SLACK_BOT_TOKEN, // ①
  signingSecret: process.env.SLACK_SIGNING_SECRET, // ②
  socketMode: true,
  appToken: process.env.SLACK_APP_TOKEN, // ③
  port: 3000,
});

設定していきましょう。番号がついているのは後で利用するため、ちゃんと残します。

  • Basic Information > App Credentials > Signing Secret
    • copyしておく⇒ ②
  • Basic Information > App-Level Tokens > Generate Token and Scopes
    • connections:write のscopeを追加
    • Tokenをcopyしておく ⇒ ③
  • Basic Information > Display Information
    • slack Appの名前やiconを追加する
  • OAuth & Permissions > Scopes
    • 以下を追加する
      • chat:write
      • app_mentions:read
      • channels:history
      • channels:history
      • groups:history
      • im:history
      • mpim:history
    • Install App to Workspaceでtokenが表示されるのでcopyしておく ⇒ ①

Event 設定

  • Socket Mode
    • onにする
  • Event Subscription
    • onにする
    • Subscribe to bot eventsに以下を追加する
  • save changeを押すとreinstall your appが出るので必ず押す!

簡単に試す

Boltのドキュメントにあるコードをそのまま使ってみます。

Boltをinstall

$ npm install @slack/bolt

app.jsを作成して貼り付ける。
envの情報は上記でコピーしたTokenたちを貼ります。もしくはdotenvを入れてenvファイルからTokenを取得します。

app.js
const { App } = require('@slack/bolt');

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  socketMode: true,
  appToken: process.env.SLACK_APP_TOKEN,
  // ソケットモードではポートをリッスンしませんが、アプリを OAuth フローに対応させる場合、
  // 何らかのポートをリッスンする必要があります
  port: process.env.PORT || 3000
});

// "hello" を含むメッセージをリッスンします
app.message('hello', async ({ message, say }) => {
  // イベントがトリガーされたチャンネルに say() でメッセージを送信します
  await say(`Hey there <@${message.user}>!`);
});

(async () => {
  // アプリを起動します
  await app.start();

  console.log('⚡️ Bolt app is running!');
})();

Boltを立ち上げる

$ node app.js
[INFO]  socket-mode:SocketModeClient:0 Going to establish a new connection to Slack ...
⚡️ Bolt app is running!
[INFO]  socket-mode:SocketModeClient:0 Now connected to Slack

helloと投稿すると返事が返ってくることがわかります。

次はチャンネルにメンション付きの投稿がある場合、それを拾ってchatGPTと会話をさせるのを試してみます。

Ref

Discussion