LINE Messaging API を Nest.js 上で動かした際にハマったポイント
この記事は jiyuujin Advent Calendar 2023 の 20 日目の記事になります。
現在ジョインさせていただいているプロジェクト BOTCHAN の Engagement / Relation でも、LINE チャットボットを利用しており、その API 仕様を認識させていただく機会が多く増えました。
また今年は、巷で大きく話題をかっさらった OpenAI の ChatGPT と組み合わせているという方も多いと耳にします。
そんな ChatGPT と合わせしばしば使われることの多い LINE Messaging API について、そこでハマったポイントについて触れさせていただきます。
bodyParser の扱いに注意する
他ドメインの情報も組み込む想定があったので、より堅牢な設計を進めるなら是非とも Nest.js を選択したいという想いから、今回はバックエンドのフレームワークに Express を取り入れず、代わりに Nest.js を利用させていただきます。
ここで、デフォルトの bodyParser を無効にします。
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { NestApplicationOptions } from '@nestjs/common';
async function bootstrap() {
const options: NestApplicationOptions = {
bodyParser: false,
};
const app = await NestFactory.create(AppModule, options);
await app.listen(3000);
}
bootstrap();
これをしないと、Nest の bodyParser が呼ばれ、勝手にその body がオブジェクト化されてしまいます。そのため、先に LINE Bot の SDK を適用し、後にその bodyParser をあてるよう設定します。
丁寧に LINE Developers でアカウントを発行する
LINE Developers 管理画面より、新規で LINE Messaging API のチャンネルを作成する際は、事前にチャンネルシークレット並びにチャンネルアクセストークンを手元に記録しましょう。
LINE_CHANNEL_SECRET=
LINE_CHANNEL_ACCESS_TOKEN=
@nestjs/config の ConfigModule.forRoot
で、環境変数を含めた configuration.ts を読み込ませるようにします。
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import configuration from './configuration';
import { LINEBotModule } from './linebot/linebot.module';
@Module({
imports: [
LINEBotModule,
ConfigModule.forRoot({
isGlobal: true,
load: [configuration],
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
そして controller の行く先にある service ファイルにて、LINE Bot を送信するため @line/bot-sdk が必要となりますので、適宜インストールしましょう。
# npm
npm i -D @line/bot-sdk
# yarn
yarn add -D @line/bot-sdk
# pnpm
pnpm i -D @line/bot-sdk
こちらをもって LINE Bot を利用したメッセージ送信の下ごしらえが完了し、メッセージ送信はエンドポイント /v2/bot/message/reply
に対して、応答トークンと複数のテキストを送信することでその応答を取得できるようになります。
基本的には、この実装をもって LINE Bot が動く状態となりますが、後日 Nest.js 開発の勘所について、別の機会に書かせていただければと考えておりますので暫しお待ちくださいませ。
Discussion