🐼

LINE Messaging API を Nest.js 上で動かした際にハマったポイント

2024/01/30に公開

この記事は jiyuujin Advent Calendar 2023 の 20 日目の記事になります。

https://adventar.org/calendars/9670

現在ジョインさせていただいているプロジェクト BOTCHAN の Engagement / Relation でも、LINE チャットボットを利用しており、その API 仕様を認識させていただく機会が多く増えました。

https://wevnal.co.jp/service/chatbot/

また今年は、巷で大きく話題をかっさらった OpenAI の ChatGPT と組み合わせているという方も多いと耳にします。

そんな ChatGPT と合わせしばしば使われることの多い LINE Messaging API について、そこでハマったポイントについて触れさせていただきます。

https://developers.line.biz/ja/docs/messaging-api/overview/

bodyParser の扱いに注意する

他ドメインの情報も組み込む想定があったので、より堅牢な設計を進めるなら是非とも Nest.js を選択したいという想いから、今回はバックエンドのフレームワークに Express を取り入れず、代わりに Nest.js を利用させていただきます。

https://docs.nestjs.com/

ここで、デフォルトの 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 が必要となりますので、適宜インストールしましょう。

https://www.npmjs.com/package/@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 に対して、応答トークンと複数のテキストを送信することでその応答を取得できるようになります。

https://developers.line.biz/ja/docs/messaging-api/nodejs-sample/#send-reply

基本的には、この実装をもって LINE Bot が動く状態となりますが、後日 Nest.js 開発の勘所について、別の機会に書かせていただければと考えておりますので暫しお待ちくださいませ。

LINE Developer Community

Discussion