云电脑 DM · wrong_user 排查与修复方案

阿里无影云电脑发私信通道 · 单日样本 10 条 wrong_user · 2026-06-16 · 脚本 worker/scripts/wuying-dm/douyin_dm_grounded.py
≈ 33% 派单卡在身份门

本质上 没有一条发错人、也没一条真发出去——全是身份门(OCR 核身)正确拦截。但代价是大量派单空转 + lead 丢失。10 条里 组 A 能救 3 条 组 B 够不到 ~7 条

人工核验 本结论非自动推断——这 10 条已在云电脑端逐个手搜抖音号、一条条人工审核确认(搜得到/搜不到、本人排第几条、是否私密),见下方第 2 节证据表。

一句话定调:修复只能捞回少数(组 A 是会被误杀的真 lead);多数(组 B)是本发送通道结构上够不到的 lead,只能止损 + 往上游/换通道想。

1 · 失败是怎么产生的(机制)

云电脑发私信前,process() 走这条链路寻址 + 核身,任一步不过即判 wrong_user 并跳过、根本不发

① 搜索框输入
抖音号
② 点「用户」tab
点结果头像
③ OCR 截图核身
是主页?昵称/号对?
④ 过 → 私信
不过 → wrong_user

核身两道门(ocr_verify()):① 当前页是不是个人主页(有关注/私信按钮+粉丝数+作品宫格);② 昵称匹配 抖音号精确一致(号唯一,比昵称稳)。已开 AKKE_SEARCH_SCAN_N=5 深扫前 5 条结果。

2 · 排查结论:两个独立 bug,不是一个

云电脑端逐个手搜 10 个号验证后,干净劈成两组:

组 A 搜得到、却点不进主页(3 条 · 可救)

本人就在搜索第 1 条、号精确命中,却被记 (非主页)。问题 100% 不在搜索,在「点第一条 → 落主页」那一步。发生在不同时间(00:37 / 08:49 / 09:02),是间歇性

抖音号用户名称手搜结果失败原因
833997494来地球玩的第 1 条精确命中点完没进主页(加载竞速/tab 没切)
69540571321a泥彩哪第 1 条精确命中同上,间歇性
x.g.z.6688许公子第 1 条命中 · 私密账号私密号无作品宫格 → is_profile=False 误判

关键证据:大量 sent 成功条目走同一条 C_FIRST 点击路径 → 第一条结果坐标本身是准的(否则全军覆没)→ 组 A 的失败是间歇性重试正是对的工具(不是坐标问题)。

组 B 根本搜不到本人(~7 条 · 本通道无解)

号搜出号段相近的别人,用昵称也搜不到。根因:账号改了号 / 注销 / 私密,或存的是不可搜的 short_id。深扫 5 条也救不了——本人不在结果里。

抖音号用户名称OCR 实际搜到
41780494807疯人院尼克王灿讲系统 |号:41780494791
54457438150咩咩的土豆子用户9832… |号:38310000030
1077767305如人饮水,冷暖自知愿你遇良人 |号:1077767335
zhaoliang.666@陪读爸爸·带俩娃纵横四海 |号:zhaoliang6666(昵称也搜不到)
13936266666l战武66666荷包陈甸甸 |号:13730761452L
1214949699董家有女(非主页)
…等

3 · 根因定位(代码事实)

寻址只靠号
resolve_douyin_numbers.py:112number = unique_id || short_id。没设自定义号的用户退回 short_id(内部数字 ID,搜索框按设计不可搜),合并后丢失了「是否可搜」信息。
组 A 跳错
process() 扫描循环:ocr_verify 不匹配就 i++ 跳下一条。本人在第 1 条只是瞬时没进主页 → 跳到第 2–5 条全是别人 → wrong_user
私密误判
ocr_verify() 的 VL prompt 要求「有作品宫格」才算主页 → 私密号没宫格 → 判非主页。
已有止损
complete_dispatch v2(migration 20260609195201):wrong_user→skipped,同一 comment 累计失败 ≥3 次comment.status='skipped' 永久排除。所以组 B 不是无限重派,是每条烧 ≤3 次后停

为什么 A1 是唯一「捞回真 lead」的改动

失败组本质修复价值
组 A本来能联系上的 lead 被误杀丢了(可恢复)真增量 · 捞回 lead
组 Blead 反正够不到,3 次后 suppress仅省算力 · lead 仍丢

4 · 修复方案(重排后)

顺序改动性质风险 / 路径
1A1 · (非主页) 重试同一条结果捞回真 lead(组 A)低 · worker 脚本失败分支
2主动跳过 short_id-only(enrich:unique_id 空就不派)0 成本灭掉组 B 可预判子集低 · 先验证
3B2 · 给组 B 打 unreachable_search tag 量真实规模看清 33% 里多少不可救低 · 纯标记
4B1 · 反应式 1-shot suppress(改名/注销的)省算力(3 次→1 次)中 · 含 migration 走 PR
放弃A2 · 私密账号放宽 is_profile1 条 · 私密大概率不可私信

1 A1 · (非主页) 重试同一条结果 救组 A

文件
douyin_dm_grounded.pyprocess() 扫描循环(~734–758)
现状
不匹配就 i++ 跳下一条结果。
seen(非主页) 开头时(= 没落到主页,不是「认错人」)→ 重点同一条 + 加长等待 + 重新截图核身,重试 K 次(如 2)后才跳下一条;on-profile 但号不符才 i++。顺带把点完第一条到截图的 settle 等待(现 wait=2.0)调大。
833997494 / 69540571321a
风险
。只在失败分支加重试,happy path 一字不动;代价是失败条目耗时变长。

2 主动跳过 short_id-only 灭组 B 可预判子集

enrich 调的 profile 接口里 unique_idshort_id分开返回的(line 112 合并才丢了信息)。unique_id 为空、只有 short_id 的 lead = 可证明搜索框永远够不到 → 在 enrich 阶段 0 成本、零误杀地跳过,比 B1「烧 1 次再 suppress」更早更省。

改名/注销的自定义号(如 zhaoliang.666)预判不了 → 留给反应层。即主动层(short_id)+ 反应层(strikes)互补,不是二选一。

前提验证:先在云电脑(国内 IP)拿几个已知 short_id 号验证「unique_id 空 ⇒ 真搜不到」,再依赖它改派单。

3 B2 · 量组 B 真实规模 先有数

wuying_poll_agent.py 把组 B 这类失败的 p_error_message 落成 unreachable_search(区别于组 A 瞬时失败),就能 COUNT 出组 B 多大、33% 是否代表性。纯标记、不改行为。

所有结论都建立在「10 条样本」上 —— 强烈建议先做 B2 量一周真实分布,确认组 A:B 比例后,再决定 ②/④ 投不投。别在一天的样本上压注 migration。

4 B1 · 反应式 1-shot suppress 省算力

process() 扫完全部 5 条、看到的全是 on-profile 的别人(号都不符 = 确定本人不在结果里)→ poll agent 打 unreachable_search → 新 migration 让 complete_dispatch 对该 error 1 次即抑制(类比现有 rejected 的 1-shot)。组 B 从烧 3 次降到 1 次。

判定要分清:「全是 (非主页)」可能瞬时,别 1-shot;「全是别人的真主页」才确定搜不到、可 1-shot。需 process() 回传细分原因。
高危路径:supabase/migrations/** → 必须开分支 gh pr create、CI 绿 + claude-review 过再合,不直推 main

5 · 明确不做(及原因)

A2 私密放宽 —— 只 1 条,且卡在「私密号能不能私信」这个大概率 NO 的前提,期望收益太低,放弃。
sec_uid 直开主页douyin.com/user/<sec_uid>)—— PC 客户端没地址栏,已排除。
enrich 阶段一刀切按 short_id 全量预判 —— 已证伪:zhaoliang.666 是自定义号样式却也搜不到(注销/改名)。只跳可证明的 short_id 子集,其余反应式处理。

6 · 操作步骤(按顺序)

实施前要确认的 3 件事

落地顺序

  1. 先落 A1 + B2(都低风险、worker 脚本直改):A1 捞回组 A 真 lead;B2 量真实分布。
  2. A1 改完按 worker/scripts/wuying-dm/更新到最新版-同步同事.md 流程同步到云电脑,先小批 dry-run 观察再放量。
  3. B2 跑满一周拿到数 → 评估 ②(主动跳过)和 ④(B1 migration)是否投。
  4. ②/④ 一旦动,supabase/migrations/** 走 PR,其余 worker 脚本小 fix 可直推。

7 · 战略另案(今天不做,但要记一笔)

本通道有结构天花板。组 B 的 lead 不是坏 lead——人家在视频下评论过,我们有 sec_uid 和 comment。够不到只是因为 PC 客户端只能靠搜索框按号寻址

真正能覆盖全部的是 从评论/视频里点进 TA 的主页(iPhone / ADB 通道能做),而不是搜号。这是本通道的上限,要彻底解决 wrong_user 得换寻址方式,属于另案。