wrong_user 卡点与修复2026-06-17 · 数据源:零星本地 sent_log(13 条逐条)+ douyin_dm_grounded.py 代码核对 · 通道:阿里无影云电脑发私信
一句话:零星已更新到 #375,仍掉 13 条 wrong_user。逐条抠完发现 #375 重试救不了——真因是三个代码级卡点叠加,不是没更新。
能确定救回的只有 3 条(号读到且一致、被 on_prof 闸误杀);其余 8 条本地日志判不了(被"网格过扫"写失真),得先加观测才能定。结论:先上零风险观测补丁,号兜底护栏待观测确认再发。
| seen 实际内容 | 证明了什么 | 条数 | 判定 |
|---|---|---|---|
(非主页)|号:<与目标一致> | 号读到且一致,但 VL 判非主页 | 3 | 能救被 559 闸误杀 |
(非主页) 空昵称空号 | VL 啥都没读到 → 屏上没主页头部 | 6 | 判不了点空/搜不到/过扫 |
(非主页) conf 0.00 | 页面全空白 | 2 | 判不了白屏/点空 |
<别人名>|号:<不一致> | 搜到近号的别人 | 2 | 救不了真 B 类·正确拦截 |
救回的 3 条:年年有鱼(99244157) / 🌈我要做人间清醒(1027836359·页面显示"小星") / 喵花花酱(1793479211)。真 B 类 2 条:洋泡泡(目标…590 搜出"张张助理"…520) / 🌈。。(目标…392 搜出"平平淡淡"…327)。
卡点①实时昵称投递不可靠(最上游)
🌈我要做人间清醒 这行 CSV 的 nickname 列还是 DB 旧名(opener 也用的旧名),页面却显示"小星" → 说明 resolve_handles 这次没返回实时昵称,身份门拿旧名比页面"小星" → 失配。只要实时昵称送到,这条根本不会进 wrong_user。号兜底只是补丁,这才是大头。
poll agent 287-295 / 500-506:nick = fresh_nick.get(sec) or DB昵称。fresh_nick 空 = resolve 瞬时失败或该号反查不到昵称。
卡点②on_prof 闸误杀号-match(douyin_dm_grounded.py:559)
抖音号精确兜底被锁在 and on_prof 后面:VL 把"无作品/稀疏主页"误判 is_profile=False 时,哪怕正确的号已读到,兜底也不触发 → return (on_prof and matched) = False → wrong_user。这就是那 3 条的死因。
⚠️ 修它有回归面:抖音"用户"搜索结果列表卡片也显示"抖音号:"。若点击没进主页、停在列表,VL 判非主页(对的)却可能读到一致的号 → 盲信号会在列表页强发。所以号兜底必须带"确认主页头部在屏"的护栏,不能盲信。
卡点③网格过扫无空槽守卫(douyin_dm_grounded.py:772)
for i in range(scan_n) 盲点第 i 槽坐标、不校验这一槽有没有结果。号搜结果数 < SCAN_N 时多出的槽点进空白区 → 记成 bare (非主页);而 seen 只留最后一槽 → 会掩盖"第一槽其实是近号别人(B类)"。这导致那 6 条 bare 无法从日志分类。
6 条 bare + 2 条白屏的真实归类,本地判不了,取决于两个看不到的东西:
.env 有没有开 AKKE_SEARCH_SCAN_N:开了(=5)→ 可能过扫掩盖;没开(=1)→ 就是第一条非主页/点空。screenshots/_prof.png:那一刻屏上到底是主页 / 列表 / 视频页 / 白屏。没这两样,对这 8 条的任何"修法"都是猜 → 所以先观测,别先改逻辑。
| 阶段 | 做什么 | 救几条 | 风险 |
|---|---|---|---|
| 第一步·现在 | 观测补丁:每槽 seen 全留 + wrong_user 存截图 | 0(只为定位) | 零·不改判定 |
| 第二步·观测后 | 号兜底带护栏(修卡点②) | 3(+部分 bare) | 低·有护栏 |
| 并行排查 | 查 resolve_handles 实时昵称命中率(卡点①) | 潜在大头 | 零·只验证 |
| Fix B | 改 prompt 去掉"作品宫格"判据 | ≈0 | 撤回·数据不支持 |
分工:本机操作员 = 有 Akke 仓库的人(PM / 野荞),改脚本 + 重新 host 链接。 无影操作员 = 零星,云电脑上下载 + 重启。
在 worker/scripts/wuying-dm/douyin_dm_grounded.py 的扫描循环里改两处。改 ① 让每槽轨迹都进 sent_log(治卡点③的失真);改 ② wrong_user 时留底截图。都不碰任何判定逻辑。
改 ① — 累积每槽 seen(约 777 行)
# 找到这一行(原样): c['_ocr_seen'] = seen # 落 sent_log:wrong_user 时事后能分清「改名误杀」vs「真错人」 # 替换为: c.setdefault('_ocr_trace', []).append('第%d槽#%d:%s(conf%.2f)' % (i + 1, attempt + 1, seen, conf)) c['_ocr_seen'] = ' || '.join(c['_ocr_trace']) # 全扫描轨迹进 sent_log,不只最后一槽(治过扫失真)
改 ② — wrong_user 存截图(约 784-786 行)
# 找到这三行(原样): if not m or conf < MIN_CONF: print(' [跳过] 前%d条都不是本人 → 不发' % scan_n) return 'wrong_user', conf # 替换为: if not m or conf < MIN_CONF: print(' [跳过] 前%d条都不是本人 → 不发' % scan_n) try: # 留底最后一张身份门截图,便于把那 6 条 bare 分清是主页/列表/白屏 import shutil _tag = (str(c.get('_comment_id') or nick) or 'x').replace('/', '_')[:24] shutil.copy(os.path.join('screenshots', '_prof.png'), os.path.join('screenshots', 'wronguser_%s.png' % _tag)) except Exception: pass return 'wrong_user', conf
改完重新 host(链接是临时的,发给零星)
cd worker/scripts/wuying-dm # 打印新字节数 + paste.rs 链接(字节数必变,旧的 58682 作废,用打印出来的新值) echo "douyin_dm_grounded.py $(wc -c <douyin_dm_grounded.py) $(curl -s --data-binary @douyin_dm_grounded.py https://paste.rs)"
把打印出来的 新字节数 + 链接 发给零星,替换 3.B 里的占位。
# 1) 找到跑 wuying_poll_agent.py 的黑窗口 → Ctrl+C 停掉 cd C:\akke-wuying\wuying-dm # 2) 下载新脚本(链接由本机操作员发) Invoke-WebRequest -Uri "<本机操作员发的链接>" -OutFile douyin_dm_grounded.py # 3) 校验字节数(对不上重下;值用本机操作员发的新数字,不是 58682) (Get-Item douyin_dm_grounded.py).Length # 应 <新字节数> # 4) 重启(这窗口保持开着别关) py wuying_poll_agent.py
跑一两批后,把 C:\akke-wuying\wuying-dm\screenshots\wronguser_*.png 这些图、以及当天 sent_log_*.csv 回传给本机操作员。另外报一句:.env 里有没有 AKKE_SEARCH_SCAN_N 这行(notepad .env 看)。
等 3.B 回传截图确认"那几条 bare 确实是无作品主页被误判"、且护栏行为符合预期,再改这处。现在先别发。
# douyin_dm_grounded.py 约 559-564,把原来的: if expected_number and on_prof and not (matched and conf >= 0.95): if seen_no and _norm_no(seen_no) == _norm_no(expected_number): print(' [OCR] 昵称比对未过但抖音号一致(%s) → 判定本人' % seen_no) matched, conf = True, max(conf, 0.99) # 替换为(号一致才看,但 on_prof=False 时加"头部关注按钮在屏"护栏,排除列表/白屏误读号): if expected_number and seen_no and _norm_no(seen_no) == _norm_no(expected_number): if on_prof: matched, conf = True, max(conf, 0.99) elif _is_followed() is not None: # 关注按钮读得到=确在个人主页头部(非列表/视频/白屏) print(' [OCR] VL判非主页但号一致(%s)且头部关注键在屏 → 判本人(救无作品主页误判)' % seen_no) matched, on_prof, conf = True, True, max(conf, 0.99) else: print(' [OCR] 号一致(%s)但非主页且头部键读不到 → 不放行(疑似列表/白屏)' % seen_no)
改完同 3.A 重新 host → 零星同 3.B 重下重启。负向铁律:上线后抽查零星私信列表 vs 目标,确认 洋泡泡 / 🌈。。 那类号不一致的仍没被发出去。评论/二触通道(douyin_comment_grounded.py 复用 dm.ocr_verify)顺带受益,同样盯一两批。
resolve_handles 验证那几个 sec_uid 到底返不返回实时昵称(命中率低才是大头)。Akke · 云电脑发私信通道 · 零星 wrong_user 卡点与修复 · 2026-06-17 · 不执行版(评估 + 可复制操作步骤)