# X Profile Deep Dive

> 深度分析 X/Twitter 用户画像——通过 tweety-ns 抓取推文、关注和粉丝， 生成中文深度档案（主题分类、内容风格、社交网络）。 Use when: (1) 用户说"深挖 @xxx"/"分析这个博主"/"analyze @xxx", (2) 用户说"看看他都发了什么"/"这个人什么水平"/"值不值得关注", (3) 用户说"扒一扒 @xxx"/"做个 X 账号档案", (4) 用户要求了解某个 Twitter 博主的内容、风格、影响力。 NOT for: 单条推文翻译/讨论（直接处理）、 X 信息流日报/digest（用 x-digest cron 任务）、 发推/点赞/互动操作（用浏览器手动）。 Requires tweety-ns and Twitter cookies.

- Skill: `knownasnaffy/x-profile-deep-dive` (Agent Skill, multi-file: 9 files)
- Install (CLI): `npx skillmds@latest add knownasnaffy/x-profile-deep-dive`
- Raw SKILL.md: https://api.skillmd.com/api/skills/knownasnaffy/x-profile-deep-dive/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: knownasnaffy (https://skillmd.com/u/knownasnaffy)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/knownasnaffy/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 写？」 |

