需要使用 Python 设计一个 QQ 的批量自动登录的脚本, 查了一些资料, 通过调 API 实现该功能。
代码主要使用了几个常用的 API
- win32gui
- win32api
- win32con
- PyUserInput
前置需要安装 PyHook,否则会报错
- pykeyboard
- pymouse
- 参考链接
- PyHook3 安装 https://www.cnblogs.com/Denon-CAT/p/12771357.html
注意
在使用该程序时, 需要保证你登录的 QQ 不存在验证(滑动验证 / 文字点击验证的方式)。滑动验证的模块已经设计好, 如下代码中的注释部分。 但是QQ验证完成之后, 它会提示无法新设备无法登录, 因此使用代码的前提是你要登录的QQ已经指定你的电脑作为安全登录设备,无需验证。
注意, 由于屏幕尺寸和分辨率的不同, 点击的位置可能出现偏差, 因此需要自己进行微调,
mouse.click(login_focus[4][0] + 200, login_focus[4][1] + 250, 1, 1)
修改偏移即可。
import os
import time
import win32gui
import win32api
import win32con
from pymouse import PyMouse
from pykeyboard import PyKeyboard
from ctypes import *
def autoLoginQQ(username, password):
# 找到运行 QQ 的位置
os.system('"C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"')
time.sleep(5) # 延时, 防止提前点击
# 获取QQ的窗口句柄
# 参数1是类名,参数2是QQ软件的标题
frame = win32gui.FindWindow(None, "QQ")
# 获取QQ登录窗口的位置
login_focus = win32gui.GetWindowPlacement(frame)
# 定义一个键盘对象和一个鼠标对象
keyboard = PyKeyboard()
mouse = PyMouse()
# 模拟点击事件, 用于点击输入用户名
mouse.click(login_focus[4][0] + 200, login_focus[4][1] + 250, 1, 1)
time.sleep(1)
# 输入用户名
keyboard.type_string(username)
time.sleep(1)
# 切换密码输入
keyboard.tap_key(keyboard.tab_key)
# 输入密码
keyboard.type_string(password)
# 按下回车
keyboard.press_key(keyboard.enter_key)
keyboard.release_key(keyboard.enter_key)
time.sleep(10)
# 最小化登录窗口
frame = win32gui.FindWindow(None, "QQ")
# 获取QQ登录窗口的位置
login_focus = win32gui.GetWindowPlacement(frame)
mouse.click(login_focus[4][0] + 240, login_focus[4][1] + 30, 1, 1)
# # 这里如果需要验证, 一般也即无法进行登录, 所以去掉该模块
# # 考虑是否有验证码滑动环节
# # 获取鼠标焦点, 用于点击输入用户名
# time.sleep(5)
# # 循环滑动
# mouse = PyMouse()
# distance = 200
# while True:
# windll.user32.SetCursorPos(login_focus[4][0] + 160, login_focus[4][1] + 340) # 恢复鼠标位置
# mouse.position() # 获取当前坐标的位置
# win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) # 按下鼠标
# time.sleep(0.2)
# mouse.move(login_focus[4][0] + distance, login_focus[4][1] + 340) # 鼠标移动到xy位置
# win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) # 放开鼠标
# time.sleep(0.2)
# distance += 2
# # 超出距离, 验证失败或无法登录
# if distance >= 350:
# break
if __name__ == "__main__":
# 示例 - autoLoginQQ("156623442", "XXXX")
autoLoginQQ("", "") # 这里输入用户名和密码
autoLoginQQ("", "") # 这里输入用户名和密码
滑动验证模块 滑动验证模块 滑动验证模块
# 这里如果需要验证, 一般也即无法进行登录, 所以去掉该模块
# 考虑是否有验证码滑动环节
# 获取鼠标焦点, 用于点击输入用户名
time.sleep(5)
# 循环滑动
mouse = PyMouse()
distance = 200
while True:
windll.user32.SetCursorPos(login_focus[4][0] + 160, login_focus[4][1] + 340) # 恢复鼠标位置
mouse.position() # 获取当前坐标的位置
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) # 按下鼠标
time.sleep(0.2)
mouse.move(login_focus[4][0] + distance, login_focus[4][1] + 340) # 鼠标移动到xy位置
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) # 放开鼠标
time.sleep(0.2)
distance += 2
# 超出距离, 验证失败或无法登录
if distance >= 350:
break
这里就不再贴结果了 win11 + python3 测试通过