搭建你的第一个自动化:用 dsh 无头模式做每周 GEO & SEO 监控

一个自己运行的每周 AI 引用与 SEO 检查:完整提示词集、把结果存成文件的 headless dsh 运行、cron/launchd 定时,以及 15 分钟内看完变化的 diff 工作流。

目标状态

读完本指南,你会拥有一个自己运行的每周检查。每周五早上 9 点,DeepSeek Harness 以无头模式自动醒来,跑四项检查(排名、AI 答案露面、内容新鲜度、外链),把结果追加到工作区里一个带日期的文件,全程大约三分钟。而你花十五分钟,喝着咖啡读 diff 就够了。

适合谁: 已经跑过本系列安装文章、Harness 无头模式能用的任何人。需要什么: 一个工作区文件夹、一套提示词集(见下文)、一台定时触发时开着的电脑。"完成"长什么样: 一个 weekly-snapshots/ 文件夹,每次运行一个带日期的文件,加上一屏能看完的变化摘要。

全文演示站点是 Moonlight Roasters(moonlightroasters.example),本系列里反复出现的同一个虚构波特兰烘焙商。

环形每周循环示意图:四个节点带箭头——周五 9 点定时、headless 运行、快照文件、读 diff,中心标注每周循环,下方四个 chip:排名、AI 引用、新鲜度、外链

一张图看完整个自动化:定时、运行、存档、读 diff。

自动化之前:先定基线

自动化好不好,取决于背后的提示词集。一次性把它配好,每周运行就变成例行公事。从本系列提示词库里的四项检查开始——一次真实 headless 运行把它们变成了一份现成的清单:

检查

dsh 任务

预期输出

排名

dsh --profile headless "check rankings: for target keywords, report where moonlightroasters.example ranks on Google"

表格:关键词 → 位置 → URL → 与上周的对比

AI 答案露面

dsh --profile headless "check AI visibility: search brand queries in ChatGPT, Perplexity, and Google AI Overviews; note any citations of moonlightroasters.example"

平台 → 是否被引用(是/否)→ 引用上下文

内容新鲜度

dsh --profile headless "audit content freshness: crawl the site; list pages with lastmod older than 90 days, flagging product and price pages"

页面 → 最后修改时间 → 陈旧标记 → 需要行动

外链

dsh --profile headless "audit backlinks: report referring domains and links to moonlightroasters.example; flag new and lost links"

外链域名 → 锚文本 → 状态(新增/丢失)

这张表里烙着两条设计规则。第一,每项检查都有确定的输出形态(带列名的表格),这样周与周之间的对比才是同类比较。第二,检查与升级规则匹配:排名掉 5 位以上、引用丢失、核心页面陈旧,各自意味着不同的问题,要用不同的方式处理。

把这张表存成工作区里的 weekly-checklist.md,把示例关键词换成你自己的真实关键词。之后智能体可以重新加载它——定时运行干的就是这件事。

第 1 步 — 手动跑一次 headless,存到文件

排期之前,先手动完整跑一遍提示词集,确认输出确实落到文件里。创建快照文件夹,跑一条 headless 任务并重定向输出:

bash
mkdir -p weekly-snapshots
dsh --profile headless "generate the weekly GEO snapshot for moonlightroasters.example and 3 target queries: for each query, paste the current AI answer, note whether we are mentioned or cited, and list any new sources that appeared. Output as a table. Keep the answer under 200 words." > weekly-snapshots/2026-08-14.md

检查文件:你应该能看到一张这样的表(来自本系列基线运行的真实输出):

检查

dsh 任务

预期输出

排名

check rankings: report where moonlightroasters.example ranks on Google

关键词 → 位置 → URL → 与上周对比

AI 答案露面

check AI visibility in ChatGPT, Perplexity, Google AI Overviews

平台 → 是否被引用 → 引用上下文

内容新鲜度

audit content freshness: pages with lastmod older than 90 days

页面 → 最后修改时间 → 陈旧标记 → 需要行动

外链

audit backlinks: referring domains and links

域名 → 锚文本 → 状态(新增/丢失)

如果文件是空的或运行报错,趁你在盯着,现在就修。首次运行常见问题:工作区路径跟 headless 期望的不一致(macOS 把 /tmp 解析为 /private/tmp——用真实路径),或 profile 名称不对(用 dsh --help 列 profile,或查 ~/.dsh/profiles/)。

一个关于 AI 答案检查的诚实说明:Harness 无法直接看到 ChatGPT 或 Perplexity 的界面内部。提示词让模型报告它知道的 AI 可见性情况——这是代理信号,不是真实爬取。作为周与周之间的趋势信号非常好用;但它不是地面真相。想要更硬的证据,就把你自己抓到的真实 AI 答案贴进提示词(GEO 文章里的引用缺口提示词就是这么干的)。

第 2 步 — 定时执行

现在把每周提示词集包进一个脚本,让调度器指向这个脚本。这样调度保持简单,逻辑集中在一个可编辑文件里。

在工作区创建 geo-weekly.sh:

bash
#!/bin/bash
cd /path/to/your/workspace
dsh --profile headless "read weekly-checklist.md, then generate today's weekly SEO snapshot for the checks listed, output as tables" >> weekly-snapshots/$(date +%Y-%m-%d).md

加上执行权限:chmod +x geo-weekly.sh。手动测一次——应该出现第二个带日期的文件。

Linux:cron

bash
crontab -e

加一行(每周五 9 点触发;cron 里 5 代表星期五):

text
0 9 * * 5 /path/to/your/workspace/geo-weekly.sh

macOS:launchd

macOS 跑的是 launchd,不是 cron。创建 ~/Library/LaunchAgents/com.moonlight.geo-weekly.plist:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.moonlight.geo-weekly</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/path/to/your/workspace/geo-weekly.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Weekday</key>
        <integer>5</integer>
        <key>Hour</key>
        <integer>9</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
</dict>
</plist>

加载它:

bash
launchctl load ~/Library/LaunchAgents/com.moonlight.geo-weekly.plist

以后卸载:launchctl unload ~/Library/LaunchAgents/com.moonlight.geo-weekly.plist

重要: 在笔记本上,周五 9 点的运行只有机器醒着才会发生。常开的台式机或服务器给你可靠的运行;笔记本只有醒着的时段有。这是硬件属性,不是工具的——把日子和时间调到你的机器真正开机的时候。

第 3 步 — 读每周 diff

快照文件会累积;价值在于差异。每周把新文件和上一份对比:

bash
diff weekly-snapshots/2026-08-14.md weekly-snapshots/2026-08-21.md

或者用 diff --side-by-side / 合并工具,视图更好看。值得行动的变化:

  • 引用出现 — 你的 GEO 修复奏效了。记下你上周用了哪个修复;这就是证据。
  • 引用丢失 — 模型更新或新对手出现。用当前答案重跑 GEO 文章里的引用缺口审计。
  • 答案里出现新来源 — 一个你从没见过的品牌。这是未来一个月的覆盖目标。
  • 排名掉 5 位以上 — 压倒一切的一项检查。在下一次定时运行前调查。
  • 页面陈旧 — 用 SEO 工作流文章里的内容新鲜度分诊提示词。

把读 diff 的时间固定下来(比如周五 15 分钟)。如果仪式连续两周以上超过这个时间,需要收紧的是提示词集,不是调度。

应对破坏性变更

DeepSeek Harness 是开发者预览版。插件和 API 会随版本变化,上个月还能跑的提示词可能在一次更新后失败。三个便宜的习惯让自动化活着:

  1. 锁定版本。 仓库升版本、你的工作流出问题时,你可以退回去。刻意安装而不是一直吃 @latest:
bash
npx @deepseek-ai/dsh@0.1.0-rc.6 --version
  1. 保留上次的好输出。 在新运行成功之前,永远别删上一份快照。diff 仪式本来就要旧文件;如果一次运行失败,旧文件也是智能体过去行为的记录。
  2. 更新后测试。 升级 Harness 后,先手动跑一次脚本,再信任定时。两分钟,零意外。

维护

  • 每周快照文件每周增长几百字节;想清理的话,删掉一年以上的就行。
  • 每季度重新审视关键词集。清单文件是纯文本,更新调度就是编辑一个文件。
  • 如果某项检查不再有用(比如外链从来不变化),砍掉它。一个你信任的监控仪式,好过一个你无视的全能仪式。

FAQ

这要花很多钱吗?每周四次短 headless 运行,token 成本不到一分钱。真正的成本是你读 diff 的 15 分钟——这就是格式纪律重要的原因。

需要一直开着网页 UI 吗?不需要。无头模式是独立进程,调度直接触发它。UI 和调度器互不干扰。

我的机器是笔记本,9 点不开机。怎么办?选一个笔记本真正开机的时段,或者把脚本放到一台常开的机器上(服务器、家里的 NAS、云 VM)。脚本是可移植的。

Harness 更新把提示词搞坏了怎么办?锁定版本、保留上次好输出(上面的习惯)。升级时先手动跑一遍,再信任调度。

它能自动完成整个 SEO 工作吗?能收集和分析,不能替你发布。每周快照告诉你什么变了、该怎么办。行动永远留给人——本来就该这样。

本系列其他文章

作者:Camille Rhodes,Auspia 自动化工作流负责人,搭建过 30+ 增长系统。Camille 撰写定时 AI 工作流、监控系统,以及自己运行的系统。

探索此主题

继续阅读同一增长脉络