Files

7.8 KiB

踩坑实录(全部实战验证过的解法)

1. xclip 会挂起整个 ssh 会话

xclip -selection clipboard 设置剪贴板后会驻留为剪贴板所有者,占住 ssh 的 stdout 管道,远程命令永不返回,还会导致后续 cat 截图文件拿到 0 字节。

解法:setsid 分离 + 三重丢弃:

setsid xclip -selection clipboard -i /tmp/clip.txt >/dev/null 2>&1 < /dev/null &

2. pkill 的模式匹配会杀掉脚本自己

远端脚本里写 pkill -f "xclip -selection",如果脚本自己的命令行里也含这个字样(bash -c 整段就是命令行),脚本会杀掉自己,exit 255,后面的命令全不执行。括号技巧 pkill -f "[x]clip" 只对 grep/pkill 自身有效,保护不了内嵌在脚本命令行里的字符串。

解法:需要结束时用 pkill -x xclip(精确进程名);脚本里尽量不写 pkill。

3. 微信窗口被藏进托盘

点击搜索下拉、Esc、某些误操作会把窗口最小化到托盘,wmctrl -l 里看不到 Weixin,但进程活着。此时截屏全是桌面壁纸,Agent 变瞎,还会把壁纸当界面乱点。

解法:每轮轮询前 ensure_window():wmctrl -l 无 Weixin 就 xdotool search --class wechat 拿窗口 id,wmctrl -i -a <id> 拉回,再重新最大化。agent.py 已内置。

4. "Hide pinned chats" 折叠开关

微信聊天列表底部有折叠置顶的开关。点击列表底部区域(y>826)极易误触它,把置顶会话全部折叠——File Transfer 这类内置会话通常在置顶区,折叠后就"消失"了。折叠后列表顶部会出现 "N pinned chats" 字样。

解法:① 图标定位的 y 搜索上限设 826,永不进入开关区;② 发送前检测折叠条(vision 问 (60,240)-(300,285) 区域有无 pinned chats 字样),有就点 (160,260) 展开;③ 点图标用图标列中心 x=91,不用行中心。

5. File Transfer(文件传输助手)搜不到

英文 UI 下文件传输助手显示为 "File Transfer",且搜索框的本地索引不收录它——搜什么只会出网络搜索建议,点建议还会把窗口搞进托盘。

解法:用像素特征在列表里直接找:File Transfer 图标是绿圈+大白箭头,36px 高的窗口内 绿>250 且 白>250 双特征,取最底部匹配。绿 (1,194,96),判定 r<80 and g>160 and 60<b<140。agent.py 的 find_green_icon_y 已实现。

6. 中文输入只能走剪贴板

xdotool type "中文" 依赖键盘映射,输出的全是乱码。唯一可靠的是剪贴板+ctrl+v(见 SKILL.md 代码块)。注意粘贴后 sleep 0.6-1.5 再动手,大文本渲染需要时间。

7. 视觉模型读标题的两类幻觉

  • 提示词问"输出标题文字",模型看不到时会编造或输出解释性长文("标题是微信。");
  • 解法:提示词里给"看不到就输出NONE"的出口,代码侧再兜底:结果含NONE或长度>20 视为空。agent.py 的 chat_header_name 已实现。

8. UI 是英文的

官方 Linux 微信跟随系统 locale,Ubuntu Server 默认英文 → 界面全是 "Search"/"File Transfer"/"Send"。给视觉模型的提示词要用英文界面词;联系人名以界面显示名为准(用户嘴里的"文件传输助手"=界面上的"File Transfer")。想要中文界面,在 xstartup 里 export LANG=zh_CN.UTF-8 并装 language-pack-zh-hans。

9. 发消息点进群聊(最严重事故)

坐标偏移 + 无核验 = 私聊消息发进 227 人群。除了发送前标题核验,还有两条纪律:

  • 新坐标/新流程永远先拿 File Transfer 做小白鼠,不拿真人会话试;
  • 视觉定位返回的坐标,点击后必须再截屏核验"现在开的是不是目标会话",一步都不省。

10. 2G 内存配置基准

xfce(300M) + 微信(500M-1G) + Agent(PIL+requests 约 30M):available 常态 500M 左右。free -h 的 available < 200M 时先查 evolution 系列有没有复活,再考虑升配。evolution-alarm-notify 会在 xfce 会话每次重启时试图复活,Hidden=true 覆盖文件必须常驻。

11. systemd 服务里拉起的微信秒退(HOME 缺失)

systemd 服务环境默认没有 HOME。从 agent 进程里 Popen 启动微信,微信因写不了 ~/.xwechat 立即退出,表现为"拉起后 ps 里没有进程"。解法:service 单元加 Environment=HOME=/root,且 agent.py 里 ENV 显式补 HOME。

12. wmctrl -lG 列序:[3] 是 y 不是宽度

wmctrl -lG 输出为 id desktop x y W H name,取宽度必须用 split()[4]。取错列会把 y=27(最大化窗口)当成"27px 的小窗口",整个状态机判断全歪。

13. 窗口未映射 ≠ 进程死亡(过渡态绝不能杀)

刚登录成功/启动中的微信,主窗口有几秒未映射期(wmctrl -lG 里没有 Weixin,但 pgrep 有进程)。如果把这当"进程死了"去 pkill+重启,会杀掉刚登录的会话,用户被迫重新手机确认。判据:窗口缺失时先 pgrep -x wechat,进程活着就只等待+激活,永远不要在进程存活时走硬重启。

14. 登录二维码窗的绿字 vs Log In 按钮都是微信绿

二维码登录窗上 "Scan to log in" 是绿色文字,和实心 Log In 按钮同色系。按"绿像素总数"判断会误触发点击。可靠判据:单行连续绿像素数——按钮 ~170x33 实心块,中心行采样约 75+;文字行零散笔画 ≤30。阈值取 50。

15. 任何自愈动作前先问:会不会毁掉登录态/二维码

微信进程一旦重启:登录退化为二维码,用户必须重新扫码+手机确认。所以自愈逻辑的每一版都要过一遍"最坏情况审查":误重启的代价是什么?亮度阈值、窗口宽判据、进程存活判断,宁可保守(等待)也不激进(重启)。重启冷却 90 秒是底线,不是保险。

16. 视觉模型会照抄提示词里的占位符

glm-4v-flash 对"只输出JSON: {chat_name:'名字', text:'...'}"这类带占位示例的提示词,可能原样返回占位符而不是读图(尤其图里没有聊天窗时)。对策:示例值用明显的假内容,代码侧校验(文本长度≥2 且不等于 "..."),不合规按读取失败处理。

17. 多账号陷阱:扫的码不一定是目标账号

桌面版微信记住了账号A,但登录页可 Switch Account;用户重新扫码时可能扫成另一个账号B。后果:聊天列表全变、白名单联系人"消失"(搜索只剩 Internet search results)。agent 表面正常,实际监护着错误的身份。

对策:①登录后第一件事,核对左上角头像/特征会话是否与白名单匹配;②白名单联系人在当前账号不存在时,搜索只剩网络建议——这是换错号的强信号;③部署时明确告知用户"扫码前确认手机当前登录的是哪个号"。

18. 搜索交互中按 Escape 会把渲染打成透明壳(会间接毁掉登录会话)

实测规律:在微信主窗口按 Escape(如"关掉残留下拉"的习惯动作)后,搜索交互会让 Qt 渲染管线崩掉——窗口 Map State 仍是 IsViewable、wmctrl 一切正常,但内容全透明, 截图只见壁纸。更糟的是:透明壳会被自愈逻辑判定"渲染死亡"而 pkill 重启, 刚登录的会话随之丢失,用户被迫重新扫码+手机确认。

对策:①搜索路径禁用 Escape(进入搜索框后 ctrl+a 全选即可覆盖旧关键词); ②自愈的透明壳重启前,先看进程存活时长——刚登录几分钟就"渲染死亡"的, 大概率是这条坑,宁可等待观察也不要立即杀; ③同样的坑没人知道微信哪版会修,升级微信后应重测。

19. 发文件时 Send 按钮点击无效(输入区必须先有焦点)

Qt 文件选择器的 File name 栏直接粘贴完整路径回车即可挂载文件,这步很稳; 但挂载后点 Send 按钮若输入区从未获得过焦点,点击会被无声吞掉(连按两次都没用)。

对策:先点一下输入区任意位置(如文本光标处)让输入区拿到焦点,再点 Send。 若仍未发出,补一个 Return(焦点在输入区时回车可发送文件卡片)。