🐷

TypeScriptでオウム返しするLINE Botをつくる

に公開

TypeScriptで単純なLINE Botを作る方法を書きます。
ユーザーがLINEアプリから送信したテキストメッセージに対して、そのまま同じ文言を返すBotを作りたいと思います。

準備

TypeScriptでLINE BotをつくるにばSDKを利用すると便利です。Webサーバーとしてはexpressを用います。

yarn add @line/bot-sdk express

オウム返しするBotをつくる

オウム返しするBotは次のようなコードで実装できます。

import express, { Request, Response } from "express";
import {
  middleware,
  messagingApi,
  MessageEvent,
  TextMessage,
} from "@line/bot-sdk";
const { MessagingApiClient } = messagingApi;
import dotenv from "dotenv";
dotenv.config();

const app = express();

const config = {
  channelSecret: process.env.LINE_API_SECRET || "",
};
app.post(
  "/webhook",
  middleware(config),
  async (req: Request, res: Response) => {
    const event = req.body.events[0] as MessageEvent;
    if (event === undefined) {
      // Webhook検証
      return res.status(200).end();
    }

    // 簡略化のため、テキストメッセージとして扱う
    const message = event.message as TextMessage;

    // LINE Messaging APIクライアントの初期化
    const client = new MessagingApiClient({
      channelAccessToken: process.env.LINE_ACCESS_TOKEN || "",
    });

    // メッセージ返信
    await client.replyMessage({
      replyToken: req.body.events[0].replyToken,
      messages: [
        {
          type: "text",
          text: message.text, // オウム返し
        },
      ],
    });
  }
);

const port = process.env.PORT || 3000;
app
  .listen(port, () => {
    console.log("Server is running on port", port);
  })
  .on("error", (err: Error) => {
    throw new Error(`Server failed to start: ${err.message}`);
  });

Webhookイベントオブジェクト

ユーザーがLINEアプリでメッセージを送信すると、LINEサーバーからWebhookイベントオブジェクトが送信されます。

{
  "destination": "xxxxxxxxxx",
  "events": [
    // LINEアプリから送信されたメッセージ
  ]
}

eventsにLINEアプリから送信されたメッセージが含まれます。メッセージは複数存在することもありますし、検証の場合は0件になります。

https://developers.line.biz/ja/reference/messaging-api/#webhook-event-objects

オウム返し

LINE SDKでLINE関連の操作を行うにはMessagingApiClientを使います。

初期化するには、チャンネルアクセストークンが必要です。取得方法はいくつかありますが、簡単な方法はLINE Consoleから取得するのが便利です。

https://developers.line.biz/ja/docs/basics/channel-access-token/#channel-access-token-typesMessagingApiClient

ユーザーから送信されたメッセージに返信するにはclient.replyMessage()を用います。
https://developers.line.biz/ja/reference/messaging-api/#send-reply-message

返信内容はmessagesで指定します。
オウム返しするために、ユーザーから送信された内容をevents[].message.textから取得して指定すれば大丈夫です。

まとめ

TypeScriptで単純なLINE Botを実装する方法を解説しました。
ユーザーがLINEアプリから送信した内容は、リクエストボディのevents配列に含まれます。テキストメッセージの場合、message.textに送信内容が設定されます。
ユーザーに返信するにはclient.replyMessage()を使えば大丈夫です。

Discussion