弹幕刷屏器

27

题目:

有一天在看B站直播的时候,UP主搞了一个弹幕抽奖的活动,就是大家刷弹幕,他随机抽奖,这就需要一直刷弹幕了,那么你能不能写一个程序让鼠标键盘自动帮你刷弹幕呢?

分析:

(首先要说明的是这个程序只能在win环境下使用)

具体来说的话本程序就是模拟鼠标键盘的活动,首先要找到弹幕输入框和”发送弹幕按钮”的具体坐标(这个可以使用QQ的截图功能,从桌面左上角开始截图,然后拉到具体位置,右下角初夏你的xx*xx就是该位置的具体坐标),然后让程序模拟鼠标键盘到那个位置进行刷弹幕,并添加一个停止程序运行的热键来让你控制程序的运行。

该程序使用了win32函数库,所以首先你需要安装pywin32

pip install pywin32

该函数可以实现模拟键盘和鼠标的动作,比如将鼠标移动到一个特定的位置并进行左键点击,以及按下键盘上的按键。
pywin32接口网站
原始win32接口

以及需要添加一个关闭程序的功能,这个程序开始之后,该程序就一直在那里刷弹幕,所以我们就需要设置一个快捷键去控制这个程序的运行,这就是我们的ALT+F3的作用。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# _*_ coding:UTF-8 _*_
import win32api, win32con, win32gui
from ctypes import *
import ctypes.wintypes
import time
import threading
import sys

EXIT = False


def mouse_click(x=None, y=None):#这里定义一个函数鼠标移动到(x,y)位置并鼠标左键单击
if not x is None and not y is None:
mouse_move(x, y)#鼠标移动到(x,y)位置
time.sleep(0.05)#休眠0.05秒
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)#鼠标左键按下
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)#鼠标左键抬起


def mouse_move(x, y):#鼠标移动到(x,y)位置
windll.user32.SetCursorPos(x, y)#鼠标移动到(x,y)位置


class Hotkey(threading.Thread): # 创建一个Thread.threading的扩展类,进行注册热键并停止程序的进行

def run(self):#定义函数
global EXIT # 定义全局变量,这个可以在不同线程见共用。
user32 = ctypes.windll.user32 # 加载user32.dll
if not user32.RegisterHotKey(None, 99, win32con.MOD_ALT, win32con.VK_F3): # 注册快捷键 alt + f3 并判断是否成功。
raise # 返回一个错误信息
# 以下为判断快捷键冲突,释放快捷键
try:
msg = ctypes.wintypes.MSG()#获取msg信息
# print msg
while user32.GetMessageA(ctypes.byref(msg), None, 0, 0) != 0:#循环
if msg.message == win32con.WM_HOTKEY:#如果两个信息相同
if msg.wParam == 99:#如果msg.wParam == 99
EXIT = True#将EXIT的值赋为True
return#返回
user32.TranslateMessage(ctypes.byref(msg))
user32.DispatchMessageA(ctypes.byref(msg))
finally:
user32.UnregisterHotKey(None, 1)
"""
这里做个解释:
这里的pywin32包的详细解释:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx
pywin32包能够方便的引入dll并调用其中的api函数,
查看MSDN,可以知道RegisterHotKey来自user32.dll文件,
它的参数分别是窗口句柄、快捷键标示、组合键和虚拟键。
我在消息队列中等待处理事件,如果标示符合,
就执行我们自己的代码,否则继续传给系统。
这里我把它写成了一个Thread.threading的扩展类,
这样可以作为一个线程启动,
因为Windows系统在等待按键的时候是阻塞的,
那样我们的外挂就不动啦!用一个全局变量来作为按下退出快捷键的标志.
"""

if __name__ == "__main__":
hotkey = Hotkey()#实例化hotkey类
hotkey.start()#hotkey类开始运行
for event in range(1, 9999999999):#创建循环
mouse_click(1150, 665)#鼠标移动到该位置并点击鼠标左键
win32api.keybd_event(17, 0, 0, 0)#键盘按下ALT建
win32api.keybd_event(86, 0, 0, 0)#键盘按下V建
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)#键盘抬起下V建
win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)#键盘抬起下ALT建
mouse_click(1272, 669)#鼠标移动到该位置并点击鼠标左键
#这里的ALT V 键对应的数字可以在网上查到,可以搜素"键盘按键数字对照表"
if EXIT:#如果EXIT值为真,则退出程序
sys.exit()