LoginSignup
2
1

LINE BotサーバーをNestJSで開発する その1

Posted at

はじめに

NestJSはNode.jsのサーバーサイドアプリケーションを効率よく開発するためのフレームワークです。標準でExpressFastifyをプラットフォームとしたサーバーが開発可能で、各プラットフォームに対して依存度の低い開発が可能です。生成されるプロジェクトがTypeScriptなのも大きいですね。

NestJSで開発用のプロジェクトを生成するには以下のようにします

$ npm i -g @nestjs/cli
$ nest new project-name

これだけで開発に必要な環境、サンプルコードが自動的に生成されます。NestJSの始め方については本家のFirst Stepなどを参照してください。

今回は、このNestJSを使って簡単なLINE Botエコーサーバーを作ってみようと思います。以前公開したLINE Botサーバーの作り方はFastifyで開発しましたが、だいぶ古くなっているので、現在の技術で再開発してみます。

使ってみる

完成品はこちらです
https://github.com/bathtimefish/line-botserver-example-nestjs/tree/v1

送信したメッセージをオウム返しする単純なエコーサーバーです
sc-line-bot-nestjs.png

セットアップする

まず、こちらを参考にLINE Developers ConsoleからMessaging APIチャンネルを作成してください。

次に、こちらのようにAWS EC2等でVMインスタンスを立ち上げ、node.jsをセットアップします。

こちらを参考にLet's Encriptでサーバー証明書を作成してください。Bot ServerがLINE PlatformからのWebhookリクエストを受信するためにはSSL証明書を持ったWebサーバーである必要があります。

以上で、下準備ができました。

以下でNestJS Bot Serverのレポジトリをcloneします

git clone -b v1 https://github.com/bathtimefish/line-botserver-example-nestjs

依存モジュールをインストールします

cd line-botserver-example-nestjs
npm i

.envファイルを作成します。SSL_KEY_PATHにはLet's Encriptで生成したprivkey.pemのパス、SSL_CERT_PATHにはfullchain.pemのパスを設定します。

CHANNEL_ACCESS_TOKENにはMessaging APIチャンネルのCHANNEL ACCESS TOKEN、CHANNEL_SECRETにはCHANNEL SECRETをそれぞれ設定してください。

.env
SSL_KEY_PATH=[YOUR SSL KEY FILE PATH]
SSL_CERT_PATH=[YOUR SSL CERT FILE PATH]
CHANNEL_ACCESS_TOKEN=[YOUR CHANNEL ACCESS TOKEN]
CHANNEL_SECRET=[YOUR CHANNEL SECRET]

設定できたら以下のコマンドでBotサーバーを起動します。

npm run start

以下のようにサーバーが起動します。

npm run start

> line-botserver-example-nestjs@0.0.1 start
> nest start

[Nest] 2825  - 10/29/2023, 6:41:32 AM     LOG [NestFactory] Starting Nest application...
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [InstanceLoader] AppModule dependencies initialized +17ms
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [InstanceLoader] MessagingModule dependencies initialized +0ms
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [RoutesResolver] AppController {/}: +14ms
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [RouterExplorer] Mapped {/, GET} route +4ms
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [RoutesResolver] MessagingController {/messaging}: +0ms
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [RouterExplorer] Mapped {/messaging, GET} route +0ms
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [RouterExplorer] Mapped {/messaging, POST} route +1ms
[Nest] 2825  - 10/29/2023, 6:41:33 AM     LOG [NestApplication] Nest application successfully started +3ms

最後にこちらを参考にMessaging APIチャンネルのWebhook URLを設定してリクエストの検証をします。今回のWebhook URLは以下のような感じで https://[YOUR_DOMAIN]:3000/messaging のように設定してください。

スクリーンショット 2023-10-29 15.08.12.png

Verifyボタンをクリックすると、以下のようなエラーが発生し、サーバーサイドでも例外Cannot read properties of undefined (reading 'message')がスローされます。

スクリーンショット 2023-10-29 15.49.46.png

これはエラーですが、正常に送信されている証拠です。このBot ServerのPostハンドラはWebhookでPostされるリクエストボティがLINE Messaging APIのリクエストボティ構造体かどうかを検証しています。一方で、VerifyボタンをクリックしたときにPostされるリクエストボディは{}なので、Bot Server側でLINE Messaging APIのリクエストボティに必須のmessageプロパティが存在しないという例外が発生しています。

この状態でWebhook URLが妥当だという検証はできているので、LINE ChatでBotに対しメッセージを送るとオウム返しが返ってくるので安心してください。

Botサーバーを開発するたびにそもそもVerifyボタンで送信されるのが{}ってどうなのよ。。と思ってるんですが、わかってればクレーム出すほどのもんじゃないのでずっと放置されてるんでしょうか。ダミーのText Message Eventでも送ったほうが親切だと思うんですけどね。

おわりに

NestJSベースのLINE Botサーバーを立ち上げて使ってみました。次回はこのサーバーのコードの要点などを解説していこうと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1