账号分析技能红线强化:身份标识禁从MCP账号库回填 + 新增视频列表/账号信息获取执行避坑规则

This commit is contained in:
maogeigei committed 2026-08-31 19:58:33 +08:00
1 parent 26c707c357
commit ccdd79ea40
7 files changed
+131 -6

No files matched your search

@@ -24,8 +24,8 @@ description: "MCN 达人爆款视频解析与人设卡生成技能:达人账
| 6 | 生成账号设定卡片 | 基于功能三产出的 `{达人昵称}账号设定.md`,生成**竖版长图 SVG 信息图**(账号设定卡):深色/浅色长图风、模块映射 12 段人设卡、含内容基因/角色类型库/情绪图/红线清单等模块 | **功能三自动联动(默认)**:产出设定后自动生成,无需单独要求 | `references/feature/06_生成账号设定卡片.md` |
**部署禁用说明**:删除某功能 MD 即禁用对应功能,可连带删除该功能的支撑文件:
- 功能一:`references/浏览器搜索抖音账号操作规范.md`(功能一/二共用,**两个功能都删除时**才可连带删除)
- 功能二:`references/浏览器搜索抖音账号操作规范.md`(同上)
- 功能一:`references/浏览器搜索抖音账号操作规范.md`(功能一/二共用,**两个功能都删除时**才可连带删除)、`references/铁律避坑规则/账号信息获取执行避坑.md`
- 功能二:`references/浏览器搜索抖音账号操作规范.md`(同上)、`references/铁律避坑规则/视频列表获取执行避坑.md`(2026-08-31 新建:defaultDataList 一次拿全含 createTime、搜索路径进主页模拟点击、禁止逐条开视频页)
- 功能三:`references/人设卡生成方法.md`、`references/知识库/账号设定/`、`references/解析结果格式规范.md`(**如功能四/五仍启用,解析结果格式规范需保留**,功能四目录结构以其为准)
- 功能四:`references/账号数据分析方法.md`、`references/知识库/视频拆解/`
- 功能五:解析结果格式规范(**如功能三/四仍启用需保留**)
@@ -45,9 +45,9 @@ description: "MCN 达人爆款视频解析与人设卡生成技能:达人账
| 视频补充规则 | 解析失败或无法解析的视频,从视频数据中按排名规则(点赞+分享降序)取下一位视频补充,直至凑满「视频筛选标准」规定的数量(数量见上「视频筛选标准」唯一权威参数)。 |
| 人设卡方法论 | 必须结合 **脚本创作技能 + 女娲造人术** 两个技能库综合生成,不可仅凭通用知识。**人设卡聚焦内容创作本身(内容基因/打法/情绪/视听/规则/差异化壁垒的内容侧),不含商业化变现路径分析**(商业化/市场分析归功能四账号数据分析)。**人设卡统一 12 段结构**(账号核心定位→内容基因→类型库→情绪结构→视听风格→内容打法→内容规则→系列内容规划→差异化壁垒→红线清单→当前需解决的问题→设定分析说明),详见 `references/人设卡生成方法.md` 5.3。 |
| 账号类型判定 | 生成人设卡前**必须先判定账号类型**,不同类型使用不同模板结构。判定标准见 `references/人设卡生成方法.md`。 |
| 浏览器操作规范(红线) | **执行任何浏览器操作(功能一/二及任何网页获取)前,必须先读取 `references/浏览器搜索抖音账号操作规范.md` 全文**,严格遵守:① 环境前置(清除代理环境变量、固定 9223 调试 Chrome 实例);② **标签页复用(5.5)**——操作前检查已打开标签页,有则 goto_url 直接导航复用,无才 new_tab 新建,用完不关闭;③ 登录检测(弹登录窗口停止操作提示用户);④ 滚动收集技巧(.route-sc 容器)。浏览器要求由插件 prompt 注入与本规范双重保证。 |
| 浏览器操作规范(红线) | **执行任何浏览器操作(功能一/二及任何网页获取)前,必须先读取 `references/浏览器搜索抖音账号操作规范.md` 全文**,严格遵守:① 环境前置(清除代理环境变量、固定 9223 调试 Chrome 实例);② **标签页复用(5.5)**——操作前检查已打开标签页,有则 goto_url 直接导航复用,无才 new_tab 新建,用完不关闭;③ 登录检测(弹登录窗口停止操作提示用户);④ 滚动收集技巧(.route-sc 容器);⑤ **访问账号主页必须走搜索路径→模拟点击进入,禁止直接构造 `/user/{sec_uid}` 地址跳转**;⑥ **视频数据提取首选列表组件 Fiber `defaultDataList`(一次拿全含 createTime),禁止逐条打开 `/video/{id}` 视频页抓字段**(详见规范「提取方法优先级」)。浏览器要求由插件 prompt 注入与本规范双重保证。 |
| browser-harness 依赖(红线) | 功能一/二(浏览器抓取)执行前**必须先检测 browser-harness 是否可用**:检测方法(任一即可判定)——① 可执行文件存在性:`~/.local/bin/browser-harness.exe`(Windows)/ `~/.local/bin/browser-harness`(macOS/Linux);② `command -v browser-harness`(macOS/Linux)/ `where browser-harness`(Windows)有输出。**未安装 → 提醒用户安装**(可跳过:改用三方数据 API / MCP 兜底数据源,但功能一/二浏览器抓取无法执行;同意后安装)→ 执行 `uv tool install --python 3.12 --upgrade --force browser-harness` → `browser-harness doctor` 验证三要素(工具/daemon/Chrome)全绿。技能本体 `~/.dsh/skills/browser-harness/` 随 dsh_MCNProject 仓库分发(换机器自带)。检测与安装细节见 `references/浏览器搜索抖音账号操作规范.md` 第五节。 |
| 账号信息数据源(红线) | 获取达人账号信息(功能一)**必须浏览器优先**:browser-harness 打开抖音网页版访问达人主页提取(昵称/抖音号/抖音ID(sec_uid)/抖音地址/粉丝数/获赞数/关注数/作品数/IP属地/简介等)。**如无必要不用查 MCP 达人信息**——MCP 的 `list_hot_accounts`/`hot_account_detail` 是**内部账号库查询**(MCN 内部维护的达人账号库,含人设/赛道/标签,非抖音页面实时数据;工具命名 hot_accounts 有误导性),**不是功能一数据源**;仅当浏览器无法访问(账号搜索不到/主页打不开等)时才可兜底补充,并须注明数据来源。 |
| 账号信息数据源(红线) | 获取达人账号信息(功能一)**必须浏览器优先**:browser-harness 打开抖音网页版访问达人主页提取(昵称/抖音号/抖音ID(sec_uid)/抖音地址/粉丝数/获赞数/关注数/作品数/IP属地/简介等)。**禁止从任何数据库读取账号字段回填账号表(含身份标识 sec_uid/抖音号/抖音地址)**:工作台库 `mcn-plugin.db` 的 `hot_accounts` 表 = MCP 内部账号库(`list_hot_accounts`/`hot_account_detail`)的**本地副本,读取其数据填表等同违反本红线**;dsh 原库(`~/.dsh/mcn-plugin.db`)同样只读参考。这些库仅用于**流程状态参考**(判断是否已有解析/产出),**不是功能一数据源**;账号表登记(Step 1.0)只占位 账号ID+达人昵称,抖音号/sec_uid/地址等一律留空,**待浏览器抓取后回填**(浏览器抓取到的值才写)。仅当浏览器无法访问(账号搜索不到/主页打不开等)时才可兜底补充,并须注明数据来源。详见 `references/铁律避坑规则/账号信息获取执行避坑.md`。 |
| 赛道标准枚举(29个,**唯一权威**) | 赛道(track/「赛道」键)取值必须属于以下 **29 个赛道**(28 标准 + 1 补充):个人才艺 / 生活vlog / 财富理财 / 二次元 / 居家装修 / 学习教育 / 小剧场 / 数码科技 / 旅行 / 美食 / 美妆(原「化妆美容」统一更名) / 动物 / 亲子 / 汽车 / 情感 / 三农 / 健康医学 / 潮流风尚 / 舞蹈才艺 / 颜值造型 / 人文 / 音乐 / 影视 / 身体锻炼 / 体育 / 明星娱乐 / 游戏 / 其他 / **剧情**(剧情为用户指定保留,不归一)。**不带「赛道」后缀**(如「生活vlog」);人设卡/账号设定「赛道」键取首段(" / " 分隔)后去后缀,不在 29 个枚举内则归一到最接近标准值或置空待确认。本参数只在 SKILL.md 定义(源:`dsh-plugin-dev/references/赛道标准枚举.md`),其他文件引用此处,调整只改本行。 |
| 账号数据分析(功能四) | 独立于人设卡,聚焦「数据表现规律」(内容表现规律/月度趋势/差异化壁垒/商业化空间),产出独立文件 `{达人昵称}账号数据分析.md`,**不与功能三人设卡嵌套**。方法论见 `references/账号数据分析方法.md`。 |
| 数据分析依据(红线) | 功能四所有分析结论必须有明确数据依据:具体到视频标题 + 具体数值。后台私有数据拿不到时(完播率/留存率/GMV等)标「无数据」,**禁止用间接推断或定性描述替代**。 |
@@ -13,7 +13,7 @@
### Step 1.0 账号表登记(前置)
先检查 `达人账号表.xlsx`,输入信息中的账号若不在表中,先添加到表(账号ID自增、抖音号/抖音ID(sec_uid)/抖音地址存文本格式,其余字段留空),再继续获取数据。
先检查 `达人账号表.xlsx`,输入信息中的账号若不在表中,先添加到表:**只占位 账号ID(自增)+ 达人昵称**;抖音号/抖音ID(sec_uid)/抖音地址等身份标识字段**留空,待浏览器抓取后回填**(浏览器抓取到的值才写,存文本格式防科学计数法),其余字段(粉丝数/解析状态/更新时间等)同样留空待补。**禁止从工作台库(`mcn-plugin.db` 的 `hot_accounts` 表 = MCP 内部账号库本地副本)/ dsh 原库 / MCP 内部账号库读取任何字段填表**——身份标识也一样,一律浏览器抓取(红线见 SKILL.md「账号信息数据源」)。再继续获取数据。
### 浏览器搜索抖音账号ID
@@ -89,6 +89,21 @@
**数据提取方式:** 通过遍历页面上 `a[href*="/video/"]` 元素的 React Fiber,向上查找 `awemeInfo` 对象,获取完整的视频数据(含 stats、video、textExtra 等字段),而非仅从 DOM 文本解析。
**提取方法优先级(2026-08-31 实测纠正):**
1. **首选:列表组件 Fiber `defaultDataList`(一次拿全,含 createTime)**——08-26 旧梦留声机 36 条、08-31 俊希 136 条均实测通过:
- 从 `#root` 的 `__reactContainer$` / `__reactFiber$` 键向下遍历(child/sibling 链),找 `memoizedProps.defaultDataList` 数组,每条含 `awemeId / desc / createTime / stats(diggCount 等驼峰) / textExtra`
- **`createTime` 只有这个来源可靠**:逐卡片 `awemeInfo` 的 createTime 在列表页可能缺失(undefined 被 JSON.stringify 省略),`defaultDataList` 是全量组件数据,136/136 含 createTime
- 统计字段是**驼峰式**:`stats.diggCount / commentCount / shareCount / collectCount / playCount`(不是 snake_case 的 `digg_count`)
2. **兜底:卡片 Fiber `awemeInfo`**——逐卡片提取 `awemeInfo.video.duration`(毫秒)等 defaultDataList 可能缺的字段;两者按 awemeId 合并:defaultDataList 提供 createTime/stats,卡片提供 duration
3. **禁止**:逐条打开 `/video/{id}` 视频页抓发布时间——15 次跳转是明显爬虫特征,且低效;正确路径是主页一次滚动 + Fiber 一次提取
**访问账号主页(2026-08-31 实测纠正):**
- **必须走搜索路径**:`https://www.douyin.com/search/{账号ID}?type=user` → 搜索结果中定位用户卡片 → **模拟点击进入主页**(CDP `Input.dispatchMouseEvent` mouseMoved→mousePressed→mouseReleased,或 `click_at_xy`),**禁止直接构造 `/user/{sec_uid}` 地址跳转**
- 搜索结果卡片链接带完整参数(如 `/user/{sec_uid}brjmRxiM9i`),直接构造缺后缀的地址会访问异常;且频繁直达地址 = 爬虫特征
- 标签页复用:先在已有标签页上导航,不新建(见 5.5 标签页复用规则)
**提取的视频字段(13列标准):**
| 列序 | 字段 | 说明 | 数据来源 |
@@ -0,0 +1,57 @@
# 视频列表获取执行避坑(功能二)
> 与 `浏览器搜索抖音账号操作规范.md` 配合使用;本文记录功能二(获取视频列表)执行中踩过的坑与纠正。
---
## 一、数据提取方法优先级(2026-08-31 纠正)
### 坑 1:逐条打开视频页抓字段 = 爬虫特征 + 低效(严重)
**现象**:俊希全流程测试 TC-04 时,发现列表页逐卡片 `awemeInfo` 拿不到 `createTime`(undefined 被 JSON.stringify 省略),于是改成**逐条 `goto_url("https://www.douyin.com/video/{id}")` 打开视频页**抓「发布时间」文本。结果:15 次连续跳转明显是爬虫特征,且耗时极长、方法退化。
**根因**:08-26 旧梦留声机已验证的 **`defaultDataList` 方法(一次拿全含 createTime)没有固化到技能文件**,本次执行时凭记忆退化。
**正确方法(实测通过)**:
| 数据 | 来源 | 说明 |
|------|------|------|
| createTime / stats / desc | **列表组件 Fiber `defaultDataList`**(首选) | 从 `#root` 的 `__reactContainer$`/`__reactFiber$` 键沿 child/sibling 链遍历,找 `memoizedProps.defaultDataList`;136 条全含 createTime |
| duration(毫秒) | 卡片 Fiber `awemeInfo`(兜底) | `awemeInfo.video.duration`;defaultDataList 里可能为 null,两者按 awemeId 合并 |
| 其余统计字段 | 两来源均可 | **驼峰式**:`diggCount/commentCount/shareCount/collectCount/playCount`,非 snake_case |
**执行要点**:
1. 主页滚动加载(`.route-sc` 容器,随机节奏,≥60 条或加载不出即停)
2. 一次 Fiber 提取全量 → 合并 → 生成 13 列 Excel(发布时间列 = `createTime` 转 `YYYY-MM-DD`)
3. 再走 `excel_tool.py select-top6` 筛选(依赖「发布时间」列)
### 坑 2:访问账号主页直接构造地址(严重)
**现象**:直接 `goto_url("https://www.douyin.com/user/{sec_uid}")` 跳转主页,页面加载异常(标题缺昵称、无视频链接、无 `.route-sc` 容器);且真实链接带完整参数后缀(如 `...brjmRxiM9i`),构造缺后缀地址访问异常。
**正确方法**:
1. 先 `goto_url("https://www.douyin.com/search/{账号ID}?type=user")` 走搜索页
2. 搜索结果中**定位目标用户卡片**(用 innerText 匹配 抖音号/粉丝数 特征,如 `JJX0827`+`281.9万`)
3. **模拟点击进入主页**:CDP `Input.dispatchMouseEvent`(mouseMoved → mousePressed → mouseReleased)或 `click_at_xy`;点击后可能新开标签页(target=_blank),从 `Target.getTargets` 找新主页标签页继续操作
4. 禁止直接构造 `/user/{sec_uid}` 地址跳转
---
## 二、数据校验速查表
| 检查项 | 标准 | 异常处理 |
|--------|------|---------|
| 发布时间列填充率 | 100%(defaultDataList 全含 createTime) | 若大量为空 → 检查是否用了逐卡片 awemeInfo 而非 defaultDataList |
| 时长填充率 | 100%(卡片 awemeInfo.duration 毫秒) | 合并逻辑遗漏 → 按 awemeId 补合并 |
| 视频条数 | ≥60 条(SKILL.md 唯一权威参数) | 滚动加载未触发 → 检查 `.route-sc` 容器定位 |
| 统计字段 | 驼峰式(diggCount 等) | 若全 0 → 检查字段名是否误用 snake_case |
---
## 三、浏览器行为准则速记
- ✅ 标签页复用:已有抖音标签页直接 goto_url 导航,不 new_tab
- ✅ 访问主页走搜索 → 模拟点击;不构造直达地址
- ✅ 数据提取一次 Fiber 拿全;不逐条开视频页
- ✅ 适度访问:随机停留/滚动节奏,不连续快速跳转
- ❌ 禁止:new_tab 堆积、直达 `/user/{sec_uid}`、逐条 `/video/{id}`、无间隔连跳
@@ -0,0 +1,34 @@
# 铁律避坑规则(功能一:获取账号信息)
> 本文件记录账号信息获取(功能一)执行过程中踩过的坑和沉淀的解决方案,防止重复犯错。
> 与「账号设定执行避坑.md」(功能三)、「账号数据分析执行避坑.md」(功能四)互为镜像,结构一致。
## 一、工具/工艺类
| # | 问题现象 | 根因 | 解决方案 | 沉淀状态 |
|---|---------|------|---------|---------|
| 1 | (预留) | | | |
## 二、数据质量类
| # | 问题现象 | 根因 | 解决方案 | 沉淀状态 |
|---|---------|------|---------|---------|
| 1 | 账号表登记(TC-01)时直接用工作台库 `mcn-plugin.db` 的 `hot_accounts` 表读取 sec_uid/抖音号/地址填表,被用户指出「为什么又走到 MCP/库去了」 | ① **就近取数惯性**:模型遇到填表需求优先找现成数据(库读取成本低、看起来权威),而非走浏览器实时抓取(成本高);② **规则覆盖缝隙**:SKILL.md L50 红线约束的是「获取达人账号信息(功能一)」抓取流程,Step 1.0 只说「存文本格式」未规定**身份标识(sec_uid/抖音号/地址)的数据来源**,登记占位阶段钻了空子;③ **同源性未识别**:`hot_accounts` 表 = MCP 内部账号库(`list_hot_accounts`/`hot_account_detail`)的本地副本,绕道读 db 拿到的是同一份内部账号库数据,形式上"没碰 MCP"实际同源违规;④ 前置检查(P4 MCP 可用性)在 TC-01 阶段就调 MCP 工具(auth_status),加剧用户观感 | ① **登记只占位 账号ID+达人昵称**,身份标识一律留空待浏览器抓取后回填;② 红线明确「禁止从任何数据库读取账号字段回填账号表(含身份标识)」,`hot_accounts` 表 = 内部账号库本地副本,读其数据等同违反红线(已固化 SKILL.md「账号信息数据源」红线 + feature/01 Step 1.0);③ 库仅用于**流程状态参考**(判断是否已解析/产出),不是账号数据来源;④ MCP 工具调用严格限定在 TC-05 视频解析环节,前置检查只确认可用性,TC-01 登记阶段不调用 MCP 工具 | 已沉淀为本规则(2026-08-31 强化) |
## 三、流程/规范类
| # | 问题现象 | 根因 | 解决方案 | 沉淀状态 |
|---|---------|------|---------|---------|
| 1 | 账号数据来源规则分散在 SKILL.md/feature/浏览器规范多处,无统一避坑记录 | 功能一/二无独立避坑文件 | 新建本文件(功能一避坑),与功能三/四避坑文件并列;数据来源红线唯一权威定义在 SKILL.md,本文件只记录案例与根因 | 已沉淀为本规则 |
---
## 快速参考:数据来源红线速查
> 权威定义:SKILL.md「账号信息数据源(红线)」;执行流程:`references/feature/01_获取账号信息.md` Step 1.0。
| 数据 | 允许来源 | 禁止来源 |
|------|---------|---------|
| 账号身份标识(抖音号/sec_uid/抖音地址) | **浏览器抓取**(browser-harness 访问抖音主页) | 工作台库 `mcn-plugin.db`(hot_accounts 表 = MCP 内部账号库本地副本)、dsh 原库、MCP `list_hot_accounts`/`hot_account_detail` |
| 账号统计数据(粉丝/获赞/关注/作品/IP/简介) | **浏览器抓取**(网页实时值) | 同上(MCP 兜底仅限浏览器无法访问时,须注明来源) |
| 流程状态参考(是否已解析/已生成) | 工作台库/dsh 库**只读参考** | ——(只用于判断,不回填账号表) |