01 版主使用教學
適用對象:想用「反詐小幫手」保護自己 LINE 群組的版主。全程約 15~20 分鐘,不需要寫程式。 LINE 介面名稱依 LINE Developers 官方文件(2026 年 11 月查證): Get started with the Messaging API、 Build a bot、 Group chats。 LINE Developers Console 以英文介面為準;LINE Official Account Manager 顯示語言可能是中文,請對照說明操作。
先了解:能做什麼、不能做什麼
| 可以 | 不行(LINE 官方 API 限制) |
|---|---|
| 讀取群組訊息,判斷詐騙話術、黑名單網址、冒充群主、圖片裡的 LINE 邀請 QR 碼 | 不能把人踢出群組,需要你手動移除 |
| 在群組回覆警示,提醒成員不要上當 | 不能加入 LINE 社群(OpenChat),只能用在一般群組/多人聊天 |
| 私訊通知你:發送者、內容摘要、原因 | 不能收回或刪除別人的訊息 |
| 後台查看事件紀錄、統計圖 | 一個群組同時只能有一個官方帳號 |
群組內「回覆」訊息不算 LINE 的訊息則數;「私訊通知版主」用的是 push 訊息,會計入你官方帳號方案的每月訊息額度,請留意方案上限。
步驟 1:在反詐小幫手申請帳號
- 打開平台首頁,按 免費申請。
- 填寫名稱(例如社區名稱)、Email、密碼(至少 8 碼),按 建立帳號。
- 自動進入 連接 LINE 頁,你會看到專屬的 Webhook URL(格式
https://<平台網址>/webhook/t_xxxxxxxx)和 通知綁定代碼。先把這頁開著。
步驟 2:建立 LINE 官方帳號
每位版主要用自己的 LINE 官方帳號;已經有官方帳號的人可跳到步驟 3。
- 依 LINE 官方文件 Step 1-1,先註冊 Business ID(可用 LINE 帳號或 Email 註冊)。
- 註冊完會出現 LINE 官方帳號的申請表單(entry form),填完必填欄位送出,官方帳號就建立了。
- 到 LINE Official Account Manager 確認帳號已建立。
步驟 3:啟用 Messaging API(建立 channel)
自 2024 年 9 月 4 日起,已不能直接在 LINE Developers Console 建立 Messaging API channel,必須從 LINE Official Account Manager 啟用。
- 在 LINE Official Account Manager 打開你的官方帳號,進入設定中的 Messaging API 項目,按啟用 Messaging API。
- 第一次使用時會要求登錄開發者資料(姓名、Email)。
- 選擇 Provider(提供者)。可以新建一個,例如「我的社區」。 ⚠️ 官方文件提醒:選定後無法更改,也不同 provider 下同一使用者的 userId 會不同,請謹慎選擇。
- 用同一個帳號登入 LINE Developers Console,點進剛剛的 provider,確認已出現一個 Messaging API channel。
步驟 4:取得 Channel secret 與 Channel access token
- 在 LINE Developers Console 點進你的 channel。
- Channel secret:在 Basic settings 分頁,找到 Channel secret,複製。
- Channel access token:切到 Messaging API 分頁,捲到最下面 Channel access token,按 Issue 發行一組 long-lived(長效)token,複製。
- 長效 token 不會過期,但重新發行時舊的會失效,需要回到反詐小幫手重新貼上。
- 回到反詐小幫手的 連接 LINE 頁,把兩個值分別貼上,按 儲存並測試連線。
- 看到綠色「已儲存並成功連線到官方帳號『○○』」就代表 token 正確。
🔒 這兩組資料等同官方帳號的鑰匙,平台會加密保存。若懷疑外流,請在 LINE Developers Console 重新發行並更新到這裡。
步驟 5:設定 Webhook URL
依官方文件「Set a webhook URL」:
- LINE Developers Console → 你的 provider → 你的 Messaging API channel。
- 點 Messaging API 分頁。
- 在 Webhook URL 下按 Edit,貼上反詐小幫手給你的 Webhook URL,按 Update。
- 按 Verify,看到 Success 就成功了。
- 失敗時:確認 Channel secret 有貼對(簽章錯誤會回 401),以及網址完整沒多空白。
- 開啟 Use webhook。
步驟 6:讓機器人可以進群組、關閉自動回應
- 同一個 Messaging API 分頁,找到 Allow bot to join group chats,按 Edit 會帶你到 LINE Official Account Manager,改成允許(預設是關閉的)。
- Auto-reply messages(自動回應訊息):官方文件建議用 Messaging API 時改成 Disabled,到 LINE Official Account Manager 的回應設定中關閉,避免官方帳號在群組裡亂回話。
- Greeting messages(加入好友的歡迎訊息):可保留或關閉,不影響防詐。
步驟 7:綁定自己為通知對象
- 用你自己的 LINE 加官方帳號好友(在 Messaging API 分頁可以掃 QR code 加好友)。
- 私訊官方帳號:
綁定 ABC123(換成 連接 LINE 頁上顯示的代碼)。 - 收到「✅ 綁定成功」就完成了。想查自己的 userId,私訊
我的ID。 - 也可以讓其他管理員一起綁定,或在 設定 → 通知 手動貼 userId。
步驟 8:邀請官方帳號進群組
- 打開要保護的 LINE 群組 → 右上角選單 → 邀請,選你的官方帳號。
- 官方帳號加入後會發一則招呼訊息,後台 群組 頁會自動出現這個群組。
- 不想守護某個群組時,在 群組 頁按「守護中 ✓」切換成「已關閉」。
步驟 9:設定群主保護(強烈建議)
到 設定 → 群主保護與白名單 → 受保護的名字,每行一位:
好鄰居社群 Kevin,U1234567890abcdef...
副版主小美,U9876...
有人把暱稱改成和群主幾乎一樣、但 userId 不同時,系統會判定冒名。userId 可私訊官方帳號 我的ID 取得。
步驟 10:測試
找一位同事在群組貼以下文字(都是假訊息):
| 測試訊息 | 預期 |
|---|---|
今晚 7 點社區開會 |
不處理 |
老師帶單保證獲利,加我賴 ID: test123 |
群組出現警示,你收到私訊通知 |
本群即將解散,請大家移至新群 |
判定詐騙(群組搬家) |
| 一張 LINE 群組邀請 QR 碼的圖片 | 判定詐騙(圖片含 LINE 邀請 QR) |
| 同事把暱稱改成跟你一樣再發言 | 判定冒名 |
到後台 事件紀錄 可以看到每一筆。
收到通知後怎麼處理
- 到 LINE 群組 → 成員列表 → 找到該成員 → 刪除(移出群組)。
- 回後台 事件紀錄,把狀態改成「已移除成員」。
- 若是誤判:改成「誤判」,並把該成員 userId 加到 白名單,或把常用字詞加到 允許字詞。
常見問題
- Verify 失敗? 先確認已在步驟 4 儲存正確的 Channel secret;若平台被暫停,Webhook 也會回 200 但不處理。
- 官方帳號沒反應? 檢查 Use webhook 是否開啟、群組是否「守護中」、本月額度是否用完(儀表板可看)。
- 可以用在 LINE 社群嗎? 不行,這是 LINE 官方 API 的限制。
- 可以自動踢人嗎? 不行,官方 API 沒有踢人功能,請手動移除。
02 安裝部署(給技術長)
系統需求
| 項目 | 需求 |
|---|---|
| Node.js | 22.5 以上(使用內建 node:sqlite,不需編譯原生模組;開發測試版本 24.22.1) |
| 資料庫 | SQLite(單一檔案,預設 data/guard.db,WAL 模式) |
| 對外網址 | 必須 HTTPS,憑證需由一般瀏覽器信任的 CA 簽發,不可用自簽憑證(LINE 官方規定) |
| 記憶體 | 256 MB 起跳;圖片 QR 解碼會短暫用到較多記憶體 |
| 對外連線 | api.line.me、api-data.line.me(443);若啟用 AI 判斷,需連到 LLM 端點 |
安裝
git clone <repo> /opt/line-guard-saas # 或直接複製 /workspace/line-guard-saas
cd /opt/line-guard-saas
npm ci --omit=dev
npm run docs # 產生 public/docs.html(說明頁 /docs)
cp .env.example .env # 編輯環境變數
環境變數
| 變數 | 必填 | 說明 |
|---|---|---|
PORT |
監聽埠,預設 3100 |
|
HOST |
監聽位址,預設 127.0.0.1(交給反向代理) |
|
PUBLIC_BASE_URL |
✅ | 對外網址,例如 https://guard.task.com.tw。用來產生版主的 Webhook URL,https:// 開頭時 cookie 會加 Secure |
APP_SECRET |
✅ | 32 字元以上亂數,用來 AES-256-GCM 加密 Channel secret/token。設定後不可更換,否則既有憑證無法解密 |
DB_FILE |
SQLite 路徑,預設 data/guard.db |
|
SUPERADMIN_EMAIL / SUPERADMIN_PASSWORD |
✅ | 平台管理後台 /admin 的登入帳密 |
PLATFORM_API_TOKEN |
管理王後台呼叫 /api/platform/* 用的 Bearer token;不設則平台 API 全部拒絕 |
|
ALLOW_SIGNUP |
設 0 關閉自助申請(改由平台 API 建立帳號) |
|
DEFAULT_QUOTA_MSGS / DEFAULT_QUOTA_LLM |
新版主每月預設額度,預設 5000 / 500 | |
LLM_BASE_URL / LLM_API_KEY / LLM_MODEL |
平台預設 AI(OpenAI 相容);版主可在設定頁覆寫 | |
SMTP_URL / MAIL_FROM |
選用 Email 通知,例如 smtps://user:pass@smtp.gmail.com:465 |
|
WEBHOOK_SYNC |
1 時 webhook 處理完才回應(僅供測試);正式環境不要設 |
產生密鑰:node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
HTTPS 反向代理(Nginx 範例)
server {
listen 443 ssl http2;
server_name guard.task.com.tw;
ssl_certificate /etc/letsencrypt/live/guard.task.com.tw/fullchain.pem; # 需完整憑證鏈
ssl_certificate_key /etc/letsencrypt/live/guard.task.com.tw/privkey.pem;
client_max_body_size 2m;
location / {
proxy_pass http://127.0.0.1:3100;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
LINE 官方提醒:若 Verify 出現 SSL 錯誤,多半是中繼憑證沒裝完整,請用
fullchain.pem。 也可用 Caddy:guard.task.com.tw { reverse_proxy 127.0.0.1:3100 }(自動申請憑證)。
程序管理
systemd
# /etc/systemd/system/line-guard.service
[Unit]
Description=LINE Guard SaaS
After=network.target
[Service]
WorkingDirectory=/opt/line-guard-saas
EnvironmentFile=/opt/line-guard-saas/.env
ExecStart=/usr/bin/node src/server.js
Restart=always
User=lineguard
[Install]
WantedBy=multi-user.target
systemctl enable --now line-guard && journalctl -u line-guard -f
或 PM2
pm2 start src/server.js --name line-guard --node-args="--env-file=.env" && pm2 save
健康檢查:GET /healthz → {"ok":true}
備份
SQLite 是單一檔案,用線上備份指令(不需停機):
# 每日 03:00 備份,保留 30 天(crontab)
0 3 * * * sqlite3 /opt/line-guard-saas/data/guard.db ".backup '/backup/guard-$(date +\%F).db'" && find /backup -name 'guard-*.db' -mtime +30 -delete
APP_SECRET要和資料庫分開保存(例如密碼管理器),兩者都要有才能還原。- 還原:停服務 → 把備份檔複製成
data/guard.db→ 啟動。
部署到管理王
- 這是需要常駐的 Node 服務,不能只放在
task.com.tw/preview/靜態目錄;建議子網域guard.task.com.tw指向這台主機。 /docs說明頁(public/docs.html)是單一靜態檔,可另外放到task.com.tw/preview/line-guard-docs.html。
擴充與注意事項
- 目前為單機 SQLite,適合數百位版主、每秒數十則訊息。量大時可換 PostgreSQL(
src/db.js集中所有 SQL)。 - Webhook 先回 200 再處理;服務重啟瞬間的事件可能遺失。可在 LINE Developers Console 開啟 webhook redelivery:系統會依
webhookEventId去重(同一租戶同一事件只處理一次,紀錄保留 7 天),不會重複通知。 - 登入保護:同一帳號 15 分鐘內連續失敗 5 次、或同一 IP 失敗 20 次,鎖定 15 分鐘(平台管理員登入同樣適用);同一 IP 每小時最多申請 5 個帳號。紀錄存在 SQLite,重啟後仍有效。
- 版主在設定頁自訂的 AI 端點必須是
https://,且不能指向內網或本機位址(避免被拿來存取主機內部服務);平台環境變數LLM_BASE_URL不受此限制。 - 執行測試:
npm i && npm test(含模擬 LINE 平台的兩租戶 e2e)。
03 設定說明
所有設定都在版主後台,依頁面說明。
連接 LINE(/app/setup)
| 欄位 | 說明 |
|---|---|
| Webhook URL | 系統產生、每位版主唯一:<平台網址>/webhook/<租戶ID>。貼到 LINE Developers Console → Messaging API 分頁 → Webhook URL |
| Channel secret | LINE Developers Console → Basic settings 分頁。用來驗證 webhook 簽章(x-line-signature),簽章不符一律拒絕(401) |
| Channel access token | Messaging API 分頁最下方發行的 long-lived token,用來回覆、私訊、讀取成員名稱與圖片。儲存時會呼叫 LINE GET /v2/bot/info 測試 |
| 通知綁定代碼 | 6 碼代碼。用自己的 LINE 私訊官方帳號「綁定 代碼」即可把自己加入通知名單 |
留空表示不變更。兩者皆以 AES-256-GCM 加密存放。
群組(/app/groups)
官方帳號被邀請進群組(join 事件)時自動新增,被移出(leave 事件)時標成「已離開」。
守護 開關:關閉後該群組的訊息不檢查、不計額度。
設定(/app/settings)
偵測
| 設定 | 說明 | 預設 |
|---|---|---|
| 靈敏度 | 規則分數達門檻即判定詐騙。低 = 7 分、中 = 5 分、高 = 3 分。2 分以上未達門檻屬「可疑」,可交給 AI | 中 |
| 自訂封鎖關鍵字 | 每行一個,訊息包含任一個 +5 分 | 空 |
| 允許字詞 | 訊息含這些字就整則放行(冒名檢查仍會做)。適合放管委會公告、固定宣導用語 | 空 |
| 網址黑名單 | 每行一個網域,含所有子網域(evil.com 會擋 a.evil.com),命中 +10 分 |
空 |
| 解讀圖片 QR 碼 | 下載群組圖片,在本機解出 QR 碼(不外傳),若是 LINE 群組/好友/官方帳號邀請連結 +10 分;其他內容再跑一次文字規則 | 開 |
內建規則與分數(同一類只算一次):
| 規則 | 分數 | 例子 |
|---|---|---|
| LINE 邀請/加好友 | 3 | line.me/ti/、lin.ee/、加我賴、LINE ID: |
| 短網址 | 3 | bit.ly、reurl.cc、lihi |
| 網址 | 1 | 任何 http(s) 連結 |
| 投資帶單 | 2 | 飆股、帶單、保證獲利、USDT |
| 兼職刷單 | 2 | 日結、刷單、在家賺 |
| 私下聯繫 | 2 | 私我、加我、私下聯繫 |
| 貸款博弈 | 2 | 免審、娛樂城、百家樂 |
| 群組搬家 | 6 | 移至新群、舊群解散、備用群 |
| 中獎客服 | 2 | 恭喜中獎、解除分期、帳戶異常 |
群主保護與白名單
| 設定 | 說明 |
|---|---|
| 受保護的名字 | 每行 顯示名稱,userId。發言者或新加入成員的顯示名稱與之相同或極相似(去除空白符號後完全相同、包含原名、或長名字差 1 字),且 userId 不同 → 判定「冒名」(+10 分)。userId 留空時,任何人用這名字都算冒名,建議填上 |
| 白名單成員 userId | 這些人的訊息完全不檢查 |
AI 判斷(選用)
| 設定 | 說明 |
|---|---|
| 啟用 | 只有「可疑」(2 分以上、未達門檻)的文字訊息會送 AI;AI 回 SCAM → 判定詐騙,OK → 放行,UNSURE → 不處理 |
| API 端點 / 金鑰 / 模型 | OpenAI 相容的 /chat/completions。留空用平台預設(LLM_* 環境變數)。每次呼叫扣 1 次 AI 額度 |
通知
| 設定 | 說明 |
|---|---|
| 在群組回覆警示 | 用 LINE reply(不計訊息則數)在群組回覆警示範本 |
| 私訊通知對象 | LINE userId 清單,以 push 送出(計入官方帳號每月訊息額度)。對方必須已加官方帳號好友 |
| Email 通知 | 選用,平台需設定 SMTP_URL |
訊息範本
可用變數:{name} 發送者顯示名稱、{userId}、{group} 群組名稱、{reasons} 判定原因、{excerpt} 內容摘要(120 字)、{score} 分數。
| 範本 | 用途 |
|---|---|
| 群組警示 | 判定詐騙時在群組回覆 |
| 私訊版主 | 推播給通知對象 |
| 加入群組時的招呼 | 官方帳號被邀進群組時發送;清空則不發 |
事件紀錄(/app/incidents)
每筆記錄時間、群組、發送者與 userId、類型(文字/圖片/冒名/LINE 邀請 QR)、內容、原因、已執行動作、狀態(待處理/已移除成員/誤判)。可匯出 CSV(UTF-8 BOM,Excel 可直接開)。
額度
| 項目 | 計算方式 | 用完時 |
|---|---|---|
| 訊息額度 | 每則進入守護中群組的訊息 +1(每月重算) | 停止檢查,直到下月或平台調高 |
| AI 額度 | 每次呼叫 AI +1 | 只用規則判斷 |
額度由平台管理員在 /admin 調整。
平台管理(/admin)
平台管理員(SUPERADMIN_EMAIL)可看所有版主、官方帳號連接狀態、群組數、本月用量、事件數,並可 暫停/恢復(暫停後 webhook 回 200 但不處理)與調整每位版主的 訊息/AI 額度。
04 API 串接
一、LINE Webhook(LINE → 本系統)
POST /webhook/{tenantId}
Header: x-line-signature: base64(HMAC-SHA256(channelSecret, 原始 request body))
- 每位版主一個網址;以該版主的 Channel secret 驗證簽章,不符回 401;未知租戶回 404;暫停的租戶回 200 但不處理。
- 立即回
200 {"ok":true},再非同步處理事件。 - 處理的事件類型(LINE 官方格式,參考 Messaging API reference – Webhook events):
| 事件 | 處理 |
|---|---|
join |
新增群組、取群組名稱(GET /v2/bot/group/{groupId}/summary)、回覆招呼 |
leave |
標記群組已離開 |
memberJoined |
檢查新成員是否冒名 |
message(group/room,text) |
規則+黑名單網址+冒名+(選用)AI |
message(group/room,image) |
下載內容(GET api-data.line.me/v2/bot/message/{id}/content)解 QR |
message(1 對 1,text) |
綁定 代碼、我的ID 指令 |
範例 payload:
{
"destination": "Uxxxxxxxx",
"events": [{
"type": "message", "mode": "active", "timestamp": 1730700000000,
"webhookEventId": "01H...", "deliveryContext": { "isRedelivery": false },
"replyToken": "b60d4...",
"source": { "type": "group", "groupId": "Ca56f9...", "userId": "U4af49..." },
"message": { "id": "468789577898262530", "type": "text", "text": "老師帶單保證獲利" }
}]
}
本系統呼叫的 LINE API:reply、push、GET /v2/bot/info、群組摘要、群組成員資料、訊息內容。不使用任何非官方 API,也不呼叫踢人(官方沒有此 API)。
二、版主 REST API(管理王 ↔ 本系統,單一版主)
- Base:
{PUBLIC_BASE_URL}/api/v1 - 認證:
Authorization: Bearer lgk_...(版主後台「API 串接」頁取得,可重新產生) - 格式:JSON;錯誤
{"error": "..."},401 = 金鑰錯誤
| 方法 | 路徑 | 說明 |
|---|---|---|
| GET | /me |
版主資料、Webhook URL、額度、本月用量 |
| GET | /groups |
群組清單 [{groupId,name,enabled,active,joinedAt}] |
| PATCH | /groups/{groupId} |
{"enabled": false} 開關守護 |
| GET | /incidents?limit=50&offset=0&status=open&groupId= |
事件列表(limit 上限 500) |
| PATCH | /incidents/{id} |
{"status": "handled" | "open" | "false_positive"} |
| GET | /stats?days=14 |
{usage, quota, daily:[{day,msgs,flagged}]} |
| GET | /settings |
設定(AI 金鑰遮罩) |
| PATCH | /settings |
部分更新,欄位同 03 設定說明:sensitivity, blocklist, allowlist, whitelistUserIds, protectedNames, urlBlacklist, qrEnabled, replyInGroup, notify, templates, llm |
| POST | /check |
試算:{"text":"...","displayName":"","userId":""} → {score,reasons,verdict,impersonating},不寫紀錄、不扣額度 |
curl -H "Authorization: Bearer lgk_xxx" https://guard.task.com.tw/api/v1/incidents?status=open
curl -X PATCH -H "Authorization: Bearer lgk_xxx" -H "content-type: application/json" \
-d '{"sensitivity":"high","blocklist":["代購"]}' https://guard.task.com.tw/api/v1/settings
事件物件:
{ "id": 12, "tenant_id": "t_ab12...", "group_id": "Ca56...", "group_name": "好鄰居社區",
"user_id": "U4af...", "display_name": "投資小美", "kind": "text",
"text": "老師帶單保證獲利…", "score": 7, "reasons": ["LINE 邀請/加好友","投資帶單"],
"verdict": "scam", "actions": ["group_warning","admin_push"], "status": "open",
"created_at": "2026-11-04 06:30:00" }
created_at 為 UTC。kind:text、image、impersonation、qr_invite。actions:group_warning、admin_push、admin_email,失敗時帶 _failed。
三、平台 API(管理王後台 ↔ 本系統,所有版主)
- 認證:
Authorization: Bearer {PLATFORM_API_TOKEN}(環境變數;未設定則全部 401)
| 方法 | 路徑 | 說明 |
|---|---|---|
| GET | /api/platform/tenants |
所有版主+用量、群組數、事件數 |
| POST | /api/platform/tenants |
建立版主 {"email","password","name"} → 201,回傳含 apiKey、bindCode(管理王會員開通時呼叫) |
| PATCH | /api/platform/tenants/{id} |
{"status":"suspended"|"active","quotaMessages":10000,"quotaLlm":1000,"password":"..."} |
四、與管理王整合建議
- 管理王會員申請「反詐小幫手」→ 後台呼叫
POST /api/platform/tenants建帳號,把apiKey存在該會員資料。 - 管理王頁面用
GET /api/v1/stats、/incidents顯示該會員的儀表板;或直接連結到本系統後台。 - 付費方案變更 →
PATCH /api/platform/tenants/{id}調整額度;欠費 →status: suspended。 - 想統一用管理王登入時可設
ALLOW_SIGNUP=0關閉自助申請(目前沒有 SSO,見已知限制)。