Hello World, Bolt! ⚡️ Bolt フレームワークを使って Slack Bot を作ろう

> Published: 2019-08-09
> Updated: 2020-02-11

> *OAuth 権限設定についての変更がありましたので、チュートリアルのその設定部分を追加しました。*

ごく単純な Slack アプリを作るのはそれほど複雑であるはずはないのに、いざ作るとなると API ドキュメンテーションの中に埋もれてしまってどこから手をつけたらいいのかわからなかったり、パラメータの名前がちょっとだけ間違えてしまって思ったように動かなかったり。

でもそれを自分のせいにしないでください🙅。Slack のアプリ作成の手順は慣れていないとちょっとクセモノだったりするのです🤷。でもそれを少しでも軽減するためにもっと直感的に使えるフレームワーク [Bolt をリリース](https://github.com/slackapi/bolt)、そして[日本語ドキュメント](https://slack.dev/bolt/ja-jp)も公開しました 🎉。 

Bolt は Slack API を使いやすくするための Node.js フレームワークです。 一から API を使ってアプリを開発していくことと比べると、このフレームワークを使うともっとサクっと作っていくことができると思います。

今回ここで紹介するのは、Bolt を使って簡単なボットを作るためのステップ・バイ・ステップのチュートリアルです。ユーザが _[App home](https://api.slack.com/changelog/2018-05-app-home-events-for-workspace-apps)_ スペース（ユーザがボットに直接対話できるスペース）にアクセスした時にメッセージを送信するアプリ、 Hello World bot を一緒に作っていきましょう。

![blot_hello_world.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/bff61792-9cab-d28e-b60e-2f8b5d1c0471.gif)


### はじめるのに必要なもの

Bolt は Node.js を使っていますので、このチュートリアルを進めていくには、JavaScript の経験が必要ですが、他のプログラミング言語を経験されている方は問題なく理解してもらえるかと思います。


### ソースコード

ここでは Glitch というサードパーティのサービスを使って作業を進めていきます。Glitch はウェブ上で動く IDE で、「リミックス」 (この Remix は GitHub で言う所の clone のようなものと考えてください) することにより元のソースをコピーして新規の自分のプロジェクトとして作業を進めていきます。ブラウザ上で実行できますので、デプロイの必要もありません。

**ソースコード**: [https://glitch.com/edit/#!/slack-bolt-hello-world](https://glitch.com/edit/#!/slack-bolt-hello-world)
**Remix リンク**: [https://glitch.com/edit/#!/remix/slack-bolt-hello-world](https://glitch.com/edit/#!/remix/slack-bolt-hello-world)

このチュートリアルをすすめるに当たって、まずは上の Remix リンクをクリックすることから始めましょう。リミックスすると自分だけのプロジェクトが作成されます。プロジェクト名には、ランダムな単語２文字でつけられていると思います。例えば、 _elegant-fox_ や _thin-coin_ というような一見意味不明な単語がプロジェクト名です。あとで必要になってくるので確認してください。


## Events API を使ってアプリを作成する


### アプリの設定

ブラウザで Glitch とは別に新しくタブまたはウィンドウを開き Slack アプリ[**新規作成ページ**](https://api.slack.com/apps?new_app=1&ref=tutorial_hello_world_bolt_qiita)へいきます。このリンクをたどると新しいダイアログが開きます。（開かない場合はアプリ設定ページの **Create new app** とかかれた緑のボタンをクリック。）

ダイアログ内で (1) アプリの名称を入力し、(2) これから作成するアプリをインストールするワークスペースを指定します。ここでは普段の仕事に支障がないように[無料の開発用のワークスペースを作るのもいいでしょう](https://slack.com/get-started#create)。 (3) **Create App** をクリックしてダイアログを一旦閉じます。

![config_create_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/ff433d33-53dd-5da6-9067-eeba7daf2ccd.png)
アプリが作成されると次の画面 **Basic Information** が表示されますので、そこから **App Credentials** セクションまでスクロールしてください。そこで (1) **Signing secret** の **Show** ボタンをクリックした後に表示される文字列をコピーします。

![config_credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/d1a8b6a2-f658-bfdc-6cf9-4e26de8ff3a8.png)
Glitch のプロジェクトにある、認証キーなどを保管するための **.env** ファイルをクリックして先ほどコピーした _signing secret_ をペーストします。ちなみに、この Glitch プロジェクトの URL を人にシェアしてもこのファイルは共有されないのでご安心を。

![glitch_env.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/f0dffd60-e5f9-fd68-eac4-91c417b7ba11.png)

また Slack App 設定画面へ戻ります。

一旦、このボットをワークスペースにインストールしましょう。左のメニューから **Install App** へ行き、緑の **Install App to Workspace** ボタンをクリックします。ページ内の指示にしたがってインストールしてください。

インストールが終わると、ふたつの OAuth トークンが表示されます。このチュートリアルで作るボットアプリには `xoxb-` (1) から始まる bot トークンが必要です。

![config_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/796f2c5c-b45a-b2eb-c7b9-1b30b40d0622.png)
このトークンを Glitch プロジェクトの **.env** ファイルに保存してください。

そして次に  **OAuth & Permissions** ページをスクロールして **Bot Token Scopes** セクションで必要な OAuth スコープを選択します。このアプリでメッセージ送信の機能を使うので、その権限設定である `chat:write` を追加してください。
![config_scopes](https://api.slack.com/img/api/articles/bolt/config_scopes.png)

### イベントの設定

イベント発生時に Slack サーバからのペイロードの受け取りをするには、イベントのサブスクリプションが必要です。このアプリの場合はユーザが App Home にアクセスした際に発生するイベントをリスニングします。

左のメニューから **Event Subscriptions** へ行き、 (1) Enable Events の設定を On に変更します。

そして (2)  **Request URL** を入力します。 Bolt ではデフォルトの URL は `https://your-server/slack/events` のようにサーバ名の後にこのようなパスをつけます。 Glitch 使用時の場合はサーバ URL は project-name.glitch.me となります。なので Request URL は、`https://this-coin.glitch.me/slack/events` のようになります。（注意！_thin-coin_ 部を自分のプロジェクト名に変更するのをお忘れなく！）

Request URL に問題がない場合は入力フィールドの上に緑のチェックマークが表示されるはずです。

![config_events.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/9d1db6aa-177c-90d3-3528-b128666b198e.png)

次に  **Subscribe to Workspace Events** までスクロールします。 **Add Workspace Event** ボタンをクリックして (3) [`app_home_opened`](https://api.slack.com/events/app_home_opened) イベントを追加します。

(4) そして **Save Changes** をクリックします。

![config_events_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/b458c2fc-f563-fb45-faf5-143f4979c3b1.png)

## Bolt でコーディング

リミックスされた Glitch プロジェクトにはすでにコードが含まれているので、このままでも実行できるのですが、アプリを試してみる前にちょっとだけ説明させてください。

まず、Glitch プロジェクトにある、**package.json** の内容を見てみましょう。このファイルはアプリを定義するもので、依存パッケージとして bolt モジュールがすでに含まれています。Glitch が自動的に `npm` コマンドをバックグランドで実行しているので、自分で行う必要がありません。

もし、Glitch を使用せずに一から Bolt プロジェクトを作るというときはプロジェクトのディレクトリ下で、次のようにインストールしてください。


```bash

$ npm i @slack/bolt
```


メインのコードの書かれた **index.js** を見てみましょう。 まず Bolt package をインポートし、 認証とともに app を初期化します。


```js

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

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET
});

(async () => {
  await app.start(process.env.PORT || 3000);
})();
```

この Node コードが実行されると（Glitch では自動的に実行されます）サーバが動きます。

### Bolt でのイベントハンドリング

Slack Events API からのイベントをリスニングするには Bolt の `event()` メソッドを使います。これで Slack クライアントから何かしらのイベントが発生したときに自分のアプリで何らかのアクションを起こすことができるのです。この場合、ユーザから App Home にアクセスがあった場合にリスナーがトリガーされます。

この `event()` メソッドには `eventType` というstring 型の引数が必要でここでは  `app_home_opened` を指定します。


```js
app.event('app_home_opened', ({ event, say }) => {  
    say(`Hello world, <@${event.user}>!`);
});
```


このサンプルコードでは、このイベント発生時に「Hello world」メッセージを特定のユーザ名とともに `say()`  を使って送信しています。

Glitch にあるコードでは擬似データベースを使って、ユーザが App Home にアクセスするのは初めてかどうかをチェックしている、という設定にしています。初めての時は「Hello world」、２回目以降は「Hi again!」を送信しています。


---


さて、実際に自分のアプリを動かしてみましょう。

Slack ワークスペースを開いて、このボットのいる App Home をクリックしましょう。これはチャンネル一覧やダイレクトメッセージ一覧のさらに下にある App のセクションから見つけることができます。

App Home を開くと「Hello world」のメッセージが表示されるはず！
<img width="1012" alt="slack_hello.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339293/84a18d72-53d4-ae51-0f8e-19896658ce70.png">
無事表示されましたか？やりましたね 🙌、あなたの Bolt アプリ一号が完成しました⚡。これで Bolt の初期化、イベントのリスニング、メッセージ送信メソッドの使い方を理解してもらえたと思います。次回はぜひ、もっと本格的なアプリを作ってみてください。その際にはここで学んだ App Home の使い方を活かして、 初めてのユーザ向けの使い方ガイド機能などを作ってみてください！

このチュートリアルでは最近リリースされた **ホーム・タブ** について詳しくは書かれていませんが、この機能を使ってみたい方は[Slack API 新機能を使ってアプリのホーム・ヴューを活用しよう🏡](https://qiita.com/girlie_mac/items/fae66bcc2ec3ccf25db6)をどうぞ。このチュートリアルでは Bolt を使用していませんが、記事のリンクから Bolt のソースコードを見ることができますので是非！

### Learn More

*   [Bolt documentation](https://slack.dev/bolt/ja-jp) (日本語）
*   <span style="text-decoration:underline;">もうちょっと複雑な[ Glitch ](https://glitch.com/edit/#!/slack-bolt)</span>サンプル