LINE公式アカウントのBotを作る方法|Messaging APIとNode.jsの実装手順

pexels-photo-887751.jpeg
Photo by AS Photography on Pexels.com

この記事で扱う『LINE公式アプリ』は、LINE公式アカウントにMessaging ​APIを接続し、利用者から届いたメッセージへプログラムで応答するBotです。

スマートフォンへインストールする一般的なアプリを作る手順ではありません。

LINE公式アカウントの準備からWebhookの公開、Node.jsによる返信処理、動作確認までを順に進めます。

Botが返信するまでの流れ

Messaging ​APIは、LINE公式アカウントと外部のプログラムを接続するための仕組みです。

Webhookは、メッセージの受信や友だち追加などの出来事を、LINEプラットフォームからBotサーバーへHTTP ​POSTリクエストで通知する仕組みです。

  1. 利用者がLINE公式アカウントへメッセージを送ります。
  2. LINEプラットフォームが、登録済みのWebhook ​URLへイベントを送ります。
  3. Botサーバーがイベントを確認し、返信内容を決めます。
  4. BotサーバーがMessaging ​APIを呼び出し、利用者へ返信します。

この流れを動かすには、LINE側のチャネル設定と、外部からHTTPSで到達できるBotサーバーの両方が必要です。

作成前に用意するもの

  • LINE公式アカウントを作成または管理できるアカウント
  • Node.jsとnpmを実行できる開発環境
  • ローカルサーバーを外部公開するためのHTTPS ​URL
  • 環境変数を設定できるターミナル

Node.jsとnpmの役割が曖昧な場合は、先にNode.jsとnpmなどの違いを整理した解説を読むと、以降のコマンドの意味を理解しやすくなります。

1.LINE公式アカウントでMessaging ​APIを有効にする

現在は、LINE ​DevelopersコンソールからMessaging ​APIチャネルを直接新規作成する手順ではありません。

  1. LINE公式アカウントを用意します。
  2. LINE ​Official ​Account ​Managerで対象アカウントを開き、Messaging ​APIの利用を有効にします。
  3. 画面の案内に沿って、この公式アカウントを管理するプロバイダーを選びます。
  4. 同じアカウントでLINE ​Developersコンソールへログインし、選択したプロバイダー内にMessaging ​APIチャネルが作成されていることを確認します。

プロバイダーは、チャネルを所有し管理する組織または個人を表します。

後から管理単位を整理し直すのが難しいため、会社のサービスなら会社用のプロバイダーを選ぶなど、運用主体に合わせて決めます。

画面の場所や最新の操作名は、LINE ​DevelopersのMessaging ​APIを始める公式手順で確認できます。

2.チャネルシークレットとアクセストークンを準備する

Botサーバーには、役割の異なる二つの認証情報を設定します。

認証情報 役割 扱い方
チャネルシークレット 受信したWebhookがLINEプラットフォームから届いたものかを検証する LINE ​Developersコンソールのチャネル基本設定で確認し、環境変数へ保存する
チャネルアクセストークン BotサーバーからMessaging ​APIを呼び出す 運用方針に合う種類を発行し、環境変数へ保存する

どちらもソースコードへ直接書かず、Gitなどのリポジトリへ登録しません。

漏えいが疑われる場合は、該当する認証情報を再発行し、サーバー側の設定を更新します。

3.Node.jsプロジェクトを作成する

空の作業ディレクトリで、ExpressとLINE公式のNode.js ​SDKをインストールします。

npm ​init ​-y
npm ​install ​express ​@line/bot-sdk

続いて、次の内容をapp.jsとして保存します。

const ​express ​= ​require('express');
const ​line ​= ​require('@line/bot-sdk');

const ​channelSecret ​= ​process.env.LINE_CHANNEL_SECRET;
const ​channelAccessToken ​= ​process.env.LINE_CHANNEL_ACCESS_TOKEN;

if ​(!channelSecret ​|| ​!channelAccessToken) ​{
 ​ ​throw ​new ​Error('LINEの認証情報が環境変数に設定されていません。');
}

const ​client ​= ​line.LineBotClient.fromChannelAccessToken({
 ​ ​channelAccessToken,
});

const ​app ​= ​express();

app.post('/webhook', ​line.middleware({ ​channelSecret ​}), ​async ​(req, ​res) ​=> ​{
 ​ ​try ​{
 ​ ​ ​ ​await ​Promise.all(req.body.events.map(handleEvent));
 ​ ​ ​ ​res.sendStatus(200);
 ​ ​} ​catch ​(error) ​{
 ​ ​ ​ ​console.error(error);
 ​ ​ ​ ​res.sendStatus(500);
 ​ ​}
});

async ​function ​handleEvent(event) ​{
 ​ ​if ​(event.type ​!== ​'message' ​|| ​event.message.type ​!== ​'text') ​{
 ​ ​ ​ ​return ​null;
 ​ ​}

 ​ ​return ​client.replyMessage({
 ​ ​ ​ ​replyToken: ​event.replyToken,
 ​ ​ ​ ​messages: ​[
 ​ ​ ​ ​ ​ ​{
 ​ ​ ​ ​ ​ ​ ​ ​type: ​'text',
 ​ ​ ​ ​ ​ ​ ​ ​text: ​`受信したメッセージ:${event.message.text}`,
 ​ ​ ​ ​ ​ ​},
 ​ ​ ​ ​],
 ​ ​});
}

const ​port ​= ​process.env.PORT ​|| ​3000;
app.listen(port, ​() ​=> ​{
 ​ ​console.log(`Server ​running ​on ​port ​${port}`);
});

line.middleware()は、Webhookの本文を使って署名を検証します。

この処理より前にexpress.json()で本文を変換すると署名検証に失敗する可能性があるため、この最小構成では追加していません。

SDKの呼び出し方は更新されることがあるため、新規実装ではLINE公式Node.js ​SDKの基本用例も確認してください。

4.環境変数を設定して起動する

macOSまたはLinuxの場合

export ​LINE_CHANNEL_ACCESS_TOKEN='発行したチャネルアクセストークン'
export ​LINE_CHANNEL_SECRET='チャネルシークレット'
node ​app.js

Windows ​PowerShellの場合

$env:LINE_CHANNEL_ACCESS_TOKEN='発行したチャネルアクセストークン'
$env:LINE_CHANNEL_SECRET='チャネルシークレット'
node ​app.js

Server ​running ​on ​port ​3000と表示されれば、ローカルサーバーは起動しています。

ターミナルを閉じると環境変数が引き継がれない場合があるため、再起動後に値が設定されているかも確認します。

5.Webhook ​URLを登録する

  1. ngrokなどのトンネルサービスを使い、ローカルの3000番ポートへ転送するHTTPS ​URLを発行します。
  2. 発行されたURLの末尾に/webhookを付けます。
  3. LINE ​Developersコンソールで対象チャネルを開き、Messaging ​API設定のWebhook ​URLへ入力します。
  4. 検証を実行し、Botサーバーへ到達できることを確認します。
  5. Webhookの利用を有効にします。

Webhook ​URLには、外部から到達できるHTTPSのエンドポイントが必要です。

トンネルサービスのURLが変わった場合は、LINE ​Developersコンソール側のURLも更新します。

6.友だち追加して返信を確認する

  1. Messaging ​API設定に表示されるQRコードから、対象のLINE公式アカウントを友だち追加します。
  2. 任意のテキストメッセージを送ります。
  3. 『受信したメッセージ:送信内容』と返信されることを確認します。
  4. 返信がない場合は、BotサーバーのログとLINE ​DevelopersコンソールのWebhookエラーを確認します。

LINE ​Official ​Account ​Managerの応答メッセージが有効だと、プログラムからの返信とは別に自動応答が届くことがあります。

学習中は応答メッセージをオフにすると、どの処理が返信したのかを切り分けやすくなります。

動かないときの確認表

症状 確認する点
Webhookの検証に失敗する サーバーが起動しているか、HTTPS ​URLと/webhookのパスが一致しているかを確認する
署名エラーになる チャネルシークレットが対象チャネルの値か、署名検証より前にリクエスト本文を変換していないかを確認する
イベントは届くが返信されない チャネルアクセストークン、返信処理のエラー、受信イベントがテキストメッセージかを確認する
返信が二重に届く LINE ​Official ​Account ​Managerの応答メッセージと、Botの返信が同時に有効になっていないかを確認する
再起動後だけ動かない 新しいターミナルや本番環境に二つの環境変数が設定されているかを確認する

Webhookの署名検証、再送、重複処理への備えを本番向けに設計する場合は、Webhook受信APIの安全設計を扱う実務ガイドも参考になります。

本番公開で追加する対策

  • 認証情報をデプロイ先の環境変数または秘密情報の管理機能へ保存する
  • 安定したHTTPS ​URLへ切り替え、LINE ​DevelopersコンソールのWebhook ​URLを更新する
  • Webhookへ短時間で成功応答を返し、時間のかかる処理は必要に応じて分離する
  • 再送されたイベントを重複して処理しないよう、処理済みイベントを判別できる設計にする
  • 障害を追跡できるログを残し、チャネルシークレットやアクセストークンは出力しない

LINE ​DevelopersのWebhook受信の公式ガイドでは、署名検証と非同期処理を含む運用上の注意点を確認できます。

次に追加できる機能

テキストの返信を確認できたら、次の機能を一つずつ追加すると、不具合の原因を切り分けやすくなります。

  • 友だち追加やブロック解除を受け取るフォローイベント
  • 画像や位置情報など、テキスト以外のメッセージへの対応
  • リッチメニューやクイックリプライによる操作導線
  • LIFFを使ったWeb画面との連携

最初の完成条件は、Webhookの検証が成功し、署名を確認したうえで、テキストメッセージへ一度だけ返信できることです。

その状態を保ったまま機能を増やすと、設定の問題とプログラムの問題を分けて調べられます。

この記事に関連する株式会社greedenの取り組み

LINE公式アカウントのBotは、Webhookの試作だけでなく、認証情報の管理や本番運用まで見通した設計が欠かせません。株式会社greedenは、外部サービス連携を含むWebシステム開発を、要件整理から保守運用まで支援します。

投稿者 greeden

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)