Open source

內容上線前的 十二道檢查。

contentgate 在頁面上線前擋下十二種常見錯誤:五道檢查內容本身,七道檢查頁面能不能被搜尋引擎和 AI 讀懂。每一道都是在某件事已經上線、付出代價之後才寫的,現在用 MIT 授權開源。

唯一的設計原則

沒被證明失敗過的守門,只是裝飾。

每一道檢查都附負面測試,也就是它一定要擋下來的輸入。測試會在給出任何結論之前先跑一次,如果測試沒過,程式直接退出而且不對你的內容發表意見。一個沒辦法證明自己還抓得到已知錯誤的檢查器,沒有資格告訴你網站沒問題。

這不是理論。我們寫過的守門包括:一個把關鍵字讀進頁尾共用區塊、因此每頁都放行的;一個被放在「重新產生它要檢查的檔案」那一步之後才跑的;還有一個退出碼被 shell 吃掉、所以一邊印「擋下部署」一邊讓部署繼續跑的。三個看起來都很正常。三個都是靠「故意叫它失敗」抓出來的。

contentgate 流程:頁面與內容經過 12 道檢查,退出碼 0 通過、1 要修、2 量尺壞了

五道內容檢查

目標關鍵字覆蓋

文章把題目寫完了,卻始終沒出現真正有人在搜的那個詞。比對一律逐字,不做空白正規化,因為有空格跟沒空格是兩個不同的字串,搜尋量也不同。

翻譯結構走鐘

譯稿在結構上已經不是同一份文件:表格少一列、價格數字被改掉、站內連結掉了語系前綴,讀者一點就被丟回原文站。

內容頁的商業內鏈

一篇排得上、也有人讀的指南,卻把人送不到任何地方,因為全文唯一的商業連結長在每頁都有的共用 CTA 裡。所以這道檢查只看正文,不看共用區塊。

績效宣稱

金融、博弈、醫療類文案把結果講成事實會被拒登。難的不是抓到那個詞,是不要對「我們不做保證獲利宣稱」這種免責句誤判。

sitemap 日期誠實

每次建置把今天的日期蓋在每一個網址上,是每天說一次的謊。正解是內容雜湊狀態機:內容真的變了,日期才動。

0.2.0 新增:七項頁面體檢

檢查伺服器實際送出的 HTML,不是原始碼。要給搜尋引擎找、也要讓 AI 讀得懂的頁面才需要跑。字數門檻 1200、重複比例 15% 是我們自己定的規則,不是任何搜尋引擎公布的數字,都可以調。

檢查什麼情況會擋
visible_text關掉 JavaScript 後,正文讀得到的字少於設定值(預設 1200)
structured_data結構化資料解析失敗、缺了要求的類型,或沒有 dateModified
outbound_links外連沒標 nofollow、sponsored、ugc,而且不在引用白名單裡
images圖片缺 alt 或缺 width
favicon首頁沒宣告網站小圖示,或只有 Google 不支援的格式
stock_phrases正文出現你列在清單裡的空話(預設是一組繁中慣用語)
duplicate_sentences兩頁一字不差的句子超過設定比例(預設 15%)

怎麼做的

兩份實作。Python CLI 卡在部署前面,退出碼就是契約;MCP server 讓 AI 在寫稿當下就檢查,而不是等頁面已經上線。

兩邊共用同一個測試檔,而且被要求對每一個案例給出完全一樣的判定。CI 會逐案比對,只要有一項不一致就是其中一邊走鐘了,直接擋下。

拿去用

MIT 授權,Python 端零相依套件,只用標準函式庫。

git clone https://github.com/adsandcode/contentgate
cd contentgate
python -m contentgate init      # 產生設定檔
python -m contentgate check     # 跑檢查

退出碼就是契約:0 全過、1 你的內容沒過、2 守門自己的負面測試沒過(所以它不對你的內容發表意見)。接在部署前面,接住退出碼就會擋下部署。

同一套檢查也做成了 MCP server,讓 AI 在寫稿當下就查,而不是等頁面上線之後:

npx mcp-server-contentgate

八個工具:關鍵字覆蓋、翻譯結構、商業內鏈、績效宣稱、sitemap 日期、內容雜湊、頁面體檢(audit_page)、兩頁重複比對(compare_pages)。每個都是純函式,內容進去、判定出來,不碰檔案、不連網路、不寫任何東西。啟動時會先跑自己的負面測試,沒過就拒絕啟動。

GitHubnpm

相關的實作筆記

這些檢查背後的問題,我們都寫成過文章:

sitemap lastmod 天天說謊怎麼修 關鍵字自食:35 個字散在 6 頁的real case 新站零收錄先查 canonical 你的網站可能正在燒掉抓取預算

常見問題

為什麼要關掉 JavaScript 看字數?
Google 會先執行 JavaScript 再收錄,但很多 AI 爬蟲不會。Vercel 在 2024 年 12 月的量測發現,GPTBot、ClaudeBot、PerplexityBot 只抓 HTML 就停了,用程式寫進頁面的文章,它們看到的只剩導覽列和頁尾。

外連一定要加 nofollow 嗎?
不用。Google 的說明是付費與聯盟連結用 sponsored、使用者發表的內容用 ugc、其他不想背書的才用 nofollow,一般的編輯引用不必加。程式分不出引用和置入,所以全部列出來,你確定是引用的網站放進白名單就好。

網站小圖示用 SVG 可以嗎?
只有 SVG 不行。Google 搜尋列出的小圖示格式是 BMP、GIF、ICO、PNG、JPEG、PPM、TIFF,沒有 SVG,至少要再放一個 ICO 或 PNG。

要付費嗎?
不用。MIT 授權開源,Python 端只用標準函式庫,MCP server 用 npx 就能執行。

需要有人幫你把這些做完

這些檢查是我們日常交付的一部分。如果你的站需要有人從頭把地基做對,把情境講給我們聽。

用 Telegram 聊需求
TG 聊需求