Pawcast v0.2 · catclaw migration

探索主播

本页 v0.2 · 已按 catclaw 真实代码完整重写。核心机制:进 tiktok.com/live 自动滑卡片 → 提取 username → WebSocket 连接 → 录制视频 → Qwen Vision 14 维度分析 → 一次性 Backstage 批量邀约。所有数据流和字段都和 catclaw 生产代码 1:1 对齐。

v0.2 · catclaw 1:1 14 维度 Qwen Vision TaskRunner 9 屏 + 5 弹窗
00 · FLOW

完整流程总览(与 catclaw 1:1)

这是用户点击「启动探索」按钮后,TaskRunner 实际执行的步骤。代码源自 web/server/tiktok/collectors/scout-collector.ts

1
打开 tiktok.com/live

在 Electron 隐藏 BrowserWindow 中加载 https://www.tiktok.com/live,等待首页加载完成。scout-collector.ts:571-605

2
点击第一个直播间卡片,进入 LIVE 房间

选择器扫描:a[href*="/@"][href*="/live"][data-e2e="live-card"] a 等。点击后等待 6 秒页面加载。

3
5 策略提取 username

① URL regex /@([^/?\s#]+)/ ② DOM data-e2e(live-username/user-card-nickname)③ header 区 /@username 链接 ④ SIGI_STATE / __NEXT_DATA__(Next.js 内部状态)⑤ document.title。scout-collector.ts:149-263

⚠ 失败处理:10 次连续失败 → 重回 /live 首页;2 次同主播 → swipe 卡住,重置

4
WebSocket 连接 LiveMonitor

调用 liveMonitor.connectRoom(username) 建立 tiktok-live-connector WS,捕获 gift / chat / member 事件流。scout-collector.ts:354-361

5
停留 30-60 秒(随机),并行录制视频

用 MediaRecorder 捕取 <video> 元素 captureStream() 录制 WebM,最多 15 秒。scout-collector.ts:368

6
ffmpeg 转码 WebM → MP4

调用 ffmpeg -i input.webm -c:v libx264 -preset ultrafast output.mp4scout-collector.ts:23-62

7
截屏备份

同时调用 BrowserWindow.capturePage() 备份一帧静态图(万一视频转码失败,AI 分析有 fallback)。scout-collector.ts:390-401

8
读取 live_events 数据 + 计算指标

从 SQLite 查询该房间停留期间所有事件(最多 500 条)。计算:观众数 start/end/peak、点赞总数 / 增量、礼物总数 / 总价值 / 分类、弹幕样本(后 30 条)、高光段算法(5 秒桶化 + 权重 gift=3 / chat=2 / 其他=1,取 top 10)。scout-collector.ts:404-431, 118-143

9
Qwen Vision 14 维度分析

主模型 qwen3.6-plus,fallback qwen-vl-max。视频优先,截屏兜底。返回 14 维度结构化 JSON。qwen-vision.ts · DASHSCOPE_API_KEY

10
持久化到 scout_sessions 表

30+ 字段一行:room_id / username / 观众/点赞/礼物指标 / 14 维 AI 字段 / 视频路径 / 截屏路径 / 弹幕样本 / 高光段。scout-collector.ts:461-501

11
获取主播档案(导航到 /@username 页)

解析 nickname / followers / following / likes / bio / avatar_url,upsert 到 broadcasters 表。scout-collector.ts:503-520

12
循环:滑到下一个直播间,重复步骤 3-11

跳过逻辑:已采过的 / skipStreamers 列表 / 连续 3 个已存在 → 重回 /live

13
采完默认 30 个后 → 一次性打开 Backstage 批量邀约

导航 https://live-backstage.tiktok.com/portal/anchor/relation → 30 个 batch → 填 textarea → 点下一步 → 解析返回表格 → 更新 invite_status。backstage-collector.ts:39-198

✓ 旧逻辑(每 30 个就开窗口频繁切换)→ 新逻辑(采完一次性处理 ONE-SHOT),用户体验大幅改善。

01 · TASK CONTROL

启动 / 停止任务面板

触发方式:手动启动 TaskRunner 任务(非定时 cron)。默认单次采集 30 位(DEFAULT_SCOUT_MAX_COUNT = 30)。可暂停 / 重启 / 配置 skipStreamers。

Pawcast · Explorer · Task Controlv0.1.0

探索任务

当前任务 #task_2026_47

RUNNING · 已 12 / 30
已采集
12
已跳过
3
失败
0
Feed 重置
2
正在分析 · @niko_devu
N
niko_devu
抽帧 12/30 · Qwen Vision 评分中...

启动新任务

任务类型
采集上限 maxCount
skipStreamers(已采过的,跳过)
自动从 scout_sessions 表读取所有已采主播 · 当前 248 位
完成后自动 Backstage 邀约 (autoInvite)
采完 30 个 → 一次性打开 Backstage 批量发邀约

本月已采集

248
主播 · 跨 12 次任务
高潜(推荐+强推)42
已发邀约28
已签约6

本月成本

Qwen Vision
¥17.36
DASHSCOPE 调用 248 次
¥0.07 / 主播

历史任务

#task_47 · 当前running
#task_46 · 04-2930/30 ✓
#task_45 · 04-2530/30 ✓
当前任务卡4 个进度数字(已采集 / 已跳过 / 失败 / Feed 重置)。Feed 重置 = 卡住 / 重复主播过多 → 重回 /live 首页继续。
正在分析实时显示当前正在 Qwen 分析的主播 + 进度(抽帧 / 评分中)。让用户看到系统在工作。
scout_then_backstage推荐的复合模式:scout 采完 30 个 → 立即打开 backstage 批量邀约。一站式。
skipStreamers自动跳过已采过的主播。每次新任务从 DB 自动加载列表,无需手动维护。
实现说明TaskRunner 在 worker 进程跑,主进程通过 IPC progress event 推到 UI。stop 走 runtime.stopRequested = true flag,下个循环检测到自动退出。
失败检测10 次连续无法提取 username → 重回 /live;2 次同主播卡住 → 视为 swipe 失败重置。这俩阈值在 catclaw 已被实战验证。
02 · POOL

探索池主页 · 主播卡片

所有 scout_sessions 的卡片瀑布流。卡片显示 14 维度核心评分 + AI 推荐结果(强烈推荐/推荐/一般/不推荐)+ 邀约状态。

Pawcast · Explorer · Poolv0.1.0
主播池 · 248 本月新增 47 位
全部 · 248 强烈推荐 · 18 推荐 · 24 一般 · 142 不推荐 · 64 未发邀约 · 198 已发邀约 · 28 可邀约 · 12 地区不匹配 · 38
强烈推荐 互动 92
M
Mira K.
女 · 26-35 · 中👁 1.2k
Mira K. 24.8k
@mira.k_official
娱乐 跳舞 室内
互动 92 质量 88 参与 very_high 停留 3:24
AI: 上镜稳,节奏感强,编排有原创性,画质好。粉丝增长 18% / 7d。
推荐 已邀约
Y
Yuki S.
女 · 18-25 · 日👁 840
Yuki S.8.4k
@yuki.spring
游戏FPSCosplay
互动 87质量 82参与 high停留 2:48
AI: 镜头互动多,弹幕回应及时,观众停留高。
推荐 可邀约
A
Ace
Ace142.1k
@aceofthestage
音乐说唱
互动 84质量 90参与 very_high礼物 ¥2.4K
AI: 礼物转化高,缺团队配合。
一般 地区不匹配
L
Lila
Lila3.6k
@lila.world
生活
互动 62质量 58
⚠ Backstage 返回"地区不匹配" - 暂不可邀约
显示 4 / 共 248 位 · 滚动加载更多
四种 AI 推荐强烈推荐(绿)/ 推荐(紫)/ 一般(黄)/ 不推荐(灰),来自 Qwen Vision 14 维分析的 recommendation 字段。
邀约状态来自 Backstage 真实返回:可邀约 / 已邀约 / 已关注 / 邀请中 / 地区不匹配 / 不可邀约 / 已拒绝 / 待确认。这些状态从 backstage-collector.ts 解析的真实表格 cell。
14 维度展示卡片顶部展示「性别 · 年龄 · 语言 」(缩写)+ 「分类 + 子类 + 场景」标签。详情看抽屉。
4 项核心评分互动评分 / 内容质量 / 参与度 / 停留时长。互动 + 质量是 0-100 分,参与度是 5 档 enum,停留是分钟。
地区不匹配卡片变灰 + 警告横条,避免重复尝试发邀约(Backstage 已确认不可发)。
实现说明使用 react-window 虚拟滚动,248+ 卡片不卡顿。每张卡片 12 字段读 SQLite + 抽屉详情按需加载。
03 · DETAIL DRAWER

详情抽屉 · 14 维度 + 视频 + 高光段

点击卡片右侧滑入 480px 宽抽屉。包含:14 维度展示(不是 7 维)+ AI 评语全文 + 录制视频回放(mp4 / screenshot fallback)+ 弹幕样本 + 高光段 timeline。所有数据来自 scout_sessions 表的 30+ 字段。

14 维度分 4 组① 基础属性(民族/性别/肤色/年龄/外貌/语言)② 直播内容(分类/子类/场景/标签)③ 评分(互动/质量/参与/推荐)④ AI Summary。
录制视频实际是 mp4 文件,存在 ~/.pawcast/scout-frames/。点击播放可看回放。如果转码失败,会用 screenshot 兜底。
高光段 top 3来自 5 秒桶化算法(gift=3 / chat=2 / 其他=1 权重)。看高光直接定位到精彩时段。
弹幕样本采集期间最后 30 条弹幕。能看出主播的观众调性 + 主播是否回应(catclaw scout-collector.ts:428-431)。
Backstage 状态从 Backstage 表格解析的 6 种状态之一(可邀约 / 已邀约 / 已关注 / 邀请中 / 地区不匹配 / 不可邀约)。catclaw 实战代码。
抽屉数据加载scout_sessions 30+ 字段一次查回;视频路径用 file:// 协议本地播放;不依赖网络。
04 · BACKSTAGE

Backstage 批量邀约(一次性 ONE-SHOT)

采完 30 个主播后一次性打开 Backstage 窗口,filledtextarea 30 个 username → 点击「下一步」→ 解析返回表格 → 更新每个主播的 invite_status。backstage-collector.ts:39-198

批次大小 30BATCH_SIZE = 30 是 catclaw 实战经验值,太小效率低,太大风控易触发。
6 种状态完整解析可邀约 / 已邀约 / 已关注 / 邀请中 / 地区不匹配 / 不可邀约。每个 row 自动落库到 scout_sessions.invite_status
地区不匹配处理这条 catclaw 没发邀约(即使列在 batch 里),TikTok Backstage 自己跳过不算速率。下次新任务自动从 skipStreamers 排除。
关键 Hackfilling textarea 必须用 Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value').set 走 native setter,否则 React 不会感知 value 变化(catclaw 实战踩过坑)。
速率控制批次间 5-10 秒随机延迟。每次任务最多 1-3 个批次(30-90 个主播),单次 5-15 分钟完成。