x-profile-deep-dive
# X Profile Deep Dive
对 X/Twitter 博主进行深度画像分析:数据采集 → LLM 动态分类 → 摘要卡片 + 分类全集输出。
## 前置条件
1. **tweety-ns** 已安装(`pip3 install tweety-ns`)
2. **Twitter cookies** 存在于 `<WORKSPACE>/config/twitter_cookies.json`
3. **tweety session 目录** 存在于 `<WORKSPACE>/config/tw_session/`
首次运行前检查这三个条件。如果 cookies 缺失,提示用户通过 CDP 从 openclaw browser 提取。
## 完整流程
### Phase 1: 数据采集
运行脚本采集原始数据:
```bash
python3 scripts/x_profile_analyzer.py \
--handle {handle} \
--tweet-pages 8 \
--cookies <WORKSPACE>/config/twitter_cookies.json \
--output /tmp/x-profile-raw-{handle}.json
```
参数说明:
- `--tweet-pages 8`:默认 8 页(约 160 条推文),可根据需要调整
- `--following-pages 1`:关注列表采样 70 人(通常够用)
- `--follower-pages 1`:粉丝采样 70 人(可能因 elevated auth 失败,非关键)
脚本退出码:1=cookies missing, 2=login failed, 3=user not found
### Phase 1.5: Articles 专项采集 + 外链探索
**tweety-ns 的 tweet pages 可能采不全 X Articles(长文),且博主可能在外部平台有独占内容。此步骤必须执行。**
#### 1.5.1 X Articles 完整采集
用浏览器打开 `x.com/{handle}/articles`,完整滚动收集所有 Article:
1. `browser navigate` → `x.com/{handle}/articles`
2. **逐段滚动**(每次 `scrollBy(0, 1500)`),每段做 snapshot 记录当前可见的 article 标题+日期+URL
3. **累计去重**:X 使用虚拟滚动(virtual scrolling),会回收不在视口的 DOM 节点。**绝不能用最后一次 snapshot 的 article 数量当总数**。必须在脑中/笔记中累计所有已看到的唯一 article
4. 持续滚动直到**不再出现新 article**(连续 2 次滚动无新增 = 到底)
5. 记录总数,与 Phase 1 采到的 Articles 数量对比,补全遗漏
⚠️ **虚拟滚动陷阱**(2026-03-16 教训):
- X 的 timeline 页面使用虚拟滚动,视口外的 article 元素会被回收
- `document.querySelectorAll('article').length` 只返回当前 DOM 中的数量,不是总数
- 必须逐段滚动 + 手动累计去重,这是唯一可靠的计数方式
#### 1.5.2 外链探索
检查博主 bio 中的外部链接(博客/Substack/Medium/Newsletter/GitHub):
1. 从 Phase 1 的 profile 数据或 README 中提取 bio 链接
2. 如果有博客/Newsletter → 用 browser 打开,找到长文列表页
3. 对比博客长文列表 vs X Articles 列表,识别**博客独占内容**(博客有但 X 没有的)
4. 对博客独占文章快速评估:深度原创 or 短新闻/聚合帖?主题相关度?
5. 在 README.md 中增加「📎 外部平台」章节,记录博客 URL + 独占内容数量 + 推荐收藏清单
### Phase 2: 数据分析
读取输出的 JSON,用 Python 提取关键统计信息(参考 [data-analysis.md](references/data-analysis.md))。
### Phase 3: LLM 动态分类
**核心步骤**——不使用预设分类,而是根据推文内容动态生成分类。
1. 扫描所有推文全文,识别 3-6 个主题分类
2. 每个分类需要:名称(中文)、一句话描述、包含哪些推文
3. 分类原则:
- 按内容主题而非形式分(不要"长文"/"短文"这种分法,除非某人确实有独特的长文系列)
- **X Articles(长文)优先处理**:如果博主有 X Articles,先从 Phase 1.5 的完整 Articles 列表中提取,确保每篇 Article 全文都被收录到对应主题分类中。Articles 是博主最有深度的内容,不能遗漏
- 如果某人有明显的长篇深度文章(>2000字),单独分一类「深度长文」
- 每个分类至少 3 条推文,否则合并到相近分类
- 一条推文只归入一个最匹配的分类
4. 对每条推文的分类排序:按 likes 降序
### Phase 4: 生成输出文件
输出结构为一个目录,包含摘要卡片 + 分类全集:
```
collections/x-profiles/@{handle}/
├── README.md ← 摘要卡片 + 目录导航表
├── {category-1}.md ← 第一个主题分类(推文全文)
├── {category-2}.md ← 第二个主题分类
├── ...
└── network.md ← 社交网络分析
```
#### README.md 格式
参考 [readme-template.md](references/readme-template.md)。包含:
- 📂 内容全集导航表(分类名 + 数量 + 一句话说明)
- 一句话概括
- 基本信息表
- 内容风格
- 高互动推文 Top 10(一行摘要 + 链接)
- 核心话题 Top 5
- 互动圈
- 关注列表分析(兴趣图谱)
- 与我们的关联度(⭐评分)
- 趋势判断
#### 分类文件格式
每个分类文件:
```markdown
# {分类名}
> {分类描述}
共 N 条推文
---
## [X,XXX❤️ X,XXX🔁 X,XXX,XXX👁] YYYY-MM-DD
[原文链接](url)
{推文全文,原样保留,不做任何压缩或摘要}
**附带链接**: {如果有}
---
```
**关键原则:推文全文原样保留,不做压缩。**
#### network.md 格式
参考 [network-template.md](references/network-template.md)。包含:
- 关注列表分类表格(Handle / 名称 / 粉丝 / 简介)
- 网络特征分析
### Phase 5: 汇报结果
完成后向用户汇报:
- 输出目录位置和文件结构
- 几个关键发现/亮点
- **数据完整性校验**:
- X Articles 总数(Phase 1.5 实际计数) vs 分类文件中收录的 Articles 数量 → 必须一致
- 如果有博客等外部平台,报告独占内容数量和推荐收藏清单
- 采样覆盖范围说明(如"最近 N 条推文,约 X 天;Articles 全量 M 篇")
## 注意事项
- **调用频率**:tweety-ns 保守使用,单次分析 < 5 个 API 调用
- **Cookie 过期**:如果登录失败(exit code 2),提示用户刷新 cookies
- **t.co 链接**:国内网络无法解析 t.co 短链接,推文全文已在数据中,不需要追踪外链
- **Python 版本**:系统 Python 3.14 可能有 SSL 兼容问题,确保 tweety-ns 对应的 httpx 版本兼容
- **followers API**:部分用户的 followers 数据会返回 "elevated authorization" 错误,这是非关键数据,跳过即可
---
## 下一步建议(条件触发)
画像完成后,根据结果判断是否推荐下一步。
| 触发条件 | 推荐 |
|---------|------|
| 博主有高质量内容值得长期追踪 | 「这个博主值得加入 X 信息源列表。要加到 x-info-sources 吗?」 |
| 博主的某些推文/文章值得收藏 | 「有几条内容值得单独收藏,用 content-collector 存一下?」 |
| 画像发现博主的方法论可用于公众号选题 | 「这个博主的观点可以做一期公众号文章,用 wemp-ops 写?」 |
标签
skill
ai