TH01_maintenance/.codex/tasks/twitter-monitor-mvp.md
2026-05-30 23:30:55 +08:00

87 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Twitter Monitor MVP
日期2026-05-16
状态completed
## 背景
用户要求在 Steam MVP 已完成的基础上,新增 X.com/Twitter 玩家反馈采集与处理功能,目标源为 `https://x.com/Tohotopia`,采集范围为所有帖子以及所有回复,首轮全量,增量按时间,继续复用 `RawItem -> raw_items -> OpenRouter -> analysis_results -> work_items -> dashboard` 流程。
## 需求确认
- 做什么:接入 X.com/Twitter 账号 `Tohotopia` 的账号帖子和每帖回复采集,归一为 `RawItem` 并进入现有同步、分析、dashboard 流程。
- 不做什么:不改 dashboard 的核心数据结构;不把 Twitter 私有字段提升为 dashboard 查询字段;不在未登录时伪造空结果。
- 成功标准本机登录态可用时CLI/同步能采集 Twitter 帖子与回复并入库去重,新增内容可进入 OpenRouter 分析和 dashboard 展示。
- 关键约束X.com 当前页面/API/登录态属于动态事实,先以本机 smoke test 验证;采集失败不得删除旧数据。
## 文档/代码预读
- Project AGENTS新渠道单独封装采集、解析、限流、登录态和失败处理运营判断必须可追溯到平台、原始链接、采集时间或批次。
- Relevant docs`README.md``任务/方案/后续社区平台接入指南.md` 明确新平台采集器输出 `app.models.RawItem`,复用三层数据模型。
- Relevant code`app/sync.py` 当前只采 Steam`app/models.py``RawItem` 可容纳 Twitter 数据;`app/db.py` 已有 `raw_json``(source, source_item_id)` 唯一键。
- 已确认事实:已有 `social-media-scraper` skill 支持 X.com 用户时间线和单帖回复,通过已登录 Chrome/CDP profile 拦截 API 输出 JSON/CSV。
- 冲突 / 歧义:用户不确定是否需要登录态;本机 smoke test 已验证当前 profile 检测到 X.com 登录提示。
## 术语与冲突
- Resolved termsTwitter/X 平台标识在代码中使用 `twitter` 作为配置前缀;来源类型使用 `twitter_posts``twitter_replies`
- Conflicts无。
- Follow-up CONTEXT / glossary updates暂无项目级 `CONTEXT.md`,本次术语记录在任务文档。
## 当前计划
- [x] T1 预读文档与现有 Steam 流程代码。
- [x] T2 验证 X.com 目标页与可用采集工具前提。
- [x] T3 制定 Twitter 接入方案和数据映射。
- [x] T4 实现采集器与同步流程接入。
- [x] T5 补充 CLI/配置/文档与任务记录。
- [x] T6 运行 smoke test 验证入库、分析与 dashboard。
## 关键判断与证据
| 判断 | 类型(稳定原理/当前事实/推断) | 证据 | 验证时间 | 未验证项 | 决策影响 |
|------|--------------------------------|------|----------|----------|----------|
| 新平台应输出 `RawItem` 后复用同步链路 | 稳定原理 | README、后续社区平台接入指南、`app/models.py` | 2026-05-16 | 无 | 避免 dashboard 直接依赖 Twitter 私有字段 |
| X.com 当前采集需要登录态 | 当前事实 | `social-media-scraper` 未登录提示;登录后小样本抓到 18 条 | 2026-05-16 | 全量回复数量和耗时 | 实现必须显式处理未登录失败并给出前置条件 |
| 复用已有 CDP 采集脚本比重写 X.com API 更稳妥 | 推断 | 已有 skill 支持 UserTweets/TweetDetail登录后项目同步入口成功入库并分析 | 2026-05-16 | 全量耗时 | 新增项目内适配层读取 JSON 并转 RawItem |
## 执行记录
- 14:00读取 `AGENTS.md``README.md``.codex/tasks/steam-monitor-mvp.md``任务/方案/后续社区平台接入指南.md`,确认新平台接入规则。
- 14:05读取 `social-media-scraper` skill确认 X.com 用户时间线和单帖回复已支持,输出位置可指定。
- 14:10运行 `python C:\Users\jiajiankun\.codex\skills\social-media-scraper\scraper.py https://x.com/Tohotopia --max-no-new 1 --output-dir 任务/验证/twitter-smoke`,结果为当前 Chrome profile 未登录 X.com。
- 14:25新增 `app/twitter.py`,将 `social-media-scraper` 输出的 timeline/thread JSON 转为 `RawItem`,内容类型为 `twitter_post` / `twitter_reply`,来源为 `twitter_posts` / `twitter_replies`
- 14:35扩展 `app/config.py``app/sync.py``app/cli.py``app/main.py`,支持 `TWITTER_ENABLED`、平台级同步、Twitter 单平台 CLI、dashboard 类型筛选。
- 14:42更新 `.env.example``README.md``requirements.txt`,补充 Twitter 登录前提、配置和依赖。
- 14:50修正 Twitter 增量高水位,从“最近同步完成时间”改为“已入库 Twitter 内容的最大发布/采集时间”,避免漏掉发布时间早于同步结束时间的内容。
- 14:55验证 `python -m compileall app` 通过;默认配置 `python -m app.cli sync --platform twitter` 返回 `twitter_skipped=1`;临时启用 Twitter 后返回 `twitter_errors=1``sync_runs.status=partial`,未插入空 Twitter 数据。
- 19:17用户在 CDP Chrome profile 登录 X.com 后,运行 `social-media-scraper` 小样本验证,抓到 18 条 `Tohotopia` 时间线内容。
- 19:21运行项目同步小范围验证`TWITTER_ENABLED=true``TWITTER_INCREMENTAL_MAX_NO_NEW=1``TWITTER_THREAD_MAX_NO_NEW=1``TWITTER_INCREMENTAL_REPLY_PARENT_LIMIT=2``python -m app.cli sync --platform twitter`。结果:`twitter_fetched=26`、新增 22、分析 22、已见 4。
- 19:25数据库确认 Twitter 已入库 18 条 `twitter_posts` 和 4 条 `twitter_replies`;最近同步 `id=12` 状态为 `success`
- 19:24-19:51用户设置 `TWITTER_ENABLED=true` 后启动 `python -m app.cli sync --platform twitter --full`。命令被用户中断后仍有进程存活但 30 秒内无文件增长、CPU 几乎不变,判断为不再推进。
- 19:53停止残留全量进程 `pid=81152`,将 `sync_runs id=13``running` 标记为 `partial`,保留已入库数据。最终 Twitter 数据为 34 条主帖、139 条回复,共 173 条,分析状态全部 `done`
## 当前状态
- 已完成:文档/代码预读X.com 登录态前提验证Twitter 采集适配层、配置、同步、CLI、dashboard 文案和文档更新;编译、未登录失败路径、登录后小范围端到端验证。
- 阻塞:无。
- 下一步:如需执行“所有帖子及所有回复”的首轮全量,启用 `.env``TWITTER_ENABLED=true` 后运行 `python -m app.cli sync --platform twitter --full`
## 五层变更候选
- 无。
## 恢复入口
下次继续时先读:
- 关键文件:`app/twitter.py``app/sync.py``app/config.py``app/cli.py``app/main.py`
- 当前目标:把 `https://x.com/Tohotopia` 的帖子和回复接入现有 RawItem 流程。
- 当前状态实现已完成X.com 登录态已写入 CDP profile小范围同步成功一次全量同步被中断后已清理残留进程并保留 173 条已分析数据。
- 最近完成:清理全量残留进程,将 `sync_runs id=13` 标记为 partial。
- 下一步:如需继续全量,可再次运行 `python -m app.cli sync --platform twitter --full`,现有去重会跳过已入库内容。
- 不要做:不要把未登录导致的失败当作“无数据”;不要改 dashboard 数据模型。
- 已改文件:`.codex/tasks/twitter-monitor-mvp.md``app/twitter.py``app/config.py``app/sync.py``app/cli.py``app/main.py``.env.example``README.md``requirements.txt`
- 验证结果:`python -m compileall app` 通过;默认 Twitter 未启用会跳过;未登录会 partial登录后项目同步成功当前 Twitter 共 34 条主帖和 139 条回复173 条全部 `done`
- 当前阻塞:无。