云电脑 DM · 零星 wrong_user 卡点与修复

2026-06-17 · 数据源:零星本地 sent_log(13 条逐条)+ douyin_dm_grounded.py 代码核对 · 通道:阿里无影云电脑发私信

摘要一、卡点二、解决方法 三、操作步骤(可复制)四、撤回与待办

一句话:零星已更新到 #375,仍掉 13 条 wrong_user。逐条抠完发现 #375 重试救不了——真因是三个代码级卡点叠加,不是没更新。

能确定救回的只有 3 条(号读到且一致、被 on_prof 闸误杀);其余 8 条本地日志判不了(被"网格过扫"写失真),得先加观测才能定。结论:先上零风险观测补丁,号兜底护栏待观测确认再发。

一、卡点

1.1 零星 13 条逐条归类(抠死 seen 串之后)

seen 实际内容证明了什么条数判定
(非主页)|号:<与目标一致>号读到且一致,但 VL 判非主页3能救被 559 闸误杀
(非主页) 空昵称空号VL 啥都没读到 → 屏上没主页头部6判不了点空/搜不到/过扫
(非主页) conf 0.00页面全空白2判不了白屏/点空
<别人名>|号:<不一致>搜到近号的别人2救不了真 B 类·正确拦截

救回的 3 条:年年有鱼(99244157) / 🌈我要做人间清醒(1027836359·页面显示"小星") / 喵花花酱(1793479211)。真 B 类 2 条:洋泡泡(目标…590 搜出"张张助理"…520) / 🌈。。(目标…392 搜出"平平淡淡"…327)。

1.2 三个确认的代码级卡点

卡点①实时昵称投递不可靠(最上游)

🌈我要做人间清醒 这行 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 无法从日志分类。

1.3 判不了、缺证据的地方

6 条 bare + 2 条白屏的真实归类,本地判不了,取决于两个看不到的东西:

没这两样,对这 8 条的任何"修法"都是猜 → 所以先观测,别先改逻辑

二、解决方法(分阶段)

阶段做什么救几条风险
第一步·现在观测补丁:每槽 seen 全留 + wrong_user 存截图0(只为定位)零·不改判定
第二步·观测后号兜底带护栏(修卡点②)3(+部分 bare)低·有护栏
并行排查resolve_handles 实时昵称命中率(卡点①)潜在大头零·只验证
Fix B改 prompt 去掉"作品宫格"判据≈0撤回·数据不支持

三、操作步骤(可复制)

分工:本机操作员 = 有 Akke 仓库的人(PM / 野荞),改脚本 + 重新 host 链接。 无影操作员 = 零星,云电脑上下载 + 重启。

3.A 本机操作员 — 第一步:观测补丁(现在就做·零风险)

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 里的占位。

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.C 本机操作员 — 第二步:号兜底带护栏(观测确认后再发

等 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)顺带受益,同样盯一两批。

四、撤回与待办

Akke · 云电脑发私信通道 · 零星 wrong_user 卡点与修复 · 2026-06-17 · 不执行版(评估 + 可复制操作步骤)