PyQt+pywin32 制作一个简单的微信轰炸机

前言

前几天和朋友在微信上聊天的时候,遭到了朋友的信息轰炸。满屏的炸弹,炸得我毫无还手之力。忍不了了,我也发,奈何手速实在是太慢,拼不过。常言道,程序员有
事不过三的美德,前两次还能忍,第三次就不能再忍了。为了加深与朋友的深厚友谊,于是,我简单地做了一个微信消息轰炸机。

效果演示

随机发送信息

正确的使用方式

轰炸信息

pywin32库调用windows API

在微信上发送消息,一般分为三个步骤,点开聊天窗口,编辑信息,点击按钮发送信息。要用程序实现这三个步骤,一个是调用微信的API接口,另一个是模拟人为操作。
如果说想要通过微信的api接口实现消息转发的话,需要阅读微信的API文档,或者说通过抓包的方式获取,逆向。这种方式很快,而且方便程序地调用。缺点就是太复杂了。
本着简单的原则(),我选择第二种方式。

模拟人为的操作,也就是说要让程序模拟上面的三个步骤。这里就要引出pywin32库了。pywin32库,简单地介绍下,就是将windows的API进行了封装,为python提
供了很多方便的接口。这个库可以模拟人为的操作,比如鼠标移动,截图,窗口拖动等。对于这个项目而言,核心点就是获取到窗口的句柄,有了句柄,我们才能实现对这个
窗口的种种操作。

那么,该如何获取到窗口的句柄呢?

spy++获取窗口信息

这时候就要用到spy++了。Spy++ 是 Microsoft Visual Studio 提供的一个开发者工具,用于监视和调试 Windows 应用程序中的窗口消息。
spy++可以在Visual Studio(不是Visual Code)中的工具栏里获取。

工具栏里的spy++
工具栏里的spy++

打开spy++,按下Ctrl+f,就可以看到如下画面

spy++的使用

中间的那个望远镜图标是可以拖动的,只需拖动那个望远镜到指定窗口,就可以获取到这个窗口的句柄,还有这个窗口继承的类的信息。例如微信主窗口继承的类是
WeChatMainWndForPC,单独的聊天窗口继承的类是ChatWnd。有了类的信息,再加上窗口的句柄,可以很快地定位到目标窗口。

核心代码实现

直接上代码

# 获取目标窗口
def get_win(self):
    try:
        # 获取窗口句柄
        win = win32gui.FindWindow("ChatWnd", self.user_name)
        # 将窗口置于前台,便于控制
        win32gui.SetForegroundWindow(win)
        return True
    except Exception as e:
        print(f"找不到目标窗口, 请重试, 错误:{e}")
        return False

这里win32gui.FindWindow()的调用需要两个参数,第一个参数就是我们从spy++上获取到的类名,第二个参数则是窗口的标题。微信的聊天窗口标题和用户名一致,
所以这里就用用户名填参。还有一个注意的点是,在获取到目标窗口之前,应先保证聊天窗口(单独的聊天窗口,不是微信主窗口)是打开的,否则会找不到窗口句柄。

有了窗口句柄,也就完成了第一个步骤,打开聊天窗口。接下来我们需要编辑消息和发送。

日常使用微信时,要编辑消息,总是一个字一个字地打出来,或者说从某个地方复制一段文本,发送给好友。对于程序而言,后者的实现方式要更为简单,且便于拓展。
我们只需将文本信息加入到剪切版中,粘贴,最后发送就行。下面这三个方法,就是实现这么一个简单的功能。

# 将文本加入剪切版
@staticmethod
def add_msg(msg):
    try:
        # 打开剪切板
        win32clipboard.OpenClipboard()
        # 初始化剪切版
        win32clipboard.EmptyClipboard()
        # 添加文本输出
        win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, msg)
        print(f"已将{msg}添加到剪切版中")
    except Exception as e:
        print(e)
    finally:
        # 关闭剪切版
        win32clipboard.CloseClipboard()

# 模拟粘贴操作
@staticmethod
def paste_op():
    # 按下ctrl+v
    win32api.keybd_event(17, 0, 0, 0)
    win32api.keybd_event(86, 0, 0, 0)
    # 释放按键
    win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)

# 模拟发送操作
@staticmethod
def send_op():
    # 按下alt+s
    win32api.keybd_event(18, 0, 0, 0)
    win32api.keybd_event(83, 0, 0, 0)
    # 释放按键
    win32api.keybd_event(18, 0, win32con.KEYEVENTF_KEYUP, 0)
    win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0)

最后简单地组合下上面的几种方法,就能实现微信自动发送消息的操作了。

PyQt设计前端界面

前端的交互界面,还是用PyQt写的。毕竟QtDesigner实在是太好用了。下面是界面的展示。

设置界面

结语

项目已开源,如果想研究源代码或者下载这个小小的软件,可以移步到这里 微信轰炸机

接下来可以大胆地轰炸朋友了。

posted @ 2023-12-17 11:50  -thetheOrange-  阅读(192)  评论(0编辑  收藏  举报