| name | doubao-chat-scraper |
| description | 爬取豆包(doubao.com)对话,纯HTTP API版(无需浏览器滚动),支持分页列表 |
豆包对话爬取(API 版)
命令
API="skills/doubao-chat-scraper/scripts/doubao_api_scraper.py"
$API list
$API list --page N
$API scrape <chat_id>
$API scrape <序号>
$API scrape <起始>-<结束>
$API scrape all
$API status
登录
SCRIPTER="skills/doubao-chat-scraper/scripts/doubao_scraper.py"
$SCRIPTER send <手机号>
$SCRIPTER verify <6位验证码>
登录后 Chrome user-data-dir 中的 cookie 被持久化,API 版通过 Playwright 从 Chrome 提取 cookie。
支持范围
- ✅ 普通对话:
/chat/<chat_id> — 与豆包主模型的对话
- ✅ 智能体会话:
/chat/bot/chat/<bot_id> — 与自定义智能体的对话
- ✅ API 返回标题为空,自动从首条用户消息提取标题
导出
- 路径:
<skill目录>/output/<chat_id>/conversation.md
- 文件:
conversation.md,格式:**角色:** \时间` \n\n内容\n\n---\n`
- 角色名:用户消息显示「我」,回复显示「豆包」
流程
- 登录(首次):用
doubao_scraper.py send/verify 完成登录
- list → markdown 表格展示(
| 序号 | 会话名称 | 链接 |)
- scrape <chat_id> → 直接爬,跳过 list(最快)
- 告知结果(消息条数 + 输出路径)
核心原理
纯 HTTP POST 调用豆包 IM API(requests 库)
- Cookie 提取:通过 Playwright 连接 Chrome CDP(18800 端口)获取 doubao.com 的 cookie
- 会话列表:POST
/im/chain/recent_conv,cmd=3200,direction=2 分页获取
- 消息拉取:POST
/im/chain/single,cmd=3100,direction=1 向上翻页
anchor_index:首次用 max64(9007199254740991),后续用返回消息的最小 index_in_conv
limit=20:每页 20 条
- 连续 3 页无新消息 → 到底
- 消息解析:content_block[10000] = 文本,content_block[10052] = 图片
- Markdown 导出:按 create_time 排序,生成标准格式
性能参考
| 会话 | 消息数 | 耗时 |
|---|
| 26351192501800962 | 1679 | ~21s |
| — | 每页 ~0.5s | 20条/页 |
对比旧版(CDP + 滚动):8~11s 只能拉一屏,历史对话需要持续滚动几分钟。
红线
- 只用
doubao_api_scraper.py 命令行,禁止自己写 Python 操作 requests
- 手机号必须问用户要,不许硬编码
- 登录只用旧版
doubao_scraper.py send/verify,不要自己写登录逻辑
- 列表用短路径
/chat/xxx,三列表格,不带域名
- 登录失败不要反复重试,告知用户重新 send
- 不要删除旧版
doubao_scraper.py,API 版依赖它完成登录
Cookie 过期处理
- API 返回 401 → 告知用户重新登录(用旧版 send/verify)
- Cookie 存储在 Chrome user-data-dir(
/tmp/doubao_chrome_data),登录一次长期有效