自分のLINEチャットボットを作ろう!Kotlin Ktorを使った構築方法をゼロから学び、簡単に始められる
前書き
Kotlinという言語が好きなので、Ktorというライブラリを少し研究し、
暇な時間に小さなサイドプロジェクトを作成しました。
このプロジェクトはKtorをベースにしたサーバーで、LINEチャットボットと連携するためのものです。
この記事の目的は、Kotlin Ktorを使って自作のサーバーを構築し、
LINEチャットボットと連携して自動返信機能を実現することです。



自分の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 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を呼び出して取引ペアを取得する方法です。
実際、各コマンドの実装方法はほとんど同じです。
指定されたコマンドの下に実行したい動作を書き、
それを返すだけです。