Python实现Windows弹出微信消息通知(可显示发送人和消息内容)

需求 Mac微信是有一个消息通知的,这一点就挺好的,有时候根本不用点开开看就能看到消息内容。而Windows电脑版是没有这个消息通知的,只有右下角图标闪烁。
Python实现Windows弹出微信消息通知(可显示发送人和消息内容)
文章图片

(Mac微信通知)
于是我想了不少的办法去实现这么一个功能,已经另辟蹊径实现了这个功能,其实也有一定的局限性,但是能满足办公期间的小需求。
效果如下:
Python实现Windows弹出微信消息通知(可显示发送人和消息内容)
文章图片

(Windows微信通知)
实现方法 接收通知
首先是Windows的通知弹出的实现就是Windows自带的通知栏,我们可以通过Python去调用Windows API去发送Windows通知,让消息弹出来。
发送通知
相比于接收通知,那么发送通知就比较困难,因为Windows微信电脑版的窗口属于非Windows窗口标准,我们无法通过常规的方式去读取每个控件的内容,更无法监听到通知内容,所以我这边另辟蹊径,通过安卓手机去监听微信消息。
所以这里用到了SmsForwarder这款开源软件,安装在你的安卓手机上,然后设置转发规则,监听微信APP的通知,然后发送通道选择WebHook,将监听到的消息POST到Python开启的HTTP服务器,触发Windows通知就行了!
Python实现Windows弹出微信消息通知(可显示发送人和消息内容)
文章图片

上代码 模块
以下涉及到的模块,flask用来实现http请求的,winotify是用于发送Windows通知,urllib.parse用于将POST过来的URL编码进行解码,win32gui、win32con用于创建任务栏的任务图标及后台运行。

from flask import Flask, request from winotify import Notification import urllib.parse import win32gui import win32con

代码说明:
发送通知的关键代码片段,其中 icon=r"D:\Python\demo\wechat.png" 这个是通知中显示的一个小图标,可以自己网上找一张自己喜欢的图片放在toasts.py同级目录下。
toast = Notification(app_id="通知中心",title=nickname,msg=weixinMsg,icon=r"D:\Python\demo\wechat.png") toast.show()

192.168.1.100是我电脑的内网ip,8080是端口号,你需要获取你电脑的内网ip换上去,不然后续配置安卓那边的监听转发端就无法正常转发通知。
app.run(debug=False,host='192.168.1.100', port=8080)

Python实现Windows弹出微信消息通知(可显示发送人和消息内容)
文章图片

在cmd输入 ipconfig 就可以获得ip地址了。
最后执行代码就可以了。
Python实现Windows弹出微信消息通知(可显示发送人和消息内容)
文章图片

执行代码后,会在你电脑开启一个HTTP服务,这时候你可以在浏览器进行本地测试,在浏览器按照以下格式粘贴:
http://内网ip:端口号/?通知内容

然后访问就可以。
Python实现Windows弹出微信消息通知(可显示发送人和消息内容)
文章图片

toasts.py
from flask import Flask, request from winotify import Notification import urllib.parse import win32gui import win32conapp = Flask(__name__)@app.route('/')# 获取url信息 def getUrlInfo(): # 完整url url = request.url # 主机部分 hostUrl = request.host_url # 访问路径 fullPath = request.full_path # 输出 print('收到推送任务,推送内容是:'+str(urllib.parse.unquote(fullPath.split("/?")[1])).replace('+', ' ', 1))# 接收到的内容 content = str(urllib.parse.unquote(fullPath.split("/?")[1])).replace('+', ' ', 1); # 错误处理 # 因为监听软件那边监听到的首条消息是没有带上微信用户昵称的 # 所以需要判断当前接收到的消息是不是首条消息 # 如果不做这一步就会出错pdmh = ":" in content if pdmh == True: # 截取:前面的内容 qianmian = content.split(":")[0] weixinMsg = content.split(":")[1] # 还要将[]这一块也去掉,这就提取到了微信昵称 nickname = qianmian.split("]")[1] else: nickname = '微信消息通知' weixinMsg = content# 开发Push通知 # toaster = ToastNotifier() # toaster.show_toast(title=nickname, msg=weixinMsg,icon_path="logo.ico", duration=5) toast = Notification(app_id="通知中心",title=nickname,msg=weixinMsg,icon=r"D:\Python\demo\wechat.png") toast.show() return "ok"def notify(hwnd, msg, wparam, lparam): print("notify", msg) if lparam == win32con.WM_LBUTTONDBLCLK:# 双击左键 print("双击左键", msg) pass elif lparam == win32con.WM_RBUTTONUP:# 右键弹起 print("右键弹起", msg) pass elif lparam == win32con.WM_LBUTTONUP:# 左键弹起 print("左键弹起", msg) pass return Truewc = win32gui.WNDCLASS() wc.hInstance = win32gui.GetModuleHandle(None) wc.lpszClassName = "Windows通知中心" wc.style = win32con.CS_VREDRAW | win32con.CS_HREDRAW; wc.lpfnWndProc = notify classAtom = win32gui.RegisterClass(wc) hwnd =win32gui.CreateWindow(classAtom,"tst2",win32con.WS_OVERLAPPEDWINDOW,win32con.CW_USEDEFAULT,win32con.CW_USEDEFAULT,win32con.CW_USEDEFAULT,win32con.CW_USEDEFAULT,None,None,None,None) notify_id = (hwnd,0,win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP,win32con.WM_USER + 20,win32gui.LoadIcon(0, win32con.IDI_APPLICATION),"Windows通知中心") win32gui.Shell_NotifyIcon(0,notify_id)# 在指定IP和端口开启HTTP服务 if __name__ == '__main__': app.run(debug=False,host='192.168.1.100', port=8080)

安卓手机配置 安装SmsForwarder这款软件。
开源地址:https://gitee.com/pp/SmsForwa...
下载地址:https://gitee.com/pp/SmsForwa...
设置发送通道,选择 Webhook ,Webserver按照以下格式填写:
http://内网ip:端口号/

WebParams直接填写 [msg] ,请求方式是GET
Python实现Windows弹出微信消息通知(可显示发送人和消息内容)
文章图片

设置转发规则,添加规则,选择匹配 “APP包名”,匹配模式选择 “是”,匹配值是 com.tencent.mm,选择刚才配置的发送通道,自定义模板直接点击通知内容。
简单进行配置后,SmsForwarder进行一些必要的设置后,就可以正常使用了。
需要优化的地方 目前还在想办法在电脑本地监听微信消息,毕竟通过安卓手机监听消息也不是办法,一方面是依赖本地的服务器,通过局域网才可以发送通知给电脑。另一方面就是安卓监听消息也不具备稳定性,而且也不是人人都用安卓,对于苹果手机的用户,也是难以实现这个。
需要注意的地方
  1. 内网ip可能会变化,如果你发现后面无法正常接收到通知,可以检查下内网ip,更换一下ip重启服务。
  2. 因为这是使用内网ip实现的HTTP服务,所以你安卓手机需要连接的wifi与电脑的一致,如果电脑是有线网络,那么你手机需要与电脑有线网络同一个网络环境,即ip相同。
  3. 如果不想通过局域网实现,可以自己配置内网穿透服务去实现外网请求服务。
作者 【Python实现Windows弹出微信消息通知(可显示发送人和消息内容)】TANKING

    推荐阅读