云电脑评论触达机制 · 0→1 复盘

通道:阿里无影云电脑(Windows)+ 抖音 PC 客户端 GUI 自动化 · 脚本 douyin_comment_grounded.py · 实测机 野荞 2560×1600
阶段:手动版端到端跑通(未接 claim / 去重 / 队列 / 节流)· 记录日期 2026-06-03
定位:本页讲评论触达机制本身(技术上即「反向评论」);该机制现用于潜在用户二次触达,当前操作见 部署 + 操作指南

一、第一个案例:从「不知道能不能发」到「真发出一条」

背景

反向评论(去目标用户视频底下评论触达)此前只有 Android ADB / 已停的 iOS WDA 两条通道。 云电脑此前只用于发私信。抖音 PC 客户端能不能在视频评论区发评论,完全没验证过—— 早期判断里「profile 视频 grid + 评论区是 webview,对自动化不可见」一度让这条路被打上问号。

验证(spike)

先写最小可行性脚本 _probe-reverse-comment.py,纯 GUI、不碰 DB,逐步走 + 每步截图, 目的只回答一个问题:PC 客户端到底能不能发评论。结论:

✅ 能 评论框是真输入框(不是吃不进字的死 webview), SendInput 直键能打进去、能发出。spike 阶段在 @梦想的天空分外蓝 的视频下成功发出第一条测试评论「测试一下评论」。

首条真实业务评论

目标:@峥宇60km/小时(OCR 身份门 conf 0.98 通过)
评论:「你好,峥宇60km小时哥。装修吵了半年确实够呛,价格透明才能少扯皮。你方便发个+v号过来吗 我让设计师加你,价格上能再让一档。」
结果:真发出 ✓(人工刷新评论区气泡确认)

这条同时验证了完整链路:搜人 → 身份门 → 开视频 → 暂停 → 评论区 → 长文案 SendInput → 发送。

二、0→1 逻辑原理图

两层执行:本机(Mac)备料 + 投递,无影(Windows)做抖音 PC 客户端的 GUI 自动操作。

① 本机 Mac · 备料 + 投递
备 CSV真实昵称 + 评论文案
传无影paste.rs / gzip+base64 剪贴板
② 无影 Windows · douyin_comment_grounded.py 自动执行(每条循环)
硬拉前台AttachThreadInput
+ SW_MAXIMIZE
搜人固定坐标导航
OCR 身份门防同名错评
开第一条视频VL 定位
空格暂停防自动跳下一条
切「评论」tabVL 定位
点评论框固定坐标 798,949
SendInput 打字绕剪贴板 + IME
VL 定位发送长文案位置会变
发出 + Esc60s 后下一条
③ 收尾 · 人工核对
以抖音评论区实际气泡为准核对实发 脚本只点发送、不程序化判定;短名/同名重点查

关键设计原则(为什么这么搭)

原则原因
大元素 VL / 小元素固定坐标搜索框/视频/评论 tab 大而独立,VL 定位稳;评论框/发送键小而密集,VL 飘 → 实测固定坐标。
OCR 身份门按昵称搜索会撞同名,公开评论错人代价大 → 进主页先核对昵称,不符就跳过不评。
SendInput 直键无影剪贴板对抖音 Ctrl+V 失效、中文 IME 抢首字 → 逐字 unicode 直键绕开两个隐藏层。
先暂停视频视频播完自动跳下一条,不暂停则打字期间可能评到别的视频。

三、执行统计 + Badcase 与优化

⚠️ 诚实标注:截至 2026-06-03 仅完成 spike + 小样本测试尚未跑大批量。 下方统计为实测小样本,「大批量统计」一栏待真实批量后回填,未编造数字。
1
spike 测试评论发出
1
真实业务评论发出(峥宇)
~4
测试 contacts 跑过
待回填
大批量发出量 / 命中率

小样本里观察到的分流:数字号昵称 → 身份门拦下(wrong_user);无作品/定位失败 → no_works; 身份门通过 + 暂停 + 评论 → sent。漏斗各档真实占比需大批量才有意义。

Badcase 清单(全部实测踩到,按类别)

类别 / 现象优化方式进展
SendInput 文字漏进终端/桌面 根因=打字时前台不是抖音。后台进程 SetForegroundWindow 被 Windows 静默拒 → AttachThreadInput 绕开;拉前台用 SW_MAXIMIZE不能用 SW_RESTORE,会缩小窗口→坐标落桌面)。 打字前打印前台标题做诊断。 已修复
发送键点空(长评论框变高) 短评论发送键在 px(2519,1520);长评论换行后挪到 ~px(2534,1541),固定坐标偏上点空(文字进了框却没发)。 → 打完字 VL 现场定位「红底白字 发送」文字按钮,固定坐标兜底。 已修复
视频播完自动跳下一条 → 评论发错视频 开视频后 space 暂停,再去评论区。 已修复
nickname 填数字抖音号 → 身份门必拦 身份门按昵称子串匹配,数字号拿不到人类昵称。→ CSV nickname 列填真实显示昵称 已规范
短昵称 / 同名大号身份门模糊放行 → 评错人 0.95 阈值对短名(≤3 字)会放过不同人(如「小嘟→嘟妹」)。 建议:短名收紧到精确相等 / 要求目标名是 seen 子串。当前靠人工气泡核对兜底。 兜底中 · 待收紧
旧版 douyin_dm_grounded 缺符号 → AttributeError 崩 无影上是 6/1 版,没有 6/3 才加的 C_WORK_FIRST/_has_works_on_profile。 → 新脚本自定义同名 env 常量,不依赖 dm 模块新符号。 已修复
paste.rs 在无影下载卡死(中国区) 脚本传输改 gzip+base64 → 剪贴板(~7KB,gzip CRC 自校验完整);CSV 仍走 paste.rs(偶发,重试)。 已缓解
无影剪贴板截断 / 首字符被吞 gzip 压到 ~7KB 单次可粘;部署命令开头留一个空格防吞掉首字符 $ 已缓解
无影分辨率自适应漂移 → 固定坐标全偏 2560×1600(关分辨率自适应 + 全屏别缩放窗口)。 已修复
`✅ 已点发送` ≠ 真送达 脚本只点发送、不程序化判定(VL 自检在本机假阴性严重,已弃用)。→ 铁律:以评论区气泡人工核对 人工兜底

四、下一步待做优化

彻底自动化怎么实现(目标态:0 人工值守)

把上面 8 条优化串起来,就是一条 pull-based 公告板 全自动闭环——复用 DM 通道已跑通的 dispatch_queue + 云电脑常驻 poller 模型,没有任何节点持有云电脑的直连。 核心纪律(全局规则 #5):非语言任务(claim / 去重 / 节奏 / 重试 / 发出判定 / recheck)一律确定性代码,LLM 只做打分和文案。

① 候选 + 文案(Vercel Cron,自动)
analyze 打分高意向评论
LLM
入 reverse_comment_queue候选自动入队
确定性
Langfuse 生成评论按视频文案+画像
LLM+自检门
claim + 去重锁(org,user)
NOT EXISTS 守卫
② 派单(Vercel Cron · 确定性节奏门)
按节奏门派单 → reverse_dispatch_queue 随机间隔 + 日上限 + 活跃窗 + 限频 halt(全确定性,不问 LLM)
↓ 公告板(Supabase),云电脑主动来抢,无直连
③ 云电脑常驻 poller(60s 轮询,自动)
claim_dispatch 抢锁抢一条派单
调 douyin_comment_groundedGUI 自动发(已跑通)
程序化判定真发出查评论区自己气泡
complete + 去重串 mark_contacted
④ 兜底(Vercel Cron + 监控,自动)
recheck 回查评论被删/折叠→标 silent_dropped + 账号 halt
失败重试确定性重试 / 升级,非 LLM
异常自愈 + Lark P0崩溃 wrapper 重启 + 告警

职责划分(谁管什么)

角色负责
LLM只做两件:意向打分(analyze)+ 评论文案生成(Langfuse,带自检门防杜撰)。其余一概不碰。
确定性代码claim 锁 / 去重守卫 / 节奏节流 / 派单 / 抢锁 / 发出判定 / 重试升级 / recheck / 身份门收紧 / halt / 自愈。
目标态 0 操作:只看监控告警 + 周期抽检命中率/错评率。前期保留人工气泡抽检直到程序化判定稳。

分阶段落地(从现在 → 全自动)

阶段能力人工
现在 · 手动版 已到 CSV 直发,GUI 全自动跑完一批;身份门防错评。 备 CSV + 气泡核对
半自动(todo 1·2) 接 reverse_comment_queue + claim 去重 + 节奏门 + pull-based 派单。候选/文案自动备好,云电脑自动抢着发。 仅气泡抽检
全自动(+ todo 4·5·身份门收紧·自愈) 程序化判定真发出 + recheck 删除核查 + 异常自愈 + 短名身份门收紧。闭环去重,无需人工核对。 0 值守
🔒 全自动前置安全闸(不可省):① 身份门短名收紧到精确相等(错评公开可见、代价大); ② 程序化「真发出」判定必须先验证可靠(取代当前人工气泡核对),否则会污染去重账本(评错人却标已联系=烧线索); ③ 节奏/限频确定性门到位(评论限频被风控 halt)。三闸不齐不开 0 值守。

关联:skill send-cloudpc-comment · 脚本 worker/scripts/wuying-dm/douyin_comment_grounded.py · 踩坑详录 memory feedback_wuying_gui_fixed_coords_over_grounded.md(点 21-27)。