企微好友单聊 AI 自动代回 · 0→1 报告

方案B · 企业微信 PC 客户端 GUI 自动化 · 无影云电脑通道 · 联调验通快照 2026-06-29 · PR #645 已合 main
✅ 读 / 大脑 / 发 三段全联调验通 ✅ PR #645 已合 main 截屏 VL 读消息(UIA 树黑盒) Fly 中转绕 Vercel 大陆不可达 逐字 Unicode 输入 + Enter 主号无隔离 · 灰度从严 批量真发待明早灰度
01 / 第一个案例

首例端到端联调验通 — 读、想、发三段各自跑通

还没对真实客户开跑(明早灰度)。本例是联调首验:读消息、大脑生成、GUI 发送三段都用真实链路跑通了——下面三块都是真实产物,不是示意。

① 读:截屏 → VL 逐字读出客户消息

大家好!我是野荞,我来了。
无影 VL 从企微截图里读出(实测原样) · 同时判 is_external → 内部群 正确跳过

② 想:客户咨询 → 小艳 chatReply 生成(含价格锚点)

全屋定制大概多少钱一平?
测试客户提问
284元/㎡,按房产证面积算的 你房子大概多少平?
小艳(云电脑→Fly中转→Vercel chatReply 实测返回 · nurture 阶段)

③ 发:GUI 点输入框 → 逐字 Unicode 打字 → Enter

自动化联调测试123,可忽略哈~
在自家群里实发成功(验逐字中文输入企微吃 + 发送键 Enter 通)
三段独立验通:读(VL 逐字对)、想({"ok":true,"reply":"284元/㎡…"})、发(消息进群)。串成全自动后即「客户发问 → 自动读 → 自动想 → 自动回」。
3/3
读/想/发 段段验通
PASS
端到端大脑链路
0
真实客户(待明早)
DRY_RUN
当前模式(不真发)
02 / 0→1 逻辑原理图

一条客户消息,怎么自动变成一条回复

五段流水线,分布在三台主体上。两个地基约束决定了形态:(1) 企微 PC 客户端 UIAutomation 树黑盒 → 只能截屏 OCR;(2) 云电脑(国内)连不上 Vercel,但能连 Fly → 大脑调用走 Fly 中转。

① 截屏 VL 读消息
无影 · 扫未读→点开会话→Qwen VL 读最新客户消息 + 身份(UIA 树黑盒,纯 OCR);内部群/自己发的/重复 → 跳过
↓ POST generate(带 WECOM_CHAT_SECRET)
② Fly 中转(桥)
akke-worker-prod · 透传到 Vercel(云电脑连不上 vercel.app,Fly Tokyo→Vercel 必通);不持密钥
↓ 服务端转发
③ chatReply 生成
Vercel · 拉历史 + 小艳人设/知识库/few-shot → nurture 话术;落 messages(role=customer) + 会话;Langfuse/成本注入
↓ 回 reply 文本
④ GUI 发送
无影 · 拟人延迟 5–20s → 点输入框 → ctypes 逐字 Unicode 打字(不粘贴)→ Enter
↓ POST confirm(发成功才回写)
⑤ 回写
Vercel · 落 messages(role=ai) status=sent显式失败:没真发出就不记,DB 不假阳性
蓝=无影云电脑(中国 IP,唯一能读写企微 GUI) · 绿=Fly worker(中转桥,云电脑↔Vercel) · 紫=Vercel(大脑 chatReply + DB 落库,云电脑连不上)
关键:读靠截屏 VL(企微 UIA 控件树整个黑盒,探针实测只暴露标题栏);大脑调用靠Fly 中转(绕开 Vercel 大陆不可达,同时绕开卡死 kf 方案A 的 ICP 备案墙——本路是入站请求不调企微 API)。
03 / 批量化统计 · Bad case · 优化进展

0→1 路上踩平的坑

目前 联调三段验通,批量真发未跑(主号无隔离,灰度明早开)。所以统计区为联调实测 + 批量待回填不编造批量数字;bad case 全部是这次 0→1 真实踩到的,逐类列根因 / 优化 / 进展。

统计(联调实测 + 批量待回填)

3/3
读/想/发 验通(实测)
逐字对
VL 读取准确(实测)
待回填
自动回占比(批量)
待回填
读取/串台错误率(批量)
批量上线后要回填的指标框架:读取命中率(未读检出 / VL 读对率)、自动回占比(端点回非空 / 非内部群比例)、串台率(重名认错,已知弱点)、逐字输入成功率端到端时延(读→发)、封号信号(弹验证/发送异常)。灰度从严:日限默认 20、时限 8、夜间不发、连续 3 异常自停。

Bad case → 优化方式 → 进展

Bad case(真实踩到)根因优化方式进展
企微窗口 UIAutomation 树整个读不出(只有标题栏)企微 PC 自绘 Duilib/DirectUI 表面,不吐无障碍树(探针实测深扫 12 层 列表/输入框全 0)放弃 ③UIA 路线,改截屏 → Qwen VL OCR 读消息(复用抖音 grounded 的 VL 管道)探针裁定 + 已落地
VL 定位输入框坐标两次飘很大(fx=499 vs ≈105)VL 实时定位点击点漂移 ±一大截、偶发点空(抖音家族早有此教训)点击坐标量准一次写死 .envmeasure_wecom_coords.py);VL 只做读消息 + 核身,不做点击定位已量 + 写死
中文回复打不进输入框(pyautogui 只能 ASCII)pyautogui.typewrite 不支持中文;整段粘贴又是机器人特征(spec 禁止)ctypes SendInput + KEYEVENTF_UNICODE 逐字打 Unicode(绕 IME)+ 随机字间延迟;paste 兜底自家群实发验通
云电脑调端点超时(WinError 10060)云电脑(国内阿里云 IP)连不上 akke.vercel.app(Vercel 大陆不可达;openrouter 却通→非断网)Fly worker 加透传中转 /wecom/chat/reply,端点改指 Fly URL(Fly Tokyo→Vercel 必通)PR fc25cdcd 部署验通
带正确 secret 仍 401,怎么都不通Vercel 只存了 env 没 redeploy(其实 WECOM_CHAT_SECRET 压根没加上,查 REST API 才发现)REST API 加 env → rerun vercel-deploy 才生效;存 env ≠ 生效,必须重部署已加 + 重部署验通
迁移 workflow 失败(db push 没跑到)supabase/setup-cli 拉 CLI release 撞 GitHub API 限流(transient flake,非 SQL 问题)重跑 workflow(限流窗口过了即过)重跑 success
VL 把会话标题读成「杭州辰焰科技有限公司」当时打开的是内部测试会话,标题本就是公司名——VL 读对了,不是 bug真实外部客户会话标题=客户昵称,VL 同样能读;本例证明标题区读取本身准已澄清
重名客户可能认错人 / 串台GUI 拿不到稳定 external_userid,身份只能按显示名定位V1 接受(单账号客户量可控);按 (org_id, 显示名) 幂等。后续探无障碍树/会话存档拿稳定 idV1 接受 · 待后续
客户连发多条,只读到最新一条读适配器每轮只 OCR 最下面最新一条气泡V1 先接受(漏前面几条);后续 VL 读「自上次回复以来的多条」合并成一轮V1 接受 · 待后续
主号被封 = 好友+记录+认证主体全失用户拍板主号也上、不做承接号隔离非代码可消除;以「降概率×降损失」补偿:夜间不发/拟人节奏/日限从严/灰度试水/一键停发灰度盯防
04 / 下一步待做优化

接下来做什么

下一步优化列表

明早灰度真发(在场盯第一批)最该做
主号无隔离,风险最高。改 AKKE_WECOM_DRY_RUN=0 + AKKE_WECOM_HOURS=9-21(收回测试用的 0-24),9 点起开着终端看头几条真实客户的读/回质量,手放在建 wecom_reply_STOP 秒停上。
逐字输入 / 发送键 线上复核
自家群已验逐字 Unicode 吃 + Enter 发;真实客户窗口再确认一次(不吃切 AKKE_WECOM_TYPE_MODE=paste;发送键不对切 ctrl+enter)。
转人工 / 接管
V1 没做。客户明确要真人时,先 prompt 软处理;后续接最小版「转人工 → AI 停回」(接待人选待定)。
多条消息合并读
补「自上次回复以来的多条客户消息」一次性读齐合并成一轮回复,修「只读最新一条」缺口。
稳定身份防串台
探无障碍树/会话存档能否拿到稳定 external_userid,替「显示名认人」;量大前必做。
登录态持久化 + 未读扫描鲁棒化
验无影重启后企微登录是否还在(类比抖音 cookie 过期运维);多个未读会话时的扫描/点击策略(目前点最上一行)。
灰度提量
该号观察 1–2 周无异常,再把日限从 20 往上调。
朋友圈点赞(V2,另案)
企微做不到给客户朋友圈点赞(产品边界);点赞=硬需求时只能走个人微信一体化,封号最高,单独评估。

方案选型回顾(为什么是这条路)

起点是「云电脑 + 低风险」两个互相打架的诉求;逐层裁定后落到方案B + 风险最小化。

最低风险 kf 官方 API(方案A)— 合规零封号,但卡 ICP 备案域名、需客户多点一次链接 → 冻结待命
本报告 企微 PC GUI 自动化(方案B)— 能落地、客户资产可继承;代价=封号风险(主号无隔离,灰度从严补偿)
最高风险 个人微信一体化 — 唯一能做朋友圈点赞,但封号最狠、号失全失不可继承 → 仅 V2 点赞硬需求时评估
读法三选一中:③UIAutomation(黑盒否决)/ ②会话存档(官方稳但 ¥1800/年+客户存档提示)/ ①OCR(用户选定,零额外成本、全在云电脑)