在用户那条高意向评论下直接回复(真 RC),跑在无影云电脑的抖音 PC 客户端上。盲调 7 版"打字进不去",最后发现字一直都进得去——是 AI 视觉判定在说谎。
PM 2026-06-06 拍板的触达术语体系里,RC(反评)= 在用户发出的那条高/中意向评论下面直接回复,回复出现在源视频的评论楼里——用户有抖音通知、楼里其他潜在客户也看得见,是曝光效率最高的公开触达。
| 通道 | 动作 | 出现在哪 | 脚本 |
|---|---|---|---|
| DM 首触 | 私信打招呼 | 对方私信箱 | douyin_dm_grounded.py |
| RC 楼中回复(本文) | 回复 ta 的意向评论 | 源视频评论楼 | douyin_rc_reply_grounded.py |
| 二次触达 | DM 没回 → 去 ta 自己的视频下评论 | 对方自己的视频 | douyin_comment_grounded.py |
为什么导航这么绕:抖音 PC 客户端没有地址栏,视频 URL、snssdk:// 深链都打不开,唯一稳的路径是搜源账号名进主页再认视频。每一步"认对没认对"都由视觉模型(Qwen VL)看截图判定,配了防同名、防错楼的双因子核对(昵称 + 内容片段)。
整个上午 + 下午共九个版本。看起来是输入问题,结果导航早就全通,真正的敌人换了三次。
| 版本 | 改了什么 | 结果 |
|---|---|---|
| v1-v4 | URL直达 / 降级搜源账号 / 底部框聚焦 / 回车发送,文字输入走 SendInput 直键(私信框同款,当天 DM 成功 26 次) | 判"打字进不去" |
| v5 | 加"正向校验":发送前先让 VL 看截图确认框里有字 | 拦下 2 条"假 sent"(后来证明拦错了) |
| v6 | 点「回复」后不再重复点框/抢前台(怀疑把焦点弄丢) | 仍判"没进框" |
| v7 | 输入改剪贴板粘贴(Ctrl+V):怀疑评论框是网页输入框只认 paste 事件 | 仍判"没进框" |
| 🔬 手工实验(30 秒,定案):人坐在云电脑前手动点「回复」→ Ctrl+V 能进字、直接打字也能进字。字从来都进得去,是"判定"环节在说谎——全屏 2560×1600 截图里那行小字,视觉模型根本看不清,一直回答"框里没字"(假阴性)。DM 流 5/31 踩过同款坑并修过(裁剪放大后再判),RC 脚本没抄这个作业。 | 真相反转 | |
| v8 | 判定截图从全屏改为回复框区域裁剪放大图 | 粘贴一次进框✓,但发送复核又误杀 |
| v9 | 发送复核从"框里是否残留文字"(按完回车截图拍到刚发出的气泡也算"有字"→假阳性)改为正向问"框是否恢复灰色占位提示"+多等 1.5s | 链路全通 |
| v10 | 双道发送复核:占位态判定 fail 后,再到评论楼里直接找刚发出的回复气泡(看结果不看输入框),两道都 fail 才记 send_fail——"真发了却报 fail"的窗口进一步压缩 | 加固 |
send_fail,但去抖音一看,用户 N**(化名)那条评论下回复早就发出去了——发送一直是成功的,复核在冤枉好人。九版斗争的对手从来不是抖音,是自己的判定环节。2560×1600 全屏截图里一行 14px 的输入框文字,视觉模型大概率回答"没有"。任何"框里有没有字"类判定,先裁剪到目标控件附近再问。这个坑 DM 流和 RC 流分别独立踩了一次,修复代码就躺在隔壁文件里(douyin_dm_grounded._shot_crop 的注释写得明明白白)——动手前先 grep 兄弟脚本。
"打字进不去"这个结论本身从没被人工验证过——七个版本全在修"输入",真凶却在"判定"。卡死时第一件事不是改代码,是人工复现一次脚本动作(手动点回复、手动 Ctrl+V),让事实先说话。成本 30 秒,省一个下午。
v5 防"假成功"(没发却报 sent),v9 防"假失败"(发了却报 fail)——两个方向都真实发生了。问法上,"是否残留文字"会把发出去的气泡残影也算进去;问"是否恢复占位提示态"这种明确的正向状态,歧义小得多。v10 再加一道"评论楼里找刚发的气泡"——直接验收结果而不是中间状态,两道都说没发才算没发。
跑一轮 ≈ 15 条 / 半小时挂机。前两次建议加 --confirm 逐条确认熟悉节奏,之后即可无人值守。
.env.local 含:AKKE_ORG_ID / AKKE_ACCOUNT_ID(自己的,PM 下发)/ Supabase / Langfuse / OpenRouter 各 key。C:\akke-wuying 已 bootstrap 过(有 douyin_dm_grounded.py 及 python 依赖——克隆机一般都有,缺了找同事拷)。python3 scripts/dm-phone-sender/pull-rc-reply.py --want=15
data/contacts-rc-reply-YYYYMMDD.csvmessage 列。公开评论比私信显眼得多,烂稿挂在评论楼里人人可见。# [本机] 两块:脚本 + 名单
python3 scripts/dm-phone-sender/make-wuying-ps1.py \
worker/scripts/wuying-dm/douyin_rc_reply_grounded.py \
'C:\akke-wuying\douyin_rc_reply_grounded.py' data/write-rc.ps1
python3 scripts/dm-phone-sender/make-wuying-ps1.py \
data/contacts-rc-reply-$(date +%Y%m%d).csv \
'C:\akke-wuying\contacts-rc-reply.csv' data/write-rc-csv.ps1
pbcopy < data/write-rc.ps1 # 第一块进剪贴板
OK bytes=N 与本机提示的字节数一致即成功;再回本机 pbcopy < data/write-rc-csv.ps1 贴第二块。# [云电脑] 前两次熟悉用 --confirm 逐条 y/n;熟了去掉,全自动
cd C:\akke-wuying
python douyin_rc_reply_grounded.py contacts-rc-reply.csv --confirm
AKKE_RC_DAILY_LIMIT 可调,别超)。rc_reply_log_YYYYMMDD.csv:sent / video_not_found / comment_not_found / type_fail / send_fail / ...send_fail 不一定真失败,拿不准就人工看)。Get-Content rc_reply_log_*.csv 复制回来存 data/),然后:
pnpm tsx scripts/import-comment-log.ts --in=data/rc_reply_log_YYYYMMDD.csv
只认 sent 行 → 写 outreach_events(channel=reverse_comment) + 消费锁,这个人立刻在全员 leads 池里算"已触达",谁都不会再发 ta。失败行不用管,锁 4 小时自然过期回池。C:\akke-wuying\screenshots\_yesno_box.png 的修改时间——在动就没死。.env.local 的 AKKE_ACCOUNT_ID 锁号归因;云电脑抖音登你自己的触达号即可,脚本无须改。6/7 用 v10 跑了第一个生产批(17 条,最终 6 发出),暴露的问题按"现象 → 根因/解法"记录:
首轮 17 条全军覆没(15 wrong_video + 2 type_fail),同一份 CSV、同一份脚本,取前 2 条重跑立刻 2/2 全通——单次全败不等于脚本坏了,大概率是当时抖音窗口状态不对(被遮挡/没在最前台)。标准动作:
# [云电脑] 取前 2 条试跑 + Tee 留完整日志
$all = Get-Content contacts-rc-reply.csv
$all[0..2] | Set-Content contacts-rc-test.csv -Encoding UTF8
py -u douyin_rc_reply_grounded.py contacts-rc-test.csv 2>&1 | Tee-Object -FilePath run-test.log
重跑安全的前提:先核日志确认失败都发生在按发送之前(wrong_video / type_fail / comment_not_found 都是),才能整批重来不重复发。
实测 Invoke-WebRequest -OutFile 下载含中文的脚本,22606 字节落地变 20900,脚本直接残废。云电脑 Windows 自带 curl.exe(注意 .exe 后缀,裸 curl 是 Invoke-WebRequest 的别名):
# [本机] 上传:curl -s --data-binary @文件 https://paste.rs → 返回 URL
# [云电脑] 下载(替代 STEP 3 的剪贴板块,更稳):
curl.exe -s https://paste.rs/XXXXX -o C:\akke-wuying\目标文件
(Get-Item C:\akke-wuying\目标文件).Length # 必须和本机 wc -c 字节一致
# [云电脑→本机] 回传日志/截图:
curl.exe -s --data-binary "@C:\akke-wuying\rc_reply_log_YYYYMMDD.csv" https://paste.rs
⚠️ paste.rs 单文件 ~384KB 截断(传大截图会缺尾),字节核对永远不能省。
源账号正在开播时,主页作品宫格第一格是直播间(缩略图带红色「直播」角标),VL 找视频时可能点进直播——后续评论楼流程全部失配,浪费一条额度。临时对策:值守时看到进了直播间手动 Esc 退出等它跳过;脚本修法(待做):locate 的 prompt 明确排除带「直播」角标的格子 + 进页后加一道"当前是视频播放页而非直播间"的判定。
15 条连跑,最后 4-5 条集中"没进对源账号主页"。怀疑连续搜索触发软限流或残留页面状态叠加。对策:单批别贪长(8-10 条一批,批间歇 10 分钟),中后段失败率上来就停批,失败条自然回池明天再拉。
本批失败分布:wrong_video 5(搜索/主页问题)、type_fail 4(粘贴没进框,安全跳过)、video_not_found 1、comment_not_found 1(评论被压沉)。GUI 通道天然有损耗,拉单时按目标数的 2-3 倍备料,失败条不消耗去重(锁过期自动回池)。