整套系统搭建耗时约 60 分钟,不依赖任何云服务或数据库,所有数据在本地处理。

架构设计:三个脚本解决问题

设计原则是极简:Agent 收到请求 → 通过 exec 工具调用本地 Node.js 脚本 → 脚本调用官方 API → 返回纯文本 → Agent 分析并给出建议。

文件结构:

~/.openclaw/workspace/
├── scripts/
│   ├── gsc-report.cjs      # Google Search Console 查询
│   ├── ga4-report.cjs       # Google Analytics 4 查询
│   └── bing-report.cjs      # Bing Webmaster 查询
└── credentials/
    ├── gcp-service-account.json   # Google 服务账号密钥
    └── bing-webmaster-api-key.txt # Bing API Key

三个脚本,两个密钥文件,没有中间层。

步骤一:Google Cloud Console 配置(15 分钟)

Google API 访问通过 Service Account(机器人账号)实现。

创建 Service Account:

  • 打开 Google Cloud Console,创建新项目(如 openclaw-seo
  • 进入 IAM & Admin → Service Accounts → Create Service Account
  • 名称随意(如 openclaw-seo-reader),角色可暂不选
  • 创建后点击该 SA → Keys → Add Key → Create new key → JSON
  • 下载 JSON 文件,保存到 ~/.openclaw/workspace/credentials/gcp-service-account.json

JSON 文件中的 client_email 字段形如 openclaw-seo-reader@项目名.iam.gserviceaccount.com,后续授权都需要这个邮箱。

启用 API:

在 APIs & Services → Library 中搜索并启用:

  • Google Search Console API
  • Google Analytics Data API

两个都必须启用,否则脚本会报 API has not been enabled 错误。

步骤二:Google Search Console 授权(10 分钟)

注意:GSC 权限不在 Google Cloud 设置,而是在 Search Console 网站本身。

  • 打开 Search Console,选择站点
  • 左侧「设置」→「用户和权限」→「添加用户」
  • 输入上一步的 client_email,权限选「受限」(只读即可)

踩坑: 每个站点必须手动单独添加,没有全局批量授权。10 个站点就要重复 10 次。

步骤三:Google Analytics 4 授权(10 分钟)

流程与 GSC 类似:

  • 打开 Google Analytics → 左下角「管理」→ 选择目标媒体资源
  • 「媒体资源」→「媒体资源访问权限管理」→ 右上角「+」→「添加用户」
  • 输入 client_email,角色选「查看者」

重要踩坑:GA4 的 Property ID 和数据流 ID 是两个不同的东西。

  • Property ID:在「媒体资源详情」中查看,是一串纯数字(如 489888837
  • 数据流 ID:在「数据流」中查看,也是数字但完全不同

脚本中使用的是 Property ID,格式为 properties/489888837。第一次配置时搞混这两个 ID,调试了很久才定位到原因。

步骤四:Bing Webmaster Tools 配置(5 分钟)

Bing 不需要 Service Account,直接用 API Key:

  • 打开 Bing Webmaster Tools → 右上角「设置」→ API access
  • 点击 Generate API Key
  • 复制保存到 ~/.openclaw/workspace/credentials/bing-webmaster-api-key.txt(纯文本,一行即可)

步骤五:安装依赖(5 分钟)

cd ~/.openclaw/workspace/scripts
npm install googleapis google-auth-library

踩坑: package.json 中不要加 "type": "module"。如果存在该配置,Node.js 会将所有 .js 文件当作 ES Module 处理,导致 require is not defined 报错。

解决方案: 将脚本文件命名为 .cjs 而非 .js。无论 package.json 如何配置,Node.js 都会以 CommonJS 模式加载 .cjs 文件。

步骤六:三个核心脚本实现(15 分钟)

GSC 脚本 gsc-report.cjs

查询关键词排名、点击、展示、CTR 和 Top 页面。

核心逻辑:

  • 使用 googleapis 库连接 Google Search Console API
  • 读取本地 Service Account JSON 密钥
  • 配置站点列表,注意资源名格式区分:域名资源用 sc-domain: 前缀,URL 前缀资源用完整 URL(含末尾斜杠)
  • 调用 searchanalytics.query 方法,设置日期范围、维度(query/page/country)、行数限制

最大的坑在资源名格式上:

  • 域名资源:sc-domain:example.com
  • 网址前缀资源:https://example.com/

格式不对时 API 返回 403 User does not have sufficient permission,这个错误信息极具误导性——实际问题是资源名写错了。建议先调用 searchconsole.sites.list() 列出所有已授权站点,确认正确格式。

运行方式:

# 查所有站点
node scripts/gsc-report.cjs
# 只查某个站
node scripts/gsc-report.cjs slitherlinks
# 查某个站的特定关键词
node scripts/gsc-report.cjs slitherlinks "puzzle"

GA4 脚本 ga4-report.cjs

查询用户、会话、页面浏览、流量来源、国家分布。

核心逻辑:

  • 使用 google.analyticsdata 连接 GA4 API
  • 配置 Property ID 列表(纯数字)
  • 调用 properties.runReport,设置维度(sessionDefaultChannelGroup/country/pagePath)和指标(sessions/activeUsers)

运行方式:

# 查所有站点,默认 28 天
node scripts/ga4-report.cjs
# 指定站点和天数
node scripts/ga4-report.cjs slitherlinks 7

Bing 脚本 bing-report.cjs

代码最简单,无需 OAuth。

核心逻辑:

  • 使用 Node.js 原生 https 模块
  • 读取本地 API Key 文本文件
  • 调用两个端点:GetRankAndTrafficStats(流量统计)和 GetQueryStats(关键词数据)
  • 返回 JSON 格式数据

让 Agent 使用脚本

配置完成后,Agent 通过 exec 工具直接调用脚本。实际对话流程:

用户:帮我看看最近 slitherlinks.com 的 SEO 表现

Agent 内部调用:
  exec: node ~/.openclaw/workspace/scripts/gsc-report.cjs slitherlinks
  exec: node ~/.openclaw/workspace/scripts/ga4-report.cjs slitherlinks 7

→ 汇总分析,给出建议

Agent 拿到纯文本数据后可以做的事情:

  • 对比本周 vs 上周变化趋势
  • 找出展示量大但点击率低的关键词(优化机会)
  • 发现流量下降的页面
  • 生成每日/每周 SEO 报告
  • 异常流量预警

进阶:定时自动报告

通过 cron 实现每日自动运行:

crontab -e
# 每天早上 8 点运行
0 8 * * * node /Users/yourname/.openclaw/workspace/scripts/gsc-report.cjs >> /tmp/seo-report.log 2>&1

也可以在 OpenClaw 的 HEARTBEAT.md 中加入 SEO 检查任务,让 Agent 定期主动查询并汇报。

安全事项

系统完全本地化,但密钥管理不能松懈:

  • credentials/ 目录已加入 .gitignore,绝不上传到代码仓库
  • Service Account 仅申请只读权限(readonly scope),即使密钥泄露也无法修改数据
  • API Key 文件设置严格权限:
chmod 600 ~/.openclaw/workspace/credentials/gcp-service-account.json
chmod 600 ~/.openclaw/workspace/credentials/bing-webmaster-api-key.txt

踩坑全记录

问题 原因 解决方案
require is not defined package.json"type": "module" 脚本文件改名为 .cjs
403 insufficient permission GSC 资源名格式错误 sites.list() 确认正确格式
sc-domain: vs https:// 混淆 两种资源类型格式不同 域名资源用 sc-domain:,URL 前缀用完整 URL
GA4 查询无数据 误填数据流 ID 去「媒体资源详情」确认 Property ID
API not enabled 未在 GCP 启用对应 API 去 Library 搜索并启用
新站查不到数据 Service Account 未添加到该站权限 每个站点单独授权

其中 GSC 资源名格式问题最耗时间——sc-domain:https:// 的区别导致的 403 错误信息完全不指向真正原因。

给独立开发者的实操建议

  1. 先跑通一个站点再批量配置。 把 GSC、GA4、Bing 三个脚本在单个站点上调通,确认数据正确后再扩展到其他站点。
  2. 资源名格式用 API 确认,不要手写。 调用 sites.list() 拿到精确格式,复制粘贴到配置中。
  3. 脚本输出设计为纯文本。 Agent 处理纯文本的效果远好于 JSON,格式化的文本也方便人工抽查。
  4. 从只读权限开始。 初期不需要任何写入能力,只读 scope 足够完成所有分析工作,也降低了安全风险。
  5. 把 SEO 检查写进 Agent 的日常任务。 放入 HEARTBEAT.md 让 Agent 每天主动跑一次,你只需要看结果和行动建议,真正实现「问一句话,搞定所有站」的工作流。