| name | ptt-board-police |
| description | PTT 看板警察:透過 PTT MCP server 巡邏指定看板最近的文章(含推噓文留言), 比對該板板規與通用 PTT 規則,列出可能違規的文章、理由與建議處置,供板主裁量。 當使用者提到「看板警察」、「巡板」、「巡邏 XX 板」、「PTT 違規」、「板規檢查」、 「抓違規」、「違規稽核」、「板主巡邏」時請使用此 skill。
|
PTT 看板警察 (PTT Board Police)
巡邏指定看板最近的文章(含推噓文),比對「該板板規 + 通用 PTT 規則」,
列出可能違規的文章與理由,供板主裁量。
本分:看板警察的職責是舉報,不是執法。預設只產出報告、不做任何寫入動作。
任何處置(推噓、水桶、刪文、站內信)只有在使用者是該板板主且明確要求、並逐項確認後才執行。
1. 前置需求
-
需要 PTT MCP server 已在 Claude Code 註冊,工具會以 mcp__PTT__* 形式出現。
若工具不存在,請提示使用者執行下列指令並重啟 Claude Code:
claude mcp add PTT -s user -e PTT_ID=... -e PTT_PW=... -- \
podman run -i --rm -e PTT_ID -e PTT_PW ghcr.io/pyptt/ptt_mcp_server:test
-
PTT 同帳號只允許單一連線:若同時開著其它 PTT session(例如 Gemini 的 PTT MCP),
巡邏時會發生「重複登入」衝突。巡邏前請先關掉其它 PTT session。
2. 整體流程
登入 → 取板規 → 決定巡邏範圍 → 逐篇讀取(含推噓) → 判定違規 → 產出報告 (→ 選擇性處置)
3. 各步驟
Step 0 — 登入
呼叫 mcp__PTT__login()(使用環境變數帳密,無參數)。
登入失敗就停下並回報,不要繼續後續步驟。
Step 1 — 取得板規
- 先呼叫
mcp__PTT__get_board_rules()。
注意:它不會直接回傳板規內容,而是回一段 prompt 指示你自行去找。依其指示:
- 用
mcp__PTT__get_bottom_post_list(board=...) 取置底文(板規通常置底)。
- 從置底文中找標題含「板規 / 版規 / 公告」的文章。
- 再用
mcp__PTT__get_post(board=..., aid=...)(或 index=...)讀其內容。
- 補充:呼叫
mcp__PTT__get_board_info(board=..., get_post_types=True)
取得該板的標題分類清單(用來檢查標題分類格式是否正確)。
- 若找不到板規,改用下方「通用 PTT 規則」判定,並在報告中註明:
「未取得該板板規,僅依通用規則判定」。
Step 2 — 決定巡邏範圍
依使用者指定選擇模式;未指定就先問,預設「最近 20 篇」。
- 篇數模式:
呼叫
mcp__PTT__get_newest_index(index_type="BOARD", board=...) → 回 {success, newest_index}。
設 N = newest_index,巡邏 index 從 N-(篇數-1) 到 N。
- 日期模式:
呼叫
mcp__PTT__get_post_index_range(board=..., target_date_str="YYYY/MM/DD")
→ 回 {success, start_index, end_index},巡邏這個區間。
量大提醒:單次建議 ≤ 30 篇(含推噓文讀取量大)。
超過請建議分批,並先向使用者確認再開始。
Step 3 — 逐篇讀取
對範圍內每個 index 呼叫 mcp__PTT__get_post(board=..., index=i)。
回傳的 data 含:
| 欄位 | 說明 |
|---|
board, aid, index | 看板、文章代碼、索引 |
author, title, date | 作者、標題、日期 |
content | 內文 |
comments | 推噓文列表,每則含推/噓/→ 類型、作者、內容 |
- 讀到刪除文 / 讀取失敗就跳過並記錄一行。
- 不要用
query=True:那是快速模式,只取 metadata、不含內文與推噓文,無法用於判讀。
Step 4 — 判定違規
對每篇(標題 + 內文 + 推噓文)依「板規 + 通用規則」逐項判定(見下方 rubric)。
4. 通用 PTT 規則 rubric
每類給判斷重點;判定時逐類檢查。
標題違規
- 未照看板分類格式:缺
[分類] 標籤或分類錯誤(對照 Step 1 get_board_info 的標題分類)。
- 標題空白 / 亂碼 / 與內容不符。
- 農場標題、騙點閱(誇大、釣魚式標題)。
內文違規
- 內文過短或無實質內容(如只有「.」「補」「ㄏㄏ」)。
- 純貼連結無說明。
- 注音文 / 火星文。
- 複製貼上洗版。
- 跨板轉貼未說明。
行為違規
- 人身攻擊 / 謾罵 / 歧視 / 仇恨言論。
- 引戰挑釁。
- 政治文(在非政治板)。
- 廣告 / 業配 / 拉票 / 帶風向。
- 短時間同作者重複或相似發文(洗文)。
- 洩漏個資(肉搜)。
- 未滿 18 禁內容 / 未過齡板。
- 賭博 / 詐騙 / 違法交易。
推噓文違規
- 推文人身攻擊。
- 洗推。
- ID-pa(指名嗆人)。
- 暴雷未防雷。
板規特定條款
每篇違規要標記:違規類型、嚴重度(高 / 中 / 低)、違反條款(引用板規第幾條或通用規則名稱)、
證據(標題 / 內文 / 推文原文摘錄)、建議處置。
5. 報告格式
第一行摘要:板名、巡邏範圍(index A–B,共 N 篇,含推噓)、板規來源(置底 / 通用)、違規 X 篇 / 正常 Y 篇。
總表:
| # | 文章 (index + 標題) | 作者 | 違規類型 | 嚴重度 | 違反條款 | 建議處置 |
|---|
詳述區塊(每篇違規):
- 違規類型
- 證據摘錄(標題 / 內文 / 推文原文)
- 違反條款
- 建議處置:提醒 / 警告 / 水桶 N 天 / 刪文 / 檢舉(擇一)
正常文章不用逐篇列,給數量即可。
6. 處置動作(謹慎,預設不執行)
看板警察預設只產報告。
若且唯若使用者是該板板主且明確要求,才可使用以下寫入工具;
且執行前一定要把要做的動作與對象逐項列出、取得使用者明確確認:
| 工具 | 用途 |
|---|
mcp__PTT__comment(board=..., ...) | 推 / 噓 / → 留言(可用來公告提醒) |
mcp__PTT__bucket(board=..., ptt_id=..., bucket_days=..., reason=...) | 水桶(禁言)違規者 |
mcp__PTT__del_post(board=..., aid=... 或 index=...) | 刪除違規文 |
mcp__PTT__mail(ptt_id=..., title=..., content=...) | 站內信通知當事人 |
原則:讀前先確認範圍、寫前必逐項確認。不可批次無確認執行。
8. 全站無版主看板巡邏(持久化增量模式)
自動找出全站沒有版主的看板(這些最需要巡邏),為每個板維護一份本機摘要紀錄;之後每次只增量掃描「上次掃到的最新文章之後」的新文章,找出違規並累積紀錄。
紀錄檔位置與格式
所有紀錄存在 /Users/codingman/git/PTT-AI-moderator-skill/records/ 目錄(不存在就用 Write 建立)。共兩種檔:
(A) 全站看板+版主快取:records/_boards.json(步驟 1、2 的結果,建一次後重用,不要每次巡邏都重查全站)。
{
"fetched_at": "2026/06/21 13:00",
"total": 12345,
"checked": 12345,
"boards": [
{"board": "Gossiping", "moderators": ["abc"], "checked_at": "2026/06/21 13:00"},
{"board": "SomeBoard", "moderators": [], "checked_at": "2026/06/21 13:00"}
]
}
moderators 為空陣列 [] 即「無版主」。無版主清單 = 篩選 moderators 長度為 0 的板。
- 全站板數上萬,逐板
get_board_info 很慢且重壓帳號:採批次 + 快取。已在 boards 內且有 checked_at 的板就跳過、不重查。
- 每批查完就把進度寫回
_boards.json(斷點續查)。
- 執行前先告知使用者「全站約 N 板、需逐板查版主、會很久」並確認要全掃還是先掃一批 / 指定清單。
(B) 每板巡邏紀錄:records/<board>.json。
{
"board": "SomeBoard",
"moderators": [],
"rules": "(板規全文,或標註以站規為準)",
"rules_source": "置底文 <標題或aid> | PTT站規(通用rubric)",
"watermark": {"last_index": 1234, "last_time": "06/21 13:00", "last_aid": "M.169...A.BCD"},
"scans": [
{
"scanned_at": "2026/06/21 13:05",
"range": "1235-1260",
"checked": 26,
"violation_count": 2,
"violations": [
{"index":1240,"aid":"M...","title":"...","author":"...","types":["人身攻擊"],"severity":"高","rule":"站規/板規條款","evidence":"原文摘錄","action":"建議水桶7天"}
]
}
]
}
增量掃描邏輯
- 讀該板
records/<board>.json;不存在就新建(watermark 視為空)。
- 取目前最新編號:
mcp__PTT__get_newest_index(index_type="BOARD", board=...) → newest_index = N。
- 第一次(無 watermark):只掃最近 K 篇(K 預設 20,除非使用者另指定),即 index
max(1, N-K+1)~N,避免第一次就全掃整板。
- 之後(有 watermark)— 用「時間」當水位,不用 index:原因是上次最後一篇(水位那篇)可能被刪,index 會位移失準。做法:從
i=N 往回 get_post,逐篇比對發文時間:
- 該篇
time > watermark.last_time(或 aid == watermark.last_aid 之前)→ 視為新文章,判定違規。
- 一旦讀到
time <= watermark.last_time,或 aid == watermark.last_aid → 代表已追到上次掃過的位置,停止。
- 加一個安全上限(例如最多往回掃 200 篇)避免異常時掃整板;觸頂就記一行警告。
- 若
index=N 那篇的 time 已 <= watermark.last_time → 沒有新文章,跳過。
- 逐篇
mcp__PTT__get_post(board=..., index=i)(含 comments 推噓文)判定違規。
- 掃完把
watermark 更新為**最新那篇(index=N)**的時間與 aid(last_time / last_aid / last_index=N),並把本次結果 append 到 scans,寫回檔案。
水位用時間(last_time+last_aid),不用 index。 PTT 刪文會讓後續文章 index 位移,所以記住的 index 不可靠;改以「上次最後一篇的發文時間」為界,往回掃到該時間為止即停。PTT 時間只到分鐘且會跨日,故同時用 last_aid 當精確界標(讀到同一 aid 即停)。last_index 僅供參考/起掃點,不作為比對依據。
版規取得與 fallback
- 依既有「取得板規」流程(
get_board_rules 提示 → get_bottom_post_list 找置底板規 → get_post 讀內容)。
- 找不到板規 →
rules_source 記為 "PTT站規(通用rubric)",rules 標註「未取得板規,依本 skill 通用 PTT 規則(等同站規)判定」,判定時就用既有「通用 PTT 規則 rubric」(即 §4)。
執行順序
- 取全站看板:
mcp__PTT__get_all_boards() → 寫 / 更新 _boards.json 的板名清單。
- 批次補齊版主資訊:對尚未查的板
mcp__PTT__get_board_info(board=...) 取 moderators,寫回 _boards.json(斷點續查、可分批)。篩出 moderators==[] 的無版主清單。
- 對每個無版主板:取 / 更新版規(含 fallback 站規)→ 增量掃描 → 判定違規 → 寫
records/<board>.json。
- 產出總結報告:本次新增掃描了哪些板、各板新文章數、違規數、重點違規清單。
注意事項
- 全站逐板查版主呼叫量巨大,務必快取 + 斷點續查 + 先與使用者確認範圍;可只跑一批驗證。
- 第一次巡一個新板預設只掃最近 K 篇(預設 20),不要把整板歷史全掃。
- PTT 同帳號單一連線,跑批次期間不要同時開其它 PTT session。
9. 錯誤處理表
| 狀況 | 處理方式 |
|---|
工具不存在 mcp__PTT__* | 未註冊 MCP server,給 §1 註冊指令並請使用者重啟 Claude Code。 |
| 登入失敗 / 重複登入 | 帳密錯誤或其它 PTT session 佔線,請關掉其它 session 後重試。 |
| 找不到板規 | 改用通用規則,並在報告中註明「僅依通用規則判定」。 |
| 某 index 讀取失敗 | 多半是刪除文,跳過並在報告記一行。 |
| 範圍過大 | 建議分批(單次 ≤ 30 篇),並先向使用者確認。 |
records/ 不存在 | 用 Write 建立後再寫。 |
| 批次中斷(全站查版主未跑完) | 已寫回的 _boards.json 可續查,從沒有 checked_at 的板繼續。 |