# shipinhao-address **Repository Path**: vicoproplus/shipinhao-address ## Basic Information - **Project Name**: shipinhao-address - **Description**: 通过微信视频号交叉验证地址 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-06 - **Last Updated**: 2026-10-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 视频号属地获取(wechat-channels-location) PC 微信(Weixin 4.x,Qt 框架)的 UI 自动化工具集:点开联系人的资料卡 → 点资料卡里的视频号昵称 → 读取属地(如「广东 佛山」),并与资料卡的「地区」字段交叉确认。 仓库本身就是一个 **Qoder Skill**(`SKILL.md` + `scripts/`),同时也完全可以脱离 Agent 手动使用其中的脚本。 ## 为什么需要它 微信桌面版的内容区对常规自动化手段基本免疫,这一点决定了本项目的实现方式: - **UIA / 无障碍点击无效** —— AXPress、AXSelect、CUA 元素点击、键盘快捷键在聊天与资料卡区域一律不生效,只有真实坐标点击(`SetCursorPos` + `mouse_event`)有用。 - **Agent 的窗口观察对资料卡是盲的** —— 资料卡是主窗口内的悬浮层,无障碍树常常字节级无变化。因此判定成功与否**只以全屏截图为准**。 - **截图像素 ≠ 点击坐标** —— 屏幕缩放会带来一个换算系数(150% 缩放的机器上约为 1.5),必须逐机实测标定,不能硬编码。 - **微信会留下隐形窗口** —— 关掉的面板残留为不可见的 `*ToolSaveBits*` Qt 工具窗口,会吞掉落在其矩形内的点击,需要主动清理。 ## 环境要求 | 项 | 要求 | |---|---| | 操作系统 | Windows(依赖 `user32.dll` 与 GDI 截图,不支持 macOS / Linux) | | 运行时 | Windows PowerShell 5.x(脚本只用 `Add-Type` + .NET,无第三方模块) | | 目标程序 | PC 微信 Weixin 4.x,且已登录、有可见桌面会话 | | 权限 | 无需管理员权限;不做内存注入、不改包、不 hook | ## 目录结构 ``` . ├── LICENSE # Apache-2.0 ├── README.md └── wechat-channels-location/ ├── SKILL.md # 技能入口:核心认知、标定方法、完整流程、故障排查表 └── scripts/ ├── capture_screen.ps1 # 全屏截图(覆盖多显示器) ├── crop.ps1 # 裁剪并放大局部,用于精确定位 ├── click_at.ps1 # 坐标点击,可选点击后截图 ├── list_windows.ps1 # 枚举可见窗口(pid / class / rect / title) └── close_tool_windows.ps1# 清理微信残留的隐形 Qt 工具窗口 ``` ## 使用 ### 作为 Qoder Skill 把 `wechat-channels-location/` 整个目录放进你的 Qoder skills 目录即可被自动发现(目录名需与 `SKILL.md` frontmatter 的 `name` 一致)。之后用自然语言触发,例如「看看我微信好友 ××× 的属地」「点他头像读一下地区」,Agent 会按 `SKILL.md` 的流程执行。 ### 手动使用 脚本一律用 `-File` 调用(下列命令假设工作目录为 `wechat-channels-location/`)。**在 Git Bash 里 `powershell -Command "...$var..."` 的 `$` 会被 shell 吞掉**,这是最常见的自伤错误: ```powershell # 1) 看窗口,记下微信主窗口 rect powershell -NoProfile -File scripts/list_windows.ps1 # 2) 全屏截图(默认落在 scripts/_screen.png) powershell -NoProfile -File scripts/capture_screen.ps1 -Out F:\tmp\s.png # 3) 裁剪放大,精确定位头像/昵称 powershell -NoProfile -File scripts/crop.ps1 -cx 560 -cy 1020 -w 560 -h 320 -scale 2 -src F:\tmp\s.png -out F:\tmp\a.png # 4) 点击(坐标须为虚拟坐标,即 ÷ 换算系数后的值),并顺带回截图 powershell -NoProfile -File scripts/click_at.ps1 -x 381 -y 439 -shot F:\tmp\s2.png # 5) 收尾:清掉隐形残留窗口(0 = 所有微信进程) powershell -NoProfile -File scripts/close_tool_windows.ps1 -TargetPid 26392 ``` ## 脚本参考 | 脚本 | 参数(默认值) | 输出 | |---|---|---| | `capture_screen.ps1` | `-Out`(`scripts/_screen.png`) | 保存 PNG;打印 `saved origin=(x,y) size=WxH -> 路径`,尺寸取自 VirtualScreen | | `crop.ps1` | `-cx -cy`(0)、`-w`(400)、`-h`(300)、`-scale`(2)、`-src`(`_screen.png`)、`-out`(`crop_.png`) | 等比放大裁剪图(最近邻插值);打印裁剪框。裁剪图内的像素需换算回全屏 PNG:`cx + 裁剪像素 / scale` | | `click_at.ps1` | `-x -y`(必填)、`-shot`(空则不截图) | 左键单击;固定 150/80/600ms 节奏;打印 `clicked x,y[; saved 路径]` | | `list_windows.ps1` | 无 | 每个可见且尺寸 > 50×50、标题非空的窗口一行:`hwnd= pid= class= rect=(l,t,WxH) title=` | | `close_tool_windows.ps1` | `-TargetPid`(0 = 全部进程) | 对类名匹配 `*ToolSaveBits*` 的窗口 `PostMessage WM_CLOSE`;打印 found / closed / remaining | ## 工作流程概览 1. **标定换算系数**(每台机器一次):对比微信窗口 rect 与其在截图中的实际像素偏移求出系数,并用 y 方向验证。此后 **点击坐标 = PNG 坐标 ÷ 系数**。 2. **定位微信进程**:机器上同时存在多个 `Weixin.exe` 属正常(多开 + 多进程架构),以「主窗口正显示目标聊天」的那个为准。 3. **确认聊天已打开**:截图核对标题 = 联系人昵称,否则在会话列表里点对应会话行。 4. **点对方头像**(1:1 聊天中右侧是你自己的头像)弹出资料卡,截图确认。 5. **捷径**:资料卡头部即有「地区」字段——只要所在地可在此停止。 6. **点视频号昵称文本**(不是行标签「视频号」,也不是视频缩略图),等 2~3 秒后截图读取主页属地;视频号页面可能是主窗口右侧内嵌面板,也可能是独立窗口。 7. **交叉验证并收尾**:主页昵称下方的「省份 城市 [性别]」应与资料卡「地区」一致;关闭面板后跑一次 `close_tool_windows.ps1`。 完整步骤、判定依据与故障排查表见 [`wechat-channels-location/SKILL.md`](wechat-channels-location/SKILL.md)。 ## 隐私与边界 - 属地 / 地区是对方在个人资料中**主动公开**的字段。本工具只做界面读取,不抓取、不批量导出、不做通讯录爬取或联系人遍历。 - 资料卡「朋友资料」区可能出现电话、证件号等敏感内容;报告时只呈现用户所要的字段,不主动展示其他信息。 - 字段本身可能不完整:海外账号显示国家/地区、只填省份、或对方未填写;对方未开通视频号则没有「视频号」行。此时如实说明,不要推断。 - 截图会落盘到本机(默认在 `scripts/_screen.png` 等位置),其中包含聊天内容,自行注意存放与清理。 ## 许可 Apache License 2.0 —— 见 [LICENSE](LICENSE)。