この記事で扱う『LINE公式アプリ』は、LINE公式アカウントにMessaging APIを接続し、利用者から届いたメッセージへプログラムで応答するBotです。
スマートフォンへインストールする一般的なアプリを作る手順ではありません。
LINE公式アカウントの準備からWebhookの公開、Node.jsによる返信処理、動作確認までを順に進めます。
Botが返信するまでの流れ
Messaging APIは、LINE公式アカウントと外部のプログラムを接続するための仕組みです。
Webhookは、メッセージの受信や友だち追加などの出来事を、LINEプラットフォームからBotサーバーへHTTP POSTリクエストで通知する仕組みです。
- 利用者がLINE公式アカウントへメッセージを送ります。
- LINEプラットフォームが、登録済みのWebhook URLへイベントを送ります。
- Botサーバーがイベントを確認し、返信内容を決めます。
- 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チャネルを直接新規作成する手順ではありません。
- LINE公式アカウントを用意します。
- LINE Official Account Managerで対象アカウントを開き、Messaging APIの利用を有効にします。
- 画面の案内に沿って、この公式アカウントを管理するプロバイダーを選びます。
- 同じアカウントで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を登録する
- ngrokなどのトンネルサービスを使い、ローカルの3000番ポートへ転送するHTTPS URLを発行します。
- 発行されたURLの末尾に
/webhookを付けます。 - LINE Developersコンソールで対象チャネルを開き、Messaging API設定のWebhook URLへ入力します。
- 検証を実行し、Botサーバーへ到達できることを確認します。
- Webhookの利用を有効にします。
Webhook URLには、外部から到達できるHTTPSのエンドポイントが必要です。
トンネルサービスのURLが変わった場合は、LINE Developersコンソール側のURLも更新します。
6.友だち追加して返信を確認する
- Messaging API設定に表示されるQRコードから、対象のLINE公式アカウントを友だち追加します。
- 任意のテキストメッセージを送ります。
- 『受信したメッセージ:送信内容』と返信されることを確認します。
- 返信がない場合は、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システム開発を、要件整理から保守運用まで支援します。
