V免签 PC 监控端部署教程:用 OCR 监控微信收款助手,自动推送回调
这篇教程整理自一份实际可用的 V免签 PC 监控端脚本。
它的核心思路是:用 PrintWindow 截取”微信收款助手”窗口 → OCR 识别收款时间与金额 → 时间没变就跳过 → 有新收款就按 V免签协议推送回调。
适合把个人微信收款接入 V免签、自建发卡或自动发货系统的场景。
1. 它是怎么工作的
整条链路非常清晰:
微信收款助手窗口
│
▼
PrintWindow 截图(不依赖窗口是否在最前)
│
▼
裁剪中间区域 → 灰度 → 自动对比度 → 放大 2 倍
│
▼
Tesseract OCR(chi_sim + eng)
│
▼
提取"时分"作为去重键 ──► 时间没变?跳过
│
▼
提取金额 ──► 按 V免签协议签名 ──► POST /appPush
│
▼
定时 POST /appHeart 心跳保活
关键设计点:
- 不用屏幕截图,用 PrintWindow:窗口被遮挡、最小化到任务栏也能截到内容。
- 时分去重:微信收款助手每条通知都带时间,用
HH:MM当唯一键,避免同一笔重复推送。 - 预热机制:启动时先读一次当前屏幕,把旧收款记下来但不推送,避免程序一启动就误报。
- 心跳保活:每 10 次循环发一次
/appHeart,让 V免签服务端知道监控端在线。
2. 环境准备
2.1 系统要求
- Windows 10 / 11(脚本依赖
win32gui、win32ui、pygetwindow) - 已安装微信电脑版,并打开”微信收款助手”窗口
- 能访问 V免签服务端(本教程示例为
http://192.168.4.5:12345)
2.2 安装 Python 依赖
pip install pytesseract requests pygetwindow pywin32 Pillow
2.3 安装 Tesseract-OCR
- 下载 Windows 版安装包(推荐 UB-Mannheim 版本):
https://github.com/UB-Mannheim/tesseract/wiki - 安装时勾选中文语言包
chi_sim。 默认安装路径为:
C:\Program Files\Tesseract-OCR\tesseract.exe如果你的路径不同,改脚本里这一行:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'验证安装:
tesseract --list-langs输出里应该能看到
chi_sim和eng。
3. 配置脚本
打开脚本,修改顶部配置区:
# ==================== 配置区 ====================
VMQ_URL = "http://V免签地址/appPush"
VMQ_HEART_URL = "http://V免签地址/appHeart"
VMQ_KEY = "88fc9594323b5c78771fd9f1fab549css"
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
WINDOW_TITLE = "微信收款助手"
SCAN_INTERVAL = 1.5 # 识别间隔(秒)
HEARTBEAT_EVERY = 10 # 每 10 次循环发一次心跳
各项含义:
| 配置项 | 说明 |
|---|---|
VMQ_URL |
V免签的推送接口,一般是 http://你的服务端:端口/appPush |
VMQ_HEART_URL |
V免签的心跳接口 /appHeart |
VMQ_KEY |
V免签后台的通信密钥,必须和服务端一致 |
tesseract_cmd |
Tesseract 可执行文件路径 |
WINDOW_TITLE |
要监控的窗口标题,必须是”微信收款助手” |
SCAN_INTERVAL |
截图 + OCR 的间隔,1.5 秒比较稳 |
HEARTBEAT_EVERY |
每多少次循环发一次心跳 |
注意:
VMQ_KEY是敏感信息,不要把它提交到公开仓库。生产环境建议改成从环境变量读取。
4. 关键代码解读
4.1 DPI 感知
try:
ctypes.windll.shcore.SetProcessDpiAwareness(1)
except Exception:
try:
ctypes.windll.user32.SetProcessDPIAware()
except Exception:
pass
高 DPI 屏幕上如果不设置 DPI 感知,截图坐标会错位,OCR 区域裁剪也会偏。这段保证截图坐标和实际像素一致。
4.2 PrintWindow 截图
result = ctypes.windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 3)
第三个参数 3 是 PW_RENDERFULLCONTENT,能拿到完整窗口内容,即使窗口被遮挡也能截到。
截图后用 Image.frombuffer 按 BGRX 解析,再转成 RGB:
img = Image.frombuffer(
'RGB', (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
bmpstr, 'raw', 'BGRX', 0, 1
)
4.3 OCR 区域裁剪与预处理
w, h = image.size
left = int(w * 0.20)
right = int(w * 0.80)
top = int(h * 0.20)
bottom = int(h * 0.65)
crop = image.crop((left, top, right, bottom))
crop = crop.convert('L') # 灰度
crop = ImageOps.autocontrast(crop) # 自动对比度
crop = crop.resize((crop.width * 2, crop.height * 2), Image.LANCZOS) # 放大 2 倍
裁剪中间 20%~80% 宽、20%~65% 高的区域,正好覆盖收款通知的时间和金额。
灰度 + 自动对比度 + 放大,是提升 Tesseract 识别率的经典组合。
脚本会把裁剪图保存为 debug_crop.png,方便你调试识别区域。
4.4 时分去重
time_match = re.search(r'(\d{1,2}[::]\d{2})', text)
if time_match:
current_time = time_match.group(1)
if current_time == last_notify_time:
return None # 时间没变,跳过
last_notify_time = current_time
这是整个脚本最关键的防重复逻辑。微信收款助手的每条通知都带时间,同一分钟内如果 OCR 多次识别到同一条通知,时间不变就跳过。
如果没识别到时间,会降级用文本 hash 兜底:
text_hash = hash(text)
if text_hash == last_text_hash:
return None
last_text_hash = text_hash
4.5 金额提取
matches = re.findall(r'(\d+\.\d{2})', text)
if matches:
return matches[0]
匹配 12.34 这种两位小数的金额格式。如果你的收款金额可能没有小数,可以改成:
matches = re.findall(r'(\d+\.\d{2}|\d+)', text)
4.6 V免签签名与推送
pay_type = 1
price = amount
t = int(time.time())
sign_str = f"{pay_type}{price}{t}{VMQ_KEY}"
sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest()
data = {'type': pay_type, 'price': price, 't': t, 'sign': sign}
response = requests.post(VMQ_URL, data=data, timeout=5)
签名规则是 type + price + t + key 拼起来做 MD5。这个规则必须和 V免签服务端一致,否则会返回签名错误。
心跳同理:
sign = hashlib.md5(f"{t}{VMQ_KEY}".encode('utf-8')).hexdigest()
data = {'t': t, 'sign': sign}
requests.post(VMQ_HEART_URL, data=data, timeout=5)
4.7 预热机制
print("[预热] 正在读取当前屏幕上的旧收款通知...")
for _ in range(3):
img = capture_window(WINDOW_TITLE)
if img is not None:
...
if time_match:
last_notify_time = time_match.group(1)
print(f"[预热] 已记录当前收款时间: {last_notify_time},不会推送")
break
启动时先读 3 次,把屏幕上已有的旧收款时间记下来,但不推送。这样程序重启后不会把历史收款当成新收款重复推送。
5. 运行与调试
5.1 启动
python vmq_pc_monitor.py
正常启动后应该看到:
-----------------------------------------------------------------
微信电脑版收款监控脚本 - OCR 版(对接 V免签)
窗口标题:微信收款助手
截图方式:PrintWindow(不依赖屏幕可见性)
识别间隔:1.5 秒
去重方式:时分去重(时间没变不推送)
-----------------------------------------------------------------
[预热] 正在读取当前屏幕上的旧收款通知...
[预热] 已记录当前收款时间: 20:21,不会推送
[预热] 完成,开始监听新收款...
-----------------------------------------------------------------
5.2 调试 OCR
如果识别不准,先看 debug_crop.png,确认裁剪区域是否覆盖了时间和金额。然后调整:
- 裁剪比例(
left/right/top/bottom) - 是否加二值化、锐化
- Tesseract 的
--psm参数(当前是6,表示按统一文本块识别)
常用的 --psm 值:
| psm | 含义 |
|---|---|
| 6 | 统一文本块(当前使用) |
| 7 | 单行文本 |
| 11 | 稀疏文本,适合不规则布局 |
| 3 | 全自动(默认) |
5.3 手动测试推送
可以临时加一段测试代码,确认 V免签服务端能收到:
if __name__ == "__main__":
send_http_request("0.01")
跑一次,看服务端是否返回成功。确认链路通了再跑主循环。
6. 打包成 exe(可选)
如果不想在目标机器上装 Python,可以用 PyInstaller 打包:
pip install pyinstaller
pyinstaller -F -w vmq_pc_monitor.py
-F:单文件-w:不显示控制台窗口
打包后注意:
- Tesseract 仍需单独安装,或者在打包时把
tessdata一起带上并改路径。 如果报缺少
win32ui等模块,加上--hidden-import:pyinstaller -F -w --hidden-import win32ui --hidden-import win32gui vmq_pc_monitor.py
7. 设置开机自启
方法一:任务计划程序
- 打开”任务计划程序” → 创建基本任务。
- 触发器选”计算机启动时”。
- 操作选”启动程序”,程序填
python.exe路径,参数填脚本路径。 - 勾选”不管用户是否登录都要运行”(如果需要后台运行)。
方法二:启动文件夹
Win + R输入shell:startup。- 把脚本的快捷方式或打包好的 exe 放进去。
8. 常见问题排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 提示”无法获取到窗口” | 微信收款助手没打开,或标题不对 | 确认窗口标题是”微信收款助手” |
| PrintWindow 失败 | 窗口最小化到托盘、或被系统限制 | 让窗口正常显示,不要最小化到托盘 |
| OCR 识别不到时间 | 裁剪区域不对,或字体太小 | 看 debug_crop.png,调整裁剪比例 |
| OCR 识别不到金额 | 金额格式不是 x.xx |
调整正则,加上整数金额匹配 |
| 同一笔重复推送 | 时分去重失效 | 检查 OCR 是否稳定识别到时间;必要时加金额 + 时间联合去重 |
| 心跳异常 | VMQ_KEY 不对,或服务端地址错 |
核对密钥和服务端地址 |
| 推送返回签名错误 | 签名拼接顺序不对 | 核对 type + price + t + key 的顺序 |
| 高 DPI 屏幕截图错位 | DPI 感知失败 | 确认脚本开头的 DPI 设置生效 |
9. 安全与稳定性建议
不要硬编码密钥:把
VMQ_KEY改成从环境变量读取:import os VMQ_KEY = os.environ.get("VMQ_KEY", "")加日志轮转:长时间运行建议把 print 改成 logging,并做日志切割。
- 加异常重试:网络请求失败可以加退避重试,避免偶发失败丢单。
- 加金额校验:可以在推送前加一个金额白名单或范围校验,避免 OCR 误识别导致错误推送。
- 不要用管理员权限运行:除非必要,普通权限即可,降低风险。
- 定期检查
debug_crop.png:微信 UI 更新后裁剪区域可能失效,需要重新校准。
10. 总结
这份 PC 监控端的核心就三件事:
- PrintWindow 截图:不依赖窗口可见性,稳定拿到收款助手内容。
- 时分去重 + OCR:用时间当唯一键,避免同一笔重复推送。
- V免签协议推送:按
type + price + t + key签名,POST 到/appPush,定时/appHeart保活。
部署顺序建议:
先装 Tesseract 和依赖 → 改配置 → 跑一次确认 OCR 能识别 → 手动测一次推送 → 再跑主循环 → 最后做开机自启。
如果你在部署过程中遇到 OCR 识别不准、签名错误或重复推送的问题,先看 debug_crop.png 和服务端返回,再逐项排查。

💬 评论区 0