Contents
1. 全体フロー
| ステップ | 実施場所 | 主な作業 |
|---|---|---|
| ① | LINE Official Account Manager | Messaging API の有効化、Webhook 利用設定 |
| ② | LINE Developers コンソール | プロバイダー・チャネル作成、Channel Secret と Access Token の取得 |
| ③ | サーバ側実装 | Webhook エンドポイントの設置、署名検証 (X‑Line‑Signature) |
| ④ | テスト & デプロイ | コンソールの Test Messaging や curl で動作確認 |
2. LINE Official Account Manager で Messaging API を有効化
手順
- https://manager.line.biz/ に管理者権限でログイン
- 対象公式アカウントを選択 → Messaging API タブを開く
- 「API 利用」スイッチを ON し、利用規約に同意
- 同時に「Webhook の利用」も ON(後で URL を登録できるようになる)
ポイント
- 無料プランでも Messaging API は使用可能です。プランごとの送信上限は次節の レートリミット を参照してください。
- Webhook が無効化されていると、LINE からのイベント通知が届きません。
3. LINE Developers コンソールでチャネル情報を取得
3‑1. プロバイダー・チャネル作成
| 手順 | 操作画面 | 必須入力項目 |
|---|---|---|
| 1 | LINE Developers → プロバイダー → 「プロバイダーを追加」 | 組織名、連絡先メール |
| 2 | 作成したプロバイダー内の チャネル作成 > Messaging API | アカウント名、説明、プライバシーポリシー URL、利用規約 URL |
3‑2. 認証情報(Channel Secret・Access Token)取得
| 項目 | 取得方法 | 有効期限・注意点 |
|---|---|---|
| Channel Secret | チャネル作成完了後に表示される文字列をコピー | サーバ側で X‑Line‑Signature 検証に使用。漏洩しないよう環境変数で管理 |
| Access Token(長期) | 「Messaging API」タブ → アクセストークン(長期)を発行 ボタン | 公式には「期限は無制限」と記載されていますが、LINE 側で手動失効やポリシー変更が行われた場合に無効化される可能性があります。定期的にステータスを確認し、必要に応じて再発行してください |
公式ドキュメント(2024‑04): https://developers.line.biz/ja/docs/messaging-api/getting-started/
※ 本稿では非公式サイト(例:Ligla)のリンクは削除し、すべて公式情報に置き換えました。
4. Webhook URL の設定と署名検証
4‑1. Webhook URL 登録手順
- 上記で取得した
Channel SecretとAccess Tokenをサーバ環境変数(例:LINE_CHANNEL_SECRET,LINE_ACCESS_TOKEN)に設定 - HTTPS が必須なので、ローカルテスト時は ngrok などでトンネルを作成し、公開 URL を取得
- LINE Developers コンソールの Messaging API > Webhook 設定 に HTTPS URL を入力し「Webhook の利用」を ON
- 「検証」ボタンで
200 OKが返れば設定完了
4‑2. 署名検証実装例(Node.js / Express)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// webhook.js require('dotenv').config(); const express = require('express'); const line = require('@line/bot-sdk'); const config = { channelAccessToken: process.env.LINE_ACCESS_TOKEN, channelSecret: process.env.LINE_CHANNEL_SECRET, }; const app = express(); // SDK が自動で X-Line-Signature の検証と JSON パースを行う app.post('/webhook', line.middleware(config), async (req, res) => { try { const results = await Promise.all(req.body.events.map(handleEvent)); res.json(results); } catch (e) { console.error(e); res.status(500).end(); } }); async function handleEvent(event) { if (event.type !== 'message' || event.message.type !== 'text') return null; const client = new line.Client(config); return client.replyMessage(event.replyToken, { type: 'text', text: `受け取りました: ${event.message.text}`, }); } app.listen(3000, () => console.log('Webhook listening on :3000')); |
4‑3. Python (Flask) 実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# webhook.py import os from flask import Flask, request, abort from linebot import LineBotApi, WebhookHandler from linebot.exceptions import InvalidSignatureError from linebot.models import MessageEvent, TextMessage, TextSendMessage app = Flask(__name__) line_bot_api = LineBotApi(os.getenv('LINE_ACCESS_TOKEN')) handler = WebhookHandler(os.getenv('LINE_CHANNEL_SECRET')) @app.route("/webhook", methods=['POST']) def webhook(): signature = request.headers.get('X-Line-Signature') body = request.get_data(as_text=True) try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return 'OK' @handler.add(MessageEvent, message=TextMessage) def handle_message(event): reply = f"受け取りました: {event.message.text}" line_bot_api.reply_message( event.reply_token, TextSendMessage(text=reply) ) if __name__ == "__main__": app.run(port=3000) |
重要:
X‑Line‑Signatureが検証に失敗した場合は 400 を返し、LINE 側で再送が行われます。
5. メッセージ送信 API とイベントハンドリング
5‑1. 基本的な送信メソッド(各言語)
| 言語 | Push(任意タイミング) | Reply(受信直後) |
|---|---|---|
| Node.js | client.pushMessage(userId, {type:'text', text:'こんにちは'}) |
client.replyMessage(replyToken, {type:'text', text:'ありがとう'}) |
| Python | line_bot_api.push_message(to, TextSendMessage(text='こんにちは')) |
line_bot_api.reply_message(event.reply_token, TextSendMessage(text='ありがとう')) |
| Java* | botClient.pushMessage(new PushMessage(userId, new TextMessage("こんにちは"))); |
botClient.replyMessage(new ReplyMessage(replyToken, new TextMessage("ありがとう"))); |
*Java 用 SDK は公式リポジトリ(line-bot-sdk-java)をご参照ください。
5‑2. 主なイベント例とハンドリングフロー
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "events": [ { "type": "message", "replyToken": "xxxxxxxxxxxxxxx", "source": { "userId":"U1234567890", "type":"user" }, "timestamp":1620000000000, "message": {"id":"123456","type":"text","text":"こんにちは"} }, { "type": "follow", "replyToken": "yyyyyyyyyyyyyyy", "source": { "userId":"U0987654321", "type":"user" }, "timestamp":1620000012345 } ] } |
|
1 2 3 4 5 6 |
for each event in request.body.events: if event.type == 'message' → handleMessage(event) else if event.type == 'follow' → handleFollow(event) else if event.type == 'postback' → handlePostback(event) else log('Unsupported event') |
6. テスト手法とエラーハンドリング
6‑1. コンソールの Test Messaging と curl の併用
| 方法 | 特徴 |
|---|---|
| Console Test Messaging(公式 UI) | 実ユーザーに送信せず、シミュレーション結果が JSON で確認できる。 |
| curl | 任意の HTTP クライアントから Push API を直接叩き、リクエストヘッダーやステータスコードを自分で検証できる。 |
|
1 2 3 4 5 6 7 8 |
curl -v -X POST https://api.line.me/v2/bot/message/push \ -H "Authorization: Bearer ${LINE_ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "to":"Uxxxxxxxxxxxxxx", "messages":[{"type":"text","text":"テスト送信"}] }' |
6‑2. レートリミットと再試行戦略
| プラン | 秒間リクエスト上限 | 日次メッセージ上限 |
|---|---|---|
| Free | 30 リクエスト/秒 | 約 5,000 通/日(公式ドキュメントで最新値を確認) |
| Pro | 30 リクエスト/秒 | 約 100,000 通/日(同上) |
注意:プランごとの上限は公式ページ https://developers.line.biz/ja/docs/messaging-api/overview/ に随時掲載されています。実装前に必ず最新情報を確認してください。
推奨再試行ロジック(指数バックオフ + jitter)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
async function pushWithRetry(to, message, attempt = 0) { const MAX_ATTEMPTS = 5; try { await client.pushMessage(to, message); } catch (err) { if (err.statusCode === 429 && attempt < MAX_ATTEMPTS) { const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500; // ms console.warn(`Rate limit hit. Retry after ${delay}ms`); await new Promise(r => setTimeout(r, delay)); return pushWithRetry(to, message, attempt + 1); } throw err; } } |
7. 実務でよく使われるユースケース
| ユースケース | 主な API / メッセージタイプ | 実装上のポイント |
|---|---|---|
| FAQ ボット(自動返信) | replyMessage + テキスト/リッチメニュー |
キーワード → DB 検索(例:Firestore)で即時応答。スロットリングは必須 |
| 顧客情報連携 | pushMessage + ユーザー ID 取得 (event.source.userId) |
LINE Login は廃止済みなので、アカウントリンク APIで自社会員と紐付け。取得した ID を CRM に保存 |
| キャンペーン配信 | pushMessage + テンプレート(Buttons, Carousel) |
1 日上限に注意し、対象ユーザーは事前にフィルタリング。失敗時はステータスコードで除外リストへ追加 |
8. まとめ
| 項目 | 内容 |
|---|---|
| 設定 | Official Account Manager → Messaging API 有効化 LINE Developers → プロバイダー/チャネル作成、 Channel Secret と Access Token の取得 |
| Webhook | HTTPS URL を登録し、SDK が提供するミドルウェアで署名検証を実装 |
| テスト | コンソールの Test Messaging + curl で送受信確認 |
| レートリミット | プラン別に上限が異なる(公式ドキュメント参照) |
| エラーハンドリング | 429 エラーは指数バックオフ+ジッターで再試行 |
| 実務活用例 | FAQ ボット、顧客情報連携、キャンペーン配信など |
最終的な注意点
- 長期 Access Token は「基本的に無期限」ですが、LINE 側の手動失効やポリシー変更で無効になることがあります。定期的にトークンステータスを確認し、必要なら再発行してください。
- すべての数値(レートリミット・日次上限)は公式ドキュメントが最新情報です。実装前に必ずリンク先で確認しましょう。
本稿は 2024 年 4 月現在の情報を元に執筆しています。今後の仕様変更や新機能追加については、LINE Developers のリリースノートをご参照ください。