| name | seo-ops |
| description | yakuten (hrtyaku.com) 网站运营/SEO 作战入口。当用户要求:分析 GA/GSC 数据、看流量/排名/搜索词、 出 SEO 报告、推荐 SEO 文章选题、优化 CTR/meta/AEO、内容更新计划、"网站运营" 等任务时触发。 分析由 Claude 本人完成(不调 Gemini;scripts/seo/ai-analyze.mjs 仅为 CI 无人值守备用)。
|
seo-ops — 网站运营/SEO 作战手册
分工原则:数据用脚本拉(机械、可复现),分析和建议由 Claude 直接做(不转包给 Gemini)。
npm run seo:ai(Gemini 脚本)只用于 CI 无人值守场景,日常交互一律 Claude 亲自分析。
0. 数据源与凭证(已接通,直接用)
| 数据源 | 怎么读 | 凭证 |
|---|
| GA4 | MCP 工具 mcp__analytics-mcp__run_report 等,property_id=541902985 | 服务账号 ga-mcp@hrt-yakuten-123456.iam.gserviceaccount.com(已是属性查看者) |
| GSC | npm run seo:gsc → docs/data/gsc-latest.csv(列: query,impressions,clicks,ctr,position,top_page) | 本地 .gsc-credentials.json(gitignored)= gsc-reader@yakuten-seo-20260419.iam.gserviceaccount.com |
| Trends | npm run seo:trends → docs/data/trends-latest.json(geo=CN,词表 trends-keywords.json) | 无需 |
| 策略底稿 | docs/seo-keyword-gap.md(人工 P0/P1/P2 + AUTO-SNAPSHOT 区块) | — |
| 页面清单 | public/llms.txt | — |
GA4 API 陷阱:metrics/dimensions 传字符串数组(["screenPageViews","sessions"]),传 {name:...} 对象会 InputValidationError。
GA4 埋点 Measurement ID G-1E6C28RJFJ 写死在 src/components/overrides/Head.astro,生产自动激活。
GA4 常用配方(date_ranges 用 [{"start_date":"28daysAgo","end_date":"today"}]):
| 要什么 | dimensions | metrics | 备注 |
|---|
| 热门页面 | ["pagePath"] | ["screenPageViews","activeUsers","averageSessionDuration"] | order_bys desc screenPageViews,limit 30 |
| 国家分布 | ["country"] | ["activeUsers","sessions"] | 验证多语种投放是否到达目标市场 |
| 流量渠道 | ["sessionDefaultChannelGroup"] | ["sessions","activeUsers"] | Organic Search 占比 = SEO 大盘健康度 |
| 语言版本对比 | ["pagePath"] + dimension_filter BEGINS_WITH /es/ 等 | ["screenPageViews","bounceRate"] | 逐 locale 看 |
| 日趋势 | ["date"] | ["activeUsers","screenPageViews"] | 看改动前后拐点 |
| 实时在线 | run_realtime_report + ["unifiedScreenName"] | ["activeUsers"] | 偶尔抽查 |
两侧数据的分工:GSC = 进站前(搜索词/排位/CTR),GA4 = 进站后(停留/跳出/路径)。
高曝光词的落地页要两侧对照——排位好+CTR 好但跳出高 = 内容不符预期,光改 meta 没用。
1. 标准分析流程
- 刷新数据(GSC 数据滞后 2 天)。先查新鲜度,同日已拉过就跳过:
ls -la docs/data/gsc-latest.csv(看 mtime 是否今天)→ 过期才跑
npm run seo:gsc && npm run seo:trends && npm run seo:refresh
⚠ 绝不随手跑 npm run seo:ai --dry-run——它会把当日 ai-seo-report-*.md 覆盖成占位符(2026-07-10 实际踩坑)。
- 读数:
gsc-latest.csv + seo-keyword-gap.md 的 AUTO-SNAPSHOT(已算好 top40 + striking distance);
再按上表补 GA4 流量侧(至少:热门页面 + 国家 + 渠道),做两侧对照。
- Claude 直接分析,按下面的「分析框架」产出。
- 写报告:
docs/data/ai-seo-report-YYYY-MM-DD.md + 覆盖 ai-seo-report-latest.md(均 gitignored,含真实搜索词不入库)。首行注释注明 Generated by Claude (seo-ops) + 数据来源与日期范围。
2. 分析框架(按优先级)
- CTR 塌陷(最大机会):position ≤10 且 CTR <1% 的高曝光词 → 逐页改 title/description/直答段。本站标杆 snippet:
药娘用药指南(zh, CTR 19%)、プロギノンデポー 個人輸入(ja, 20%)。
- Striking distance(rank 10–30,曝光 ≥20):小改(h2/内链/描述)即可进前 10,AUTO-SNAPSHOT 已列好。
- 意图-落地页错配:calculator/工具类词落在文章页 → 改落到工具页。
- 内容缺口:有曝光但无对应页/覆盖弱的 query → 推荐新博客选题(走第 4 节规则)。
- AEO:高意图问句词页面顶部加 40–60 字直接回答 + FAQ schema,抢 AI 概览/精选摘要。
- 暂缓项要明说:排 40+ 的通用药名(竞争激烈、曝光小)标注"先不投入",防止精力错配。
多语种纪律:站有 17 个 locale,query 天然分布在各语言。每条行动必须落到具体 locale 的具体页面
(/es/... 而非笼统的"孕酮页");改 meta 只改命中语言的页,勿顺手全语种铺开(i18n 同步另有流程)。
meta 改写标准:description 110–160 字符(与 blog eval 同标准);title 含目标 query 主词 + 一个点击钩子
(数字/年份/直答),不夸大疗效、不用绝对语。
产出格式:一句话诊断 → Top 5 行动表(词/曝光/排位/CTR/落地页/动作)→ 模式归纳 → 区分「机械改写」vs「需要新写内容」→ 若上轮报告存在,附「上轮行动回顾」(同 query 排位/CTR 对比)。
3. 改站与内容更新的硬约束(不可妥协)
- 医学声明必须
<CitationRef> + DOI + 证据等级;无引用 = 不上线。
- 绝不个人化剂量建议、不推荐购药渠道、不削弱急症警告/紧急 banner。
- 无绝对语("一定"→"建议","必须"→"通常")。
- meta/title 改写也算内容改动——不得为了 CTR 夸大疗效或弱化风险。
- 博客以 zh 为主(ja 限日本本地话题);文章创作走
/cto-blog-pipeline(有可循证性硬门槛)。
- 隐私红线:GSC/GA 只含站点自身聚合数据,永不掺入用户健康数据/AI 对话/血检记录。gsc-.csv 与 ai-seo-report-.md 保持 gitignored。
- UI/组件级修改遵守 CLAUDE.md(设计系统 + a11y + i18n skill 门槛)。
4. 推荐 SEO 文章选题时
- 依据 = GSC 真实 query(不臆造搜索词)+
seo-keyword-gap.md P0/P1/P2 优先级 + Trends 热度。
- 每个选题给:目标 query(真实出现的)、建议标题、目标路径、预期落地语言、一句话理由、可循证性判断(能否找到 DOI 支撑)。
- 可循证性不过关的选题直接淘汰,不进推荐表。
- 用户拍板后,创作交给
/cto-blog-pipeline(勿在本 skill 内直接写全文)。
4.5 写文章的配图(gpt-image-2)
选题定稿、正文交给 /cto-blog-pipeline 后,配图这样做。gpt-image-2 现在能可靠渲染文字、多语言、信息图式复杂版面——旧的「图表一律拒绝 LLM 生图」规则(cto-image §26.5)对它已放宽,可放心用于:博客/文档 OG 图、编辑类信息图、概念示意图、图标套装、文字卡片。
gpt-image-2 提示词结构(OpenAI 官方 cookbook):
- 顺序
背景/场景 → 主体 → 关键细节 → 约束,复杂需求用换行分块而非长段落。
- 精确文字放双引号里(或 ALL CAPS),标注字体/字重/颜色/位置("bold sans-serif, dark-teal, centered top third")。生僻词(品牌名)逐字母拼:
Spell the brand: U-T-R-O-G-E-S-T-A-N。
- 文字密集/多字体/信息图 →
quality: high;一般产品图 medium。
- 硬约束收尾防乱码:
Render text verbatim. No extra characters. No duplicate text. No invented logos.
- 尺寸 ≤3840px 长边;OG 用 1536×1024(横)或 1024×1536(竖)。信息图加
clean flat visual system, consistent icon style, clear arrows, readable labels, generous white space。
- 多语言:保留排版只换文字时说
keep typography style, placement, spacing, hierarchy; translate verbatim, no reflow。
- 站点风格:暗色默认走米哈游「二相乐园」(绯色 #C84B7C / 幻月金 #D4A853 / glass morphism);手账皮肤走乐园手账(cream #FFF5E0 / sakura #E5578B)——见 CLAUDE.md Visual Design。
医疗红线(配图同样不可妥协):
- ❌ 带真实数字的图必须走代码组件(
PKCurveChart、DoseTable、血检范围图),不用 gpt-image-2 —— AI 画错剂量/半衰期/坐标轴数值是安全事故,不是画质问题。gpt-image-2 只做「示意/编辑/品牌」类图,不做「承载数据」类图。
- ❌ 配图不得暗示疗效夸大、不得出现购药渠道/商业品牌导流、不得弱化风险。
- ✅ 每张图必须有描述性
alt(无障碍 + SEO);产品示意图 alt 标明是「示意图」。
- ✅ 生成后人工核对渲染出的文字——gpt-image-2 偶尔会加乱码字符或漏字,落库前肉眼确认文案正确(官方硬约束
no extra/duplicate text 是降低概率,不是保证)。
- ✅ 生成后压缩为 WebP/AVIF(>500KB 必压),落
public/images/,OG 图postbuild 由 generate-og-images.mjs 处理。
实际生图仍走 /cto-image 的委派流程(Codex gpt-image-2 asset-in-loop);本 skill 只负责产出符合上述规范的 prompt + 医疗红线把关。
5. 验证闭环
- 改 meta/内容后:
npm run build 通过 + grep dist 确认改动落地(CJK ** 陷阱见 memory)。
- 下一次跑 seo-ops 时对比同一 query 的 position/CTR 变化,在报告中列「上轮行动回顾」。
- 月度 CI:
.github/workflows/seo-refresh.yml 每月 1 号自动拉数据开 PR(需 GitHub Secret GSC_CREDENTIALS_B64;未配则只跑 Trends)。