自分のLINEチャットボットを作ろう!Kotlin Ktorを使った構築方法をゼロから学び、簡単に始められる

前書き

Kotlinという言語が好きなので、Ktorというライブラリを少し研究し、
暇な時間に小さなサイドプロジェクトを作成しました。
このプロジェクトはKtorをベースにしたサーバーで、LINEチャットボットと連携するためのものです。

この記事の目的は、Kotlin Ktorを使って自作のサーバーを構築し、
LINEチャットボットと連携して自動返信機能を実現することです。

最終サーバーの実行結果
最終LINEボットの返信結果

ここでは、Kotlinを使っていくつかのAPIとクローラーを連携し、取引ペアの価格やネット上の画像を取得する方法をデモンストレーションします。


この記事では、KotlinベースのKtorサーバーを使って、
自分のLINEチャットボットを簡単に構築する方法を紹介します。
Ktorはシンプルで使いやすいフレームワークで、
様々なアプリケーションの構築に利用できます。
拡張性と高性能を兼ね備えているため、優れた選択肢となります。

この記事を通じて、
KotlinとKtorを使ってサーバーを構築し、
LINEチャットボットと連携する方法を学びます。

Gradleを使って環境を設定し、必要なライブラリを参照します。


実装方法

まず、ktorプロジェクトを作成します。
私はktorプラグインを使って直接作成しました。
多くの設定ファイルが自動的に作成されるので、
各ファイルの役割を理解するだけで済みます。


まず、
ルートディレクトリに application.conf ファイルを作成し、
Ktorに関連するパラメータを設定します。
例えば、ポート番号やメインプログラムの Application.module のパッケージパスなどです。


次に、application.ktファイルを作成します。

  fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

このコードは、KtorがNettyのエンジンを使用していることを示しています。
そのため、main()を指す必要があります。
ただし、Ktorは他のフレームワークもサポートしていますが、
現在のところ時間がなく、将来的に試してみる予定です。

  fun Application.module() {...}

ここでは、前述の.confファイルで指示されたサーバーブロックを実行します。
Kotlinの拡張機能を使って記述しています。

以下は実装時の例です。
KtorがGsonをサポートしてJSONを解析できるようにするために、
関連するコードを追加しました。
目的は、HTTPサーバーが受信時にGsonを使用してデータを解析できるようにすることです。

install(ContentNegotiation) {
        gson {
            setPrettyPrinting()
        }
    }

ここでいくつかのAPIインターフェースを定義できます。
例えばPOSTやGETなどを定義し、外部の人がAPIを呼び出してあなたのサーバーとやり取りできるようにします。
以下の例では、/callbackという名前のAPIインターフェースを定義しています。

routing {
      post("/callback") {...}
}

この章では基本的なKtorの書き方を説明しました。
次に、Ktorサーバーをオンラインにする方法を考えることができます。

サードパーティのサーバー構築サービスを使用することもできますし、
固定IPとドメイン名を申請して自分で構築することもできます。
また、私のようにngrokを使用することもできます。
ngrokは2時間無料で使用できるセッションを提供し、
固定のドメイン名を生成して外部の人に接続を提供できます。
自分で試したり、友達と遊んだりするだけなら、この方法を使用できます。

ngrokの使用方法の概要

ngrokの使用方法は非常に簡単です。
ngrok CLIをダウンロードして環境変数に追加し、
サーバーを起動するだけでHTTPおよびHTTPSの接続URLが生成されます。
ポートを変更してKtorサーバーと接続することができます。

インストールが完了したら、以下のコマンドを黒い画面で入力するだけです。 (ポートは自由に調整可能)

ngrok http 8080
LINE Botの署名検証

LINE Developerのドキュメントによると、
LINE公式からのリクエストを受信した場合、
受信したヘッダーx-line-signatureの署名とリクエストボディおよびチャネルシークレットをHmacSHA256で検証する必要があります。
両者が一致する場合のみ、
LINE公式があなたのサーバーを呼び出したことを確認できます。
これにより、悪意のある人物があなたのサーバーを攻撃するのを防ぐことができます。

ここに私のKotlinでの署名検証の書き方を示します。

次に、LINE Developer APIを学習し続けます。
例えば、LINE Botがチャットルームで自動的にメッセージを返信するようにするには、
以下のAPIを使用する必要があります。
以下にcURLコマンドを参考として示します。
cURLを使用すれば、開発者は自分の得意な言語で開発することもできます。

curl -v -X POST https://api.line.me/v2/bot/message/reply \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer {channel access token}' \
  -d '{
    "replyToken":"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
    "messages":[
        {
            "type":"text",
            "text":"Hello, user"
        },
        {
            "type":"text",
            "text":"May I help you?"
        }
    ]
  }'

また、自分のサービスやサードパーティのパッケージを接続したい場合は、
まずそのパッケージを呼び出してから、
LINE Botサーバーに返信するだけです。
ウェブスクレイピングも同様です。
スクレイピングが完了したら、公式APIを呼び出すだけです。

私の場合、いくつかのコマンドを作成しました。
対応するコマンドを受信すると、
関連する処理を行います。

enum class TextCommandType(var type: String){
    MESSAGE_PICK_UP("/抽 "),
    MESSAGE_HELP("/help "),
    MESSAGE_PICK_NAME("/pick " ),
    MESSAGE_PRICE_CRYPTO_TRADE_ID("/price " ),
    MESSAGE_NOT_CONTAIN("")
  }

ここに一例を示します。
主に、特定のコマンドがサードパーティのAPIを呼び出して取引ペアを取得する方法です。

実際、各コマンドの実装方法はほとんど同じです。
指定されたコマンドの下に実行したい動作を書き、
それを返すだけです。

You might also enjoy