公众号数据复盘
版本:v1.1.0 · 作者:零一数科
后台导出表格一键复盘:解析预览确认 → 选题归纳确认 → 统计洞察五区块 → 可选 HTML 报告。
解析、统计、归纳、洞察、报告渲染全部在远端服务完成。脚本 scripts/wx_analyze.py 负责全部 HTTP 调用,
接口说明见 references/api.md。你的职责是:收集表格文件、在交互节点等用户确认、把服务端返回的
预览与结论讲给用户听。
执行流程
- 读配置(任何命令之前先做):读技能目录下
config.json;文件不存在就把包内config.json.example复制成config.json再读(模板里BASE_URL已是生产地址https://service.lingyishuke.com,一般不用改,只需补LY_API_KEY)。若config.json里BASE_URL仍是旧地址https://claw.lingyishuke.com/services,就地改成新地址——域名已迁移,且config.json优先级高于config.json.example,升级新包不会自动改它。 - 取 API Key:读技能目录下
config.json的LY_API_KEY(回退环境变量)。缺失按「鉴权」引导获取写入。BASE_URL同文件配置(生产地址https://service.lingyishuke.com),缺失时脚本退出码 2。 - 收集文件:单个/多个
.xlsx/.csv路径,或一个文件夹(Glob 仅顶层扫描*.xlsx、*.csv;检测到子目录提示"如需分析请单独指定",不自动递归)。其它输入形式明确告知"暂不支持,请提供 Excel(.xlsx) 或 CSV(.csv) 文件路径"。边界说明:公开接口能拿到文章级互动指标(阅读、在看、分享、收藏、评论),但阅读数超过 10 万只给封顶值100001,且涨粉、流量来源构成、菜单点击、完读率这些私域口径完全拿不到。数据复盘要的正是精确阅读数与这些私域指标,所以本链路仍以用户上传后台导出表格为准,不能用公众号名字/账号直连替代上传。用户只想按公众号名字看内容体系(选题结构/更新频率/定位一致性)时,改走wx-account-diagnose——那条链路的全量层可由服务端自动获取。 - 上传解析:
data-review submit(同步返回确认预览,本步不扣点)。脚本内部走「申请上传票据 → 表格直传对象存储 → 确认落库 → 只提交上传凭证」,已自动处理,命令与用户操作都不变。 - 确认预览:向用户完整展示预览并等待明确确认(见「节点 1」)。
- 选题归纳:
data-review groupings,展示归类表并问是否调整(见「节点 2」)。 - 扣点确认:告知「生成复盘洞察预计扣 30 点,实际以服务端为准」,等用户明确同意。
- 洞察结论:
data-review insights,五区块一次性输出(见「节点 3」)。 - 报告:固定问「要生成包含趋势图/月度聚合/错位象限散点图的 HTML 报告吗?」,确认后
data-review report。 - 收尾:告知实际扣点(
WX_ANALYZE_POINTS_USED)与报告路径。
脚本定位(任何命令之前先做这一步)
后文命令里的 "$SKILL" 指本技能的安装目录。已知部分运行时(WorkBuddy)不注入
CLAUDE_SKILL_DIR,所以必须按以下顺序解析(成功一级即停,marker 是 scripts/wx_analyze.py):
SN=wx-data-review
SKILL=""
if [ -n "$CLAUDE_SKILL_DIR" ] && [ -f "$CLAUDE_SKILL_DIR/scripts/wx_analyze.py" ]; then
SKILL="$CLAUDE_SKILL_DIR"
else
D="$PWD"
while [ "$D" != "/" ]; do
case "$D" in */$SN|*/"$SN"__skillhub) [ -f "$D/scripts/wx_analyze.py" ] && { SKILL="$D"; break; };; esac
D=$(dirname "$D")
done
if [ -z "$SKILL" ]; then
SKILL=$(find "$HOME/.claude" "$HOME/.codebuddy" "$HOME/.workbuddy" -maxdepth 9 -type d \
\( -name "$SN" -o -name "$SN"__skillhub \) 2>/dev/null | while read -r d; do
[ -f "$d/scripts/wx_analyze.py" ] && echo "$d"; done | head -1)
fi
fi
[ -n "$SKILL" ] && echo "SKILL=$SKILL" || echo "SKILL_DIR_UNRESOLVED"
打印 SKILL_DIR_UNRESOLVED 时:如实告诉用户无法定位技能安装目录并停止。
绝对禁止:猜路径、自行重写脚本逻辑、绕过脚本直接拼 HTTP 请求。
config.json 固定读技能目录,报告默认写到当前工作目录。
鉴权
API Key 取技能目录下 config.json 的 LY_API_KEY 字段,回退环境变量 LY_API_KEY。
脚本请求头使用 Authorization: <api_key>,裸 key,不带 Bearer。config.json 形如:
{ "LY_API_KEY": "你的密钥", "BASE_URL": "https://service.lingyishuke.com" }
- 检查是否已有 key。 读
config.json;没有则看环境变量。任一有值即视为就绪。 - 缺失则引导用户获取。 提示用户前往 https://claw.lingyishuke.com/webapps/01claw-auth/index.html?source=workbuddy 获取 API Key 并发给你。拿到前不要运行脚本。
- 记录用户发来的 key。 写入
config.json的LY_API_KEY字段(保留其它内容),该文件已被.gitignore忽略。 - 鉴权失败(退出码 3)时。 引导用户重新获取并覆盖写入,不要反复用失效 key 重跑。
SSL 证书错误(CERTIFICATE_VERIFY_FAILED 等)可设 LY_SKIP_SSL_VERIFY=1 后重试,仅限受控环境临时使用。
工作流 · 交互节点
节点 1 · 确认预览(必须等确认)
python3 "$SKILL/scripts/wx_analyze.py" data-review submit --files '导出1.xlsx' '导出2.csv'
脚本会逐个文件在 stderr 打一行上传进度(· 上传 导出1.xlsx (123 KB) → 已确认),这是脚本内部的上传流程,
不需要用户做任何额外操作,也不必转述给用户。
同步返回 preview,向用户完整展示以下内容后,必须等待用户明确确认(如"开始"/"继续"/"确认")
才可进入选题归纳,不得跳过或默认确认:
- 列映射表(Markdown 表格):原始列名 → 标准字段 → 匹配方式(
exact/keyword/fuzzy)。非exact的行标注"(请核对)"。 - 各文件行数与合并后总行数;检测到跨文件数值差异时提示"已取较大值合并"。
- 时间范围:起止日期。
- 未识别列与缺失的可选字段:未识别列为空则说明"全部列均已识别";缺失可选字段(在看/转发/评论等)时说明"对应分析项将自动跳过并标注,不影响其余分析"。
- 已有评分产物匹配情况:匹配数 > 0 时列出匹配到的文章标题,说明"这些文章将直接复用已有 7 维评分参与高低对照,无需重新评分"。
min_viable 为 false 时:按 missing_required_fields 列出具体缺失字段(标题/发布时间/阅读量),
提示"该导出文件缺少 {字段} 列,无法满足最低分析门槛,请确认导出的是『内容分析』明细表而非其他报表"。
本轮流程到此结束,不强行继续。
用户要求剔除个别文件或指出列映射错误时,据此调整文件列表重新 submit,或提示用户修正导出文件后重新提交,不强行继续。
节点 2 · 选题归纳与调整
python3 "$SKILL/scripts/wx_analyze.py" data-review groupings --task-id <id>
服务端归纳出 3-8 个选题类型并为每篇文章打标签。用一张 Markdown 表格(列:选题类型 / 篇数)展示归类结果,并询问用户:"以上选题归类是否需要调整?"
- 用户提出修正意见时:把调整后的完整归类写成 JSON 文件(
{"topics": [{"key","label"}...], "article_tags": [{"title","topic_key"}...]}),再执行data-review groupings --task-id <id> --adjust 调整.json(PUT 覆盖,服务端校验类目数量与标签引用)。 - 用户确认或未提出异议:直接进入下一步。不强制等待逐字回复,但归类表格必须完整展示过一次,不得省略。
节点 3 · 洞察结论(一次性产出,先扣点确认)
洞察这一步扣 30 点,运行前完成扣点确认。
python3 "$SKILL/scripts/wx_analyze.py" data-review insights --task-id <id>
读结果 JSON,在同一次响应中按固定顺序输出全部五个区块:
- 概览行:
共 {篇数} 篇 · 时间范围 {起}~{止} · 基准质量:{中文}。基准质量映射:full→ "充分"、limited→ "样本较少仅供参考"、insufficient→ "不充分"。为insufficient时必须明确提示:"当前 {N} 篇文章样本不足以计算滚动基准,以下仅提供描述性统计,不做异常判定",不得假装有可靠基准。 - 异常点列表:表格列为「标题 / 指标 / 倍数 / 方向 / 选题类型」。倍数格式化为"是近期均值的 {ratio} 倍";指标区分"阅读"/"互动率";方向显示"偏高"/"偏低"。异常为空时注明"未检测到显著异常波动",不留空区块。
- 高低对照表 + 错位文章:高/低两组文章标题+阅读量表格及标题层面的差异归纳;已匹配评分的文章额外展示其完整七维分数表;未匹配的注明"如需完整 7 维对照,可用 wx-article-score 为高低组文章补充正文评分"。存在四象限数据时展示"高读低互"/"低读高互"错位文章列表。服务端标记跳过时原样展示其原因文案。
- 选题类型表现表:列为「选题类型 / 篇数 / 平均阅读 / 相对基准倍数」,选题用中文名展示。
- 策略建议:逐条展示
strategy_suggestions的conclusion/evidence/action三段式,用编号列表呈现,逐字引用不改写——evidence里的数字与来源是服务端算好的,不心算、不估算、不换措辞。
节点 4 · HTML 报告(每次都问)
五区块之后固定问:"要生成包含趋势图/月度聚合/错位象限散点图的 HTML 报告吗?"——回答"不要"直接结束,不追问第二次。确认后:
python3 "$SKILL/scripts/wx_analyze.py" data-review report --task-id <id> [--out 目录或文件]
报告为服务端渲染的单文件自包含 HTML,断网可打开,区块与对话结论五段式一一对应。
结果讲解边界
- 只讲产物字段:五区块内容全部逐字引用服务端返回。
- 涉及评分维度时只说:"7 个维度加权、每维证据定档、总分由服务端计算,evidence 与升档差距就是可直接复述的归因。"不展开权重数值与评分方法论细节。
输出交付
成功时 stdout 形如:
WX_ANALYZE_TASK_ID=<任务 ID>
WX_ANALYZE_POINTS_USED=<本次实际扣点,可能为空>
WX_ANALYZE_REPORT_FILE=<报告文件绝对路径>
=== WX_ANALYZE_RESULT_START ===
<结构化结果 JSON>
=== WX_ANALYZE_RESULT_END ===
- 讲结论:按节点顺序讲预览/归类/五区块,不把 JSON 原样丢给用户。
- 告知实际扣点:
WX_ANALYZE_POINTS_USED非空时说「本次任务实际扣除 {点数} 点」;为空时说「本次约扣 30 点(实际以服务端为准,可在 01Claw 账户查看)」。 - 告知报告查看方式:路径见
WX_ANALYZE_REPORT_FILE,可直接双击打开。
退出码处理
| 码 | 含义 | 处理 |
|---|---|---|
| 0 | 成功 | 按「输出交付」处理。 |
| 2 | 输入/配置错误 | 文件缺失或为空、非 .xlsx/.csv、调整 JSON 非法、未配置 BASE_URL。改正后重试,不扣点。 |
| 3 | 缺 key 或鉴权失败 | 按「鉴权」流程引导用户获取新 key 写入 config.json 再重试。不扣点。 |
| 4 | 发起失败,含点数不足 | 展示服务端 message;点数不足时引导用户前往 https://claw.lingyishuke.com/webapps/01claw-auth/index.html?source=workbuddy 充值。不扣点。 |
| 5 | 服务端把任务判为失败 | 转述 stderr 里的 error_message(如表格解析失败、跳步调用)。 |
| 6 | 网络 / 限流 / 服务不可用(含表格直传失败) | 告知网络原因失败,附 stderr 信息,询问是否重试。上传阶段失败时任务尚未发起,不扣点,重跑同一条 submit 即可。 |
| 7 | 完成但结果为空 | 表格可能没有有效数据行,建议核对导出文件后重新提交。 |
| 124 | 轮询超时 | 本链路均为同步接口,正常不出现;若出现附 task_id 重试对应命令即可,不重复扣点。 |
未知状态不要自行判定失败;脚本会原样透出服务端状态,继续按结果处理。
硬性要求
- 不得编造或改动任何分数与统计数字。 基准、倍数、分组、表现对照全部来自服务端返回,不心算、不估算、不改写措辞。
- 报告一律来自服务端渲染。 唯一合法产出方式是
data-review report;绝不自行用 Write 手写 HTML/CSS/图表。 - 不跳过交互节点。 确认预览未确认不进归纳;归类表格必须完整展示过一次;扣点未确认不跑 insights;报告每次都问。
- 样本不足时不假装有基准。
insufficient的提示语必须原样给出。 - 评分解释只用固定话术,不展开维度权重与方法论细节。
Scan to join WeChat group