✕
开启精彩搜索
热门搜索
emby EMBY 解析 免流 源码 IPV6 阿里 阿里云 青龙 音乐 网心 网心云 webdav 阿里云盘 unraid 洗白 Rclone 刮削 云梦

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

  1. 下载 Windows 版安装包(推荐 UB-Mannheim 版本):
    https://github.com/UB-Mannheim/tesseract/wiki
  2. 安装时勾选中文语言包 chi_sim。
  3. 默认安装路径为:

    C:\Program Files\Tesseract-OCR\tesseract.exe
    

    如果你的路径不同,改脚本里这一行:

    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
    
  4. 验证安装:

    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. 设置开机自启

方法一:任务计划程序

  1. 打开”任务计划程序” → 创建基本任务。
  2. 触发器选”计算机启动时”。
  3. 操作选”启动程序”,程序填 python.exe 路径,参数填脚本路径。
  4. 勾选”不管用户是否登录都要运行”(如果需要后台运行)。

方法二:启动文件夹

  1. Win + R 输入 shell:startup。
  2. 把脚本的快捷方式或打包好的 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 监控端的核心就三件事:

  1. PrintWindow 截图:不依赖窗口可见性,稳定拿到收款助手内容。
  2. 时分去重 + OCR:用时间当唯一键,避免同一笔重复推送。
  3. V免签协议推送:按 type + price + t + key 签名,POST 到 /appPush,定时 /appHeart 保活。

部署顺序建议:

先装 Tesseract 和依赖 → 改配置 → 跑一次确认 OCR 能识别 → 手动测一次推送 → 再跑主循环 → 最后做开机自启。

如果你在部署过程中遇到 OCR 识别不准、签名错误或重复推送的问题,先看 debug_crop.png 和服务端返回,再逐项排查。

最后附上监控端源代码

🔒
此段内容已加密
请输入密码解锁此部分内容
密码错误,请重试

💬 评论区 0