🎄

Ktor と Bolt で始める Slack アプリ入門

2020/12/24に公開

先日 Ktor 1.5.0 がリリースされましたね!開発者モードなどが改善されたようで引き続き動向を追っていこうと思います。さて、今回は Ktor と Bolt で簡単な Slack Bot アプリを作るをテーマに紹介します。この記事は Ktor や Kotlin で Slack アプリを作ってみたいという方向けであり、また コネヒト Advent Calendar 2020 の24日目の記事です。

Ktor と Bolt について

Bolt は Slack アプリ開発を簡単に行うためのフレームワークで、いくつかの言語がサポートされています。java-slack-sdk 1.3.0 から Kotlin の Webフレームワークである Ktor もサポートされています。もちろん Kotlin も利用することができ、サンプルコードもいくつか提供されているので、気になる方はご覧ください。

今回は Slack 上で /hello と入力すると、Hello World が返ってくる Slack Bot App を作成します。全体の手順は次の通りです。

  1. Slack Bot App の登録
  2. Ktor プラグインのインストール
  3. Ktor と Bolt でアプリ開発

1. Slack Bot App の登録

Slack アプリの作成

Slack API へ遷移し、Create New App を選択します。

App Name と Development Slack Workspace を指定後、Create App を選択します。

パーミッションの設定

アプリの作成ができたので、次にパーミッションの設定を行います。Features > OAuth & Permmision へ遷移します。Bot Token Scopes で chat:write パーミッションを登録します。

ワークスペースへインストール

パーミッションの設定できたので、次にワークスペースへアプリをインストールします。Settings > Basic Information > Install your app を選択します。

Install to Workspace を選択します。

Allow を選択します。

トークンを控える

Ktor から Slack Bot を利用するため、Bot User OAuth Access Token と Signing Secretを控えておく必要があります。Features > OAuth & Permissions を選択します。Bot User OAuth Access Token を控えます。

次に Settings > Basic Information を選択します。App Credentials の Signing Secret を控えます。

2. Ktor プラグインのインストール

ここからは Ktor と Bolt を使ってアプリを作成しますが、Ktor プラグインを使うと簡単に Ktor プロジェクトの雛形を作成できます。以下は IntelliJ IDEA を使った手順で紹介します。

Ktor プラグインをインストールします。

新規作成で Ktor プロジェクトを作成します。

簡単にプロジェクトの雛形が作成できました。

3. Ktor と Bolt でアプリ開発

ここからは Slack 上で /hello と入力すると、Hello World が返ってくる Slack Bot App を作成します。Ktor と Bolt の依存関係を追加します。

build.gradle
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "io.ktor:ktor-server-netty:$ktor_version"
    implementation "ch.qos.logback:logback-classic:$logback_version"
    implementation("com.slack.api:bolt-ktor:1.3.0") 
    implementation("io.ktor:ktor-server-netty:$ktor_version") 
    testImplementation "io.ktor:ktor-server-tests:$ktor_version"
}

次に Slack 上で /hello を受け付けると、Slack Bot が Hello World を返す処理を記述します。

Application.kt
import com.slack.api.bolt.App
import com.slack.api.bolt.ktor.respond
import com.slack.api.bolt.ktor.toBoltRequest
import com.slack.api.bolt.util.SlackRequestParser
import io.ktor.application.*
import io.ktor.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*

fun main() {
    val app = App()
    val requestParser = SlackRequestParser(app.config())
    app.command("/hello") { req, ctx ->
        ctx.ack("Hello World")
    }

    val server = embeddedServer(Netty, port = 3000) {
        routing {
            post("/slack/events") {
                respond(call, app.run(toBoltRequest(call, requestParser)))
            }
        }
    }
    server.start()
}

Edit Configurations > Environment variables へ遷移し、控えていた SLACK_BOT_TOKEN と SLACK_SIGNING_SECRET を登録します。

Ktor から起動した Bolt アプリにアクセスできるようにするため ngrok を利用します。Application.kt を実行して ngrok を用いてフォワーディングしている URL を取得します。Slack API 画面に戻り、Features > Slash Commands で Create New Command を選択します。Command に /hello、Request URL に https://{ドメイン}/slack/events を指定して Save を選択します。

Settings > Install App に遷移して Reinstall App を選択します。その後、Reinstall to Workspace を選択します。ワークスペースを指定した Slack 上で /hello コマンドを実行すると、

Hello World が表示されます。

まとめ

ほとんど Slack App の設定紹介でしたが、Bolt が Ktor もサポートしたことによって Ktor で Slack アプリが開発しやすくなりました。今回は触れていませんが、モーダルなどを作る際に Block Kit が Kotlin DSL もサポートしているため、記述しやすくなっています。もしよかったらお試しください。

Discussion