乐趣区

关于windows:Python实现Windows弹出微信消息通知可显示发送人和消息内容

需要

Mac 微信是有一个音讯告诉的,这一点就挺好的,有时候基本不必点开开看就能看到音讯内容。而 Windows 电脑版是没有这个音讯告诉的,只有右下角图标闪动。

(Mac 微信告诉)

于是我想了不少的方法去实现这么一个性能,曾经另辟蹊径实现了这个性能,其实也有肯定的局限性,然而能满足办公期间的小需要。

成果如下:

(Windows 微信告诉)

实现办法

接管告诉

首先是 Windows 的告诉弹出的实现就是 Windows 自带的告诉栏,咱们能够通过 Python 去调用 Windows API 去发送 Windows 告诉,让音讯弹出来。

发送告诉

相比于接管告诉,那么发送告诉就比拟艰难,因为 Windows 微信电脑版的窗口属于非 Windows 窗口规范,咱们无奈通过惯例的形式去读取每个控件的内容,更无奈监听到告诉内容,所以我这边另辟蹊径,通过安卓手机去监听微信音讯。

所以这里用到了 SmsForwarder 这款开源软件,装置在你的安卓手机上,而后设置转发规定,监听微信 APP 的告诉,而后发送通道抉择 WebHook,将监听到的音讯 POST 到 Python 开启的 HTTP 服务器,触发 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)

在 cmd 输出 ipconfig 就能够取得 ip 地址了。

最初执行代码就能够了。

执行代码后,会在你电脑开启一个 HTTP 服务,这时候你能够在浏览器进行本地测试,在浏览器依照以下格局粘贴:

http:// 内网 ip: 端口号 /? 告诉内容

而后拜访就能够。

toasts.py

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

app = 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 True

wc = 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

设置转发规定,增加规定,抉择匹配 “APP 包名”,匹配模式抉择 “是”,匹配值是 com.tencent.mm,抉择方才配置的发送通道,自定义模板间接点击告诉内容。

简略进行配置后,SmsForwarder 进行一些必要的设置后,就能够失常应用了。

须要优化的中央

目前还在想方法在电脑本地监听微信音讯,毕竟通过安卓手机监听音讯也不是方法,一方面是依赖本地的服务器,通过局域网才能够发送告诉给电脑。另一方面就是安卓监听音讯也不具备稳定性,而且也不是人人都用安卓,对于苹果手机的用户,也是难以实现这个。

须要留神的中央

  1. 内网 ip 可能会变动,如果你发现前面无奈失常接管到告诉,能够查看下内网 ip,更换一下 ip 重启服务。
  2. 因为这是应用内网 ip 实现的 HTTP 服务,所以你安卓手机须要连贯的 wifi 与电脑的统一,如果电脑是有线网络,那么你手机须要与电脑有线网络同一个网络环境,即 ip 雷同。
  3. 如果不想通过局域网实现,能够本人配置内网穿透服务去实现外网申请服务。

作者

TANKING

退出移动版