账号分析技能红线强化:身份标识禁从MCP账号库回填 + 新增视频列表/账号信息获取执行避坑规则
This commit is contained in:
1 parent
26c707c357
commit
ccdd79ea40
7 files changed
+131
-6
No files matched your search
@@ -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 库**只读参考** | ——(只用于判断,不回填账号表) |
|
||||
Reference in new issue
Block a user