このページのゴール — 下の3つを
.env に設定し、サーバ再起動後に「テスト送信」が LINE に届けば連携完了です。
# LINE Messaging API
LINE_CHANNEL_SECRET=(手順6でコピー)
LINE_CHANNEL_ACCESS_TOKEN=(手順7でコピー)
LINE_DEFAULT_TO=(最後にボットへ送信して取得)
用語の整理: Channel secret=受信Webhookの
署名検証用 /
Channel access token=こちらから
送信する時のBearer認証用。混同しないこと。
CLI で自動化できる範囲(clasp相当は不可) — LINE には「チャネル/公式アカウントを CLI で新規作成」する公開APIが無く、
作成・認証情報の取得・「Use webhook」トグル・OA応答設定は Webコンソール専用です。一方、
作成後の設定はCLIで自動化できます(本リポジトリの
line_cli.py)。
| 操作 | 方法 |
| Webhook URL 設定 / 確認 / テスト | python line_cli.py setup <https URL>(手順8〜10をまとめて) |
| トークン発行(channel id+secretのみ・無依存) | python line_cli.py issue-token --short-lived --write-env |
| Bot情報の確認 | python line_cli.py bot-info |
| チャネル/OA 作成・secret取得・Use webhook・応答設定 | Webコンソール専用(CLI不可) ↓ 以下の手順 |
第1部チャネルの作成(LINE Developers Console)
送信元となる Messaging API チャネルを作ります。コンソール: developers.line.biz/console
1
ログイン
LINE Developers Console
developers.line.biz/console
LINE Developers
LINE アカウントでログイン
ビジネスアカウントでログイン
LINE アカウントでログイン を選択。初回は開発者登録(開発者名・メール)と Developer Agreement への同意が必要です。
2
プロバイダーの作成
LINE Developers Console
developers.line.biz/console/
LINE Developers
Providers+ Create
例: Tripport Test
Create
Create →「Create a new provider」モーダルで Provider name(例 Tripport Test)を入力して作成。プロバイダー=チャネルをまとめる箱です。
3
Messaging API チャネルを選択
LINE Developers Console
developers.line.biz/console/provider/...
Tripport Test
Create a new channel
これ💬Messaging API
🔑LINE Login
📊LINE MINI App
プロバイダー内で Messaging API タイルを選びます。(環境によっては先に LINE 公式アカウントを作るフローを経由します。指示に従えばOK)
4
チャネル情報を入力 → 作成
LINE Developers Console
developers.line.biz/console/...
New Messaging API channel
例: Tripport Bot
予約通知ボット
you@example.com
利用規約に同意
Create
- Channel name(例
Tripport Bot), Channel description, Category/Subcategory, Email を入力。
- 2つの規約(Official Account Terms / API Terms)にチェック → Create → OK。
第2部認証情報のコピー(→ .env)
作成したチャネルから「秘密鍵(受信検証用)」と「アクセストークン(送信用)」を取得します。
5
Channel secret をコピー
Basic settings タブ
.../channel/.../basic
Tripport Bot
Basic settings
コピーa1b2c3d4e5f6...(32桁hex)⧉ Copy
コピーChannel secret→貼り付け先: .env の LINE_CHANNEL_SECRET
コピーChannel ID→貼り付け先: .env の LINE_CHANNEL_ID(CLIでのトークン発行に使用)
場所: チャネル → Basic settings タブ。同じ画面に Channel secret(32桁の16進・受信Webhookの x-line-signature 検証用)と Channel ID(数字・line_cli.py issue-token でのトークン発行用)が並んでいます。両方コピーします。
6
Channel access token を発行してコピー
Messaging API タブ
.../channel/.../messaging-api
Tripport Bot
Messaging API
Issue→コピー
(空)Issue
Issue を押すと長い文字列のトークンが表示されます
Issue → コピーChannel access token (long-lived)→貼り付け先: .env の LINE_CHANNEL_ACCESS_TOKEN
場所: チャネル → Messaging API タブ → Channel access token (long-lived) の Issue をクリック → 生成された文字列をコピー。こちらから送信する際の Bearer 認証に使います。
⚠ secret(受信検証)と access token(送信認証)は別物です。取り違え注意。
第3部localhost を公開 HTTPS にする(ターミナル)
LINE の Webhook は 公開 HTTPS(CA署名証明書)必須。ローカルの :8000 をトンネルで公開します。
$ brew install ngrok
$ ngrok config add-authtoken <あなたのトークン> # 初回のみ。dashboard.ngrok.com で取得
$ ngrok http 8000
ngrok
Session Status online
Forwarding https://a1b2-xx.ngrok-free.app -> http://localhost:8000
組み立てるhttps://<sub>.ngrok-free.app/api/line/webhook→これが Webhook URL(次の手順でコンソールに貼る)
- Forwarding に出る
https://….ngrok-free.app が公開URL。末尾に 必ずパス /api/line/webhook を付けます。
- URL を固定したい場合: 予約ドメインで
ngrok http --url=<name>.ngrok-free.app 8000。
- 代替(Cloudflare Tunnel):
cloudflared tunnel --url http://localhost:8000 → https://<random>.trycloudflare.com/api/line/webhook。
⚠ このターミナル(ngrok)と バックエンド(:8000)は起動したままにしてください。無料トンネルのURLは再起動で変わります。
第4部Webhook の設定と検証(LINE Developers Console)
8
Webhook URL を設定 → Verify → Use webhook を ON
Messaging API タブ
.../channel/.../messaging-api
Tripport Bot
Webhook settings
https://a1b2-xx.ngrok-free.app/api/line/webhook Edit
Verify✓ Success
- Webhook URL の Edit → 手順7のURLをパス込みで貼り付け → Update。
- Verify を押す → サーバ+トンネルが起動していれば Success(=到達OK)。
- その下の Use webhook トグルを ON に(URL設定とは別操作。OFFだと配信されません)。
Verify は到達性のみの確認です。署名検証や応答ロジックの正しさは保証しません(それは第6部のテストで確認)。
署名検証について: LINE_CHANNEL_SECRET 未設定の間は検証をスキップするので、設定途中でも Verify は通ります。secret を .env に入れてサーバを再起動すると署名検証が有効化され、不正な署名は 400 で弾かれます。
CLIで一括: この手順8(URL設定→Verify相当のtest→activeチェック)は python line_cli.py setup https://<sub>.ngrok-free.app/api/line/webhook でまとめて実行できます(要 LINE_CHANNEL_ACCESS_TOKEN)。ただし Use webhook トグルのON だけはAPI不可なので、下の手順で手動ONにしてください。
第5部応答設定(LINE Official Account Manager)
LINEの自動応答とボットの二重返信を防ぎ、Webhook を有効化します。manager.line.biz
9
応答設定を Bot モード+Webhook ON+自動応答/あいさつ OFF
LINE Official Account Manager
manager.line.biz/account/.../settings/response
設定 › 応答設定
チャット
選択Bot
あいさつメッセージ
応答メッセージ(自動応答)
Webhook
場所: manager.line.biz → 同じLINEアカウントでログイン → 対象アカウント → 右上 設定(歯車) → 応答設定。
- 応答モード → Bot(チャットではなく)
- Webhook → ON(第4部のトグルと同期)
- 応答メッセージ(自動応答) → OFF(ONだとLINEの自動返信とボットが二重に返す)
- あいさつメッセージ → OFF(あいさつは Webhook の
follow イベント側で処理)
第6部友だち追加 → 送信先IDの取得 → 動作確認
10
QRコードでボットを友だち追加
Messaging API タブ / OA Manager
.../messaging-api
Tripport Bot
Bot information
友だち追加用 QRコード
スマホのLINE → ホーム → 友だち追加 → QRコード でスキャンして追加。これでDMを送ると Webhook にイベントが届きます。
11
送信先ID(LINE_DEFAULT_TO)を取得
ボット宛に送信 → 管理API
追加したボットに何かメッセージを送ると、サーバが source.userId を捕捉して line_state.json に保存します。エコー(受信しました: …)が返れば受信成功。
# 直近に捕捉した送信先IDを取得
$ curl -s localhost:8000/api/admin/line/source
{"line_last_source_id":"U1234567890abcdef..."}
コピーline_last_source_id→貼り付け先: .env の LINE_DEFAULT_TO
取得した値を .env の LINE_DEFAULT_TO= に設定 → サーバを再起動。
$ curl -s -X POST localhost:8000/api/admin/line/test \
-H 'Content-Type: application/json' -d '{"text":"連携テスト"}'
{"ok":true,"to":"U1234..."}
LINE に 「連携テスト」が届けば連携完了です 🎉 以降、予約取り込み時の通知(要確認アラート等)が Slack と同じ内容で LINE にも届きます。
設定状況はいつでも GET /api/admin/line/status で確認できます(トークン/secret/宛先の有無、直近の送信先ID)。
第7部(任意)LIFF — LINE内で承認・修正フローを完結
LINE内にWebビューを開き、承認モーダル(ツアー名/日付/時刻/人数/代表者の修正・再判定・承認/却下・クラスタまとめ承認)をそのまま操作できます。IDトークンで管理者認証。
13
LIFFアプリを追加
Messaging API チャネル → LIFF タブ
.../channel/.../liff
Tripport Bot — LIFF
+ Add
https://<公開URL>/liff
必須☑ openid ☑ profile
- チャネル → LIFF タブ → Add。
- Endpoint URL:
https://<ngrok/cloudflareの公開URL>/liff(手順7の公開URL+/liff)。
- Size: Full。Scopes: openid(必須・IDトークン取得用)+ profile。
- 追加後に発行される LIFF ID をコピー。
コピーLIFF ID→貼り付け先: .env の LINE_LIFF_ID
コピーChannel ID(手順5)→貼り付け先: .env の LINE_LOGIN_CHANNEL_ID(IDトークン検証用。Messaging APIチャネルのChannel IDと同じ)
.env に LINE_LIFF_ID / LINE_LOGIN_CHANNEL_ID を設定してサーバ再起動 → LINEで https://liff.line.me/<LIFF_ID> を開く(自分宛に送ってタップ、またはリッチメニューに設定)。
管理者(LINE_DEFAULT_TO / LINE_ADMIN_IDS)以外が開くと「管理者のみ」表示で操作不可。承認・却下・修正・再判定・クラスタまとめ承認はすべて既存のウェブと同じロジックを呼びます。
仕上げ最終的な .env
# LINE Messaging API(必須)
LINE_CHANNEL_SECRET=a1b2c3d4e5f6...(手順5)
LINE_CHANNEL_ACCESS_TOKEN=eyJhbGci...(手順6)
LINE_DEFAULT_TO=U1234567890...(手順11/管理者にも自動採用)
LINE_CHANNEL_ID=1234567890(手順5・CLIのトークン発行/LIFF検証用)
# 任意
LINE_ADMIN_IDS=追加の管理者userId(カンマ区切り)
LINE_LIFF_ID=(手順13・LIFFを使う場合)
LINE_LOGIN_CHANNEL_ID=Channel IDと同じ(LIFFを使う場合)
3つを設定して再起動すれば、Webhook受信(署名検証つき)と通知送信の両方が有効になります。
付録Aよくあるハマりどころ
- Webhook は HTTPS + CA署名証明書必須。http や自己署名は不可 → ngrok / Cloudflare を使う。
- Use webhook トグルは URL 設定とは別操作。両方必要。
- 応答メッセージ / あいさつを OFF にしないと自動応答とボットが二重返信。応答モードは Bot。
- Verify は到達性のみ確認(=動作保証ではない)。実動作は
/api/admin/line/test で確認。
- Channel access token(送信)と Channel secret(受信検証)を取り違えない。
- 無料トンネルのURLは再起動で変わる → 変えたら LINE コンソールの Webhook URL も更新。予約ドメイン/名前付きトンネルで固定可。
- Verify の前にサーバ(:8000)とトンネルを起動しておく。
- Webhook URL は必ずパス込み(
/api/line/webhook)。ドメインだけはNG。
付録B早見表
| 取得するもの | 場所 | 操作 / フィールド | 貼り付け先 |
| Channel secret | Developers Console → Basic settings | Channel secret をコピー | .env: LINE_CHANNEL_SECRET |
| Channel access token | Developers Console → Messaging API | Issue → コピー | .env: LINE_CHANNEL_ACCESS_TOKEN |
| 公開HTTPS URL | ローカル端末 | ngrok http 8000 | LINEコンソール(Webhook URL) |
| Webhook URL | Developers Console → Messaging API | Edit→貼付→Update→Verify→Use webhook ON | — |
| 応答設定 | OA Manager → 応答設定 | Bot / Webhook ON / 自動応答・あいさつ OFF | — |
| 送信先ID | ボットに送信 → GET /api/admin/line/source | line_last_source_id をコピー | .env: LINE_DEFAULT_TO |
| 疎通確認 | POST /api/admin/line/test | LINEに届けばOK | — |