用 DeepSeek Harness 修正「Discovered / Crawled – Currently Not Indexed」的 URL

在 DeepSeek Harness 內執行 Search Console 索引流程: 用 dsh --profile headless 一次性的批次,或 Web UI 互動對話加上每週排程,兩者都把清單送到 Google Indexing API(每天 200 個 URL)。

DeepSeek Harness(dsh)能執行真正做事的 agent,而很少有 SEO 工作比未索引 URL 流程更適合它: 讀清單、檢查每個 URL、分類、等核准、送出、驗證。每個階段都是指令或檔案,正是 harness agent 擅長的事。

兩個問題決定你怎麼設定。你想要可以腳本化、丟進 cron 的一次性批次嗎? 用 headless 跑。你想看著它運作、回答它的問題、在聊天視窗逐批核准嗎? 用 Web UI。這份指南兩條路都講,底層的流程對兩者都一樣。如果想深入了解「Discovered – currently not indexed」與「Crawled – currently not indexed」的意義和判讀方法,我們在 Hermes Agent 版的這份流程 中詳細講過; 這裡聚焦 dsh 的執行。

選擇你的路徑

Headless 一次性

Web UI + 排程

最適合

腳本化批次、cron、CI 風格執行、測試

互動式判斷、初次設定、學習 agent 會做什麼決定

啟動

dsh --profile headless "任務"

dsh web(開啟 127.0.0.1:3080)

核准

檔案中的預先核准清單; 規則需要人類時,agent 用它的提問工具問

在聊天中直接問,逐批核准

排程

cron(或如果你的 profile 載入 Schedule 外掛,用 dsh 的排程工具)

一樣,但每次執行都看得到

輸出

專案資料夾中的報告檔

報告檔加聊天紀錄

dsh 的 headless 一次性路徑與 Web UI 加排程迴圈路徑比較的決定圖

批次用 headless、首次執行用 Web UI,底層流程相同。

兩條路共享一個規則: 寫入步驟(送出到 Google)保持在人為核准關卡之後。headless 模式意味著你先審核 agent 產生的檔案,才讓它執行送出指令; Web 模式則在聊天中核准。

完成後你會得到

一個 indexing/ 專案資料夾,內含: URL 清單、分類好的清單(to-submit.txtskip.txtneeds-fix.txt)、核准的送出佇列、執行紀錄。每次執行 dsh 會產生一份簡短報告: 送出幾個、略過幾個與原因、和上次相比的變化。第一次設定 60–90 分鐘(大部分時間花在 Google 端憑證),每週執行 15 分鐘。

開始之前

  • 已安裝並設定 dsh。 需要時用 npx @deepseek-ai/dsh@latest web 更新到目前版本。你的 API 金鑰和設定放在 ~/.dsh/(profiles、sessions、settings.yaml),dsh web 能跑或 headless 任務成功就算安裝確認。
  • 你擁有所有權的 GSC 資源,使用 sc-domain:example.com 格式。
  • 讀取憑證: 用於 Search Console API 的 OAuth 用戶端(用戶端 ID + 密鑰)。
  • 寫入憑證: 已啟用 Indexing API 的 Google Cloud 專案、服務帳戶 JSON 金鑰,並把服務帳戶 email 加為 GSC → 設定 → 使用者與權限底下的擁有者。送出時 403 表示這一步失敗。
  • 工作區中的兩個 GSC 腳本資料夾: 讀取技能(sitemap、搜尋分析、URL 檢查)和索引技能(index_submit.py)。Python 3 與 pip install google-auth google-api-python-client
  • 專案資料夾,例如 ~/gsc-indexing-project,內含 data/scripts/logs/

Google 端的設定對任何 agent 都一樣,gsc-indexing 技能的說明文件會帶你走完 Cloud Console 步驟: 啟用 Indexing API、建立服務帳戶、下載金鑰、加為擁有者。

路徑 A: 一次性的 headless 執行

Headless 模式是 dsh --profile headless "任務": 一個任務、一個答案、結束。可以把整個流程放進一個提示詞,或邊除錯邊分幾次執行。

第一次執行(在專案資料夾):

bash
dsh --profile headless "執行 GSC 索引流程的第一階段。用 gsc_query.py 腳本列出 sc-domain:example.com 的 sitemap,抓取所有含 lastmod 的 URL,去重複後寫入 data/url-inventory.csv。回報總數。"

什麼是好的輸出: 一份真實的 CSV,總數與 GSC 的 sitemap 報表相符,沒有發明出來的欄位。品質檢查: 開啟檔案抽查五個 URL。如果 agent 回報認證錯誤,重新執行 GSC OAuth 流程再試; 讀取腳本需要新的 token。

第二階段:

bash
dsh --profile headless "用 URL Inspection API 檢查 data/url-inventory.csv 中的 URL,分成 data/to-submit.txt、data/skip.txt(附一行理由)和 data/needs-fix.txt。只包含 lastmod 在最近 90 天內的 URL。"

agent 會分批執行檢查腳本(API 每個資源有速率限制; 在 Google Cloud Console 查看目前配額)。檢查分割結果: 略過清單應該以 noindex、canonical 指向他處、重複頁面為主。如果幾千個 URL 的網站卻跑出空的 needs-fix,就加寬輸入時間範圍。

第三階段是核准關卡,絕對不無人在場執行:

bash
dsh --profile headless "讀取 data/needs-fix.txt 和 data/skip.txt。把修正與送出佇列做成表格: URL、推定原因(沒有內部連結、重複、canonical、noindex、太薄、軟 404)、證據、建議動作、風險等級。不要送出任何東西。"

在報告中審核表格,把 data/to-submit.txt 編輯成只含你核准的 URL,然後執行第四階段:

bash
dsh --profile headless "用索引腳本送出 data/approved-urls.txt 中的 URL(index_submit.py submit --urls-file data/approved-urls.txt)。先執行 check-auth。把每個結果記到 logs/submissions.log。"

預期輸出: 每個 URL 一行通知結果,沒有 403。復原路徑: 403 表示服務帳戶不是資源的擁有者; 429 表示你碰到每天 200 個或每分鐘 600 次的配額,把清單分天送出。如果執行中途死掉,dsh --profile headless --resume <session> 可以接續。

路徑 B: Web UI 加每週排程

dsh web 在 127.0.0.1:3080 開啟瀏覽器 UI。用聊天執行同樣的階段,但改為互動式: agent 會請你確認分類清單,執行送出指令前再確認一次。這個即時核准流程是初次設定選擇這條路的主要原因: 在它對你的 Google 資源動手之前,你會先看到它要做什麼。

流程能跑之後,加上節奏。dsh 的 Schedule 外掛註冊了 schedule_create,會在線上對話內以計時器重複執行任務:

schedule_create: every 7 days, run "Inspect data/url-inventory.csv, classify new and changed URLs, and draft the submission queue. Do not submit."

如果 profile 沒有載入 Schedule 外掛,同樣的結果可以用一行 cron 包住 headless 指令:

bash
0 9 * * 1 cd ~/gsc-indexing-project && dsh --profile headless "執行每週 GSC 索引檢查並草擬送出佇列。" >> logs/weekly.log 2>&1
帶人類核准關卡的 dsh 索引流程每週排程迴圈圖

排程只跑前三站; 送出保留在人為關卡。

不要把送出步驟放進排程。每週的檢查、分類、佇列草擬可以無人在場,送出則等一個人。

agent 套用的判斷規則

分類和佇列依賴一張小表格,你應該把它放在專案資料夾,讓每次執行都用同一套規則:

原因

修正

修正後送出?

頁面沒有任何內部連結

從已收錄的相關頁面加入有脈絡的連結

全新頁面

不用修; 送出一次,等 1–2 週

是,一次

被 robots.txt 封鎖

解除路徑封鎖

重複或太薄的內容

重寫、合併或刪除

只有真正改變之後

canonical 指向他處

錯就修正; 故意的話放棄這個 URL

只有修正之後

爬取時有 noindex

移除 noindex

移除之後,是

軟 404、封存、沒有價值的 faceted 頁面

修正或刪除; 永久略過

這兩個狀態的深入判讀(包括 Google 為什麼爬某些頁面不爬其他的)在 Hermes Agent 指南 中。原因與哪個 harness 執行流程無關。

驗證,然後等待

每批送出後,用 status 確認通知: 那只證明 Google 有它的中繼資料,不代表頁面已收錄。三到七天後重新檢查送出的 URL 並比較狀態。健康的模式是一兩週內 discovered → crawled → indexed。GSC 資料會延遲幾天,Google 也照自己的時程重新爬取,所以修正後 10–14 天仍停在「Crawled – currently not indexed」的 URL 是內容品質的裁決,不是送出的問題。紀錄檔讓這一切可見: 日期、URL、通知類型、下次執行時的檢查狀態。這才是衡量標準: 未收錄清單應該隨時間縮小,而不是通知次數增加。

誠實的界線

  • Indexing API 官方文件只涵蓋 JobPostingBroadcastEvent 頁面。把一般頁面送過去是常見做法,但 Google 對每個頁面類型不提供保證,也沒有支援承諾。
  • Search Console 的「要求建立索引」按鈕沒有公開 API。Indexing API 是最接近的腳本化管道,不是按鈕的複製品。
  • 自動化不會創造優先權。頁面在你修正並送出後仍未收錄,下一步是內容工作,而不是再跑一次排程。

常見問題

可以完全不用 Web UI、只跑 headless 模式嗎?可以。dsh --profile headless "任務" 執行一個任務就結束; 憑證仍放在 ~/.dsh/,讀取腳本照樣運作。先用 Web UI 端到端驗證一次流程,再腳本化。

執行中途死掉,工作會丟失嗎?不會。用 dsh --profile headless --resume <session> 接續,再重新執行送出腳本; 它會去重複相同 URL,所以同一批中已通知過的 URL 重送無害。

我管理多個 GSC 資源,每個網站都要重來一遍嗎?腳本接受 --site sc-domain:... 參數,所以一個工作區可以放多個資源的清單與紀錄。每個資源保留一個核准佇列檔、一個送出指令,一個網站的配額錯誤就不會卡住其他網站。

作者: Camille Rhodes,Auspia 300+ AI 內容工作流程的架構師。撰寫關於內容自動化、發布系統,以及把 AI agent 變成可靠成長營運的工作流程。

探索此主題

繼續閱讀相同的成長脈絡