你是否曾经想过如何利用编程技能来自动化一些重复性任务?或者是否曾经想过如何编写一个程序,能够在特定条件下执行某些操作?如果你是一名编程爱好者,那么你来对地方了!在本教程中,我们将介绍如何使用Python编写一个自动抢码工具,以帮助你在特定场景下完成自动化任务。无论是抢购热门商品、自动化游戏任务还是其他需要快速响应的情况,这个工具都能派上用场。
故事开头
假设你是一名玩家,热衷于某款热门游戏。游戏中有一项活动,需要扫描游戏中的二维码进行抢码操作,以获得珍贵的奖励。然而,这个活动的二维码每次都在不同的位置出现,手动扫描非常不方便,而且容易错过。于是,你决定使用自己的编程技能来解决这个问题,编写一个自动抢码工具,让你轻松抢到奖励。
准备工作
在开始编写自动抢码工具之前,你需要准备以下几个要素:
-
Python环境: 确保你已经安装了Python,并且可以在你的计算机上运行Python程序。
-
必要的库: 本教程中使用了许多Python库,包括
cv2
(用于图像处理)、pyzbar
(用于二维码识别)、http.client
(用于网络请求)、tkinter
(用于创建窗口界面)等。你需要确保这些库已经安装在你的Python环境中。 -
米游社账户: 你需要一个米游社账户,以便在游戏中进行抢码操作。确保你已经登录米游社,并且知道自己的UID和Cookie信息。
-
游戏类型和设备信息: 确定你要抢码的游戏类型(在本例中为4,表示某款游戏),以及生成一个唯一的设备标识符。
编写自动抢码工具
创建一个Tkinter窗口
首先,我们将创建一个Tkinter窗口,这个窗口将用于显示屏幕截图以及识别到的二维码。这个窗口将始终保持在屏幕最前方,不会干扰你的操作。
# 创建一个Tkinter窗口
root = tk.Tk()
# 隐藏窗口标题栏和边框
root.overrideredirect(True)
# 将窗口置顶
root.wm_attributes("-topmost", True)
# 设置窗口大小和位置
win_width = 300
win_height = 300
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x_pos = (screen_width // 2) - (win_width // 2)
y_pos = (screen_height // 2) - (win_height // 2)
root.geometry('{}x{}+{}+{}'.format(win_width, win_height, x_pos, y_pos))
# 将窗口背景设为透明
root.attributes('-transparentcolor', 'white')
# 将窗口的画布设为透明
canvas = tk.Canvas(root, bg='white', highlightthickness=0)
canvas.pack(fill='both', expand=True)
# 绘制一个红色空心正方形
canvas.create_rectangle(
5, 5, win_width-5, win_height-5, outline='red', width=2)
# 进入循环让窗口保持打开状态
root.mainloop()
设置扫描区域
我们需要确定在屏幕上哪个区域进行二维码扫描。在这个例子中,我们将屏幕分成一个300x300的区域,用于扫描。
# 设置扫描区域
width, height = 300, 300
# 获取屏幕尺寸
screen_width = tk.Tk().winfo_screenwidth()
screen_height = tk.Tk().winfo_screenheight()
# 计算识别区域左上角
left = (screen_width - width) // 2
top = (screen_height - height) // 2
# 计算识别区右下角
right = left + width
bottom = top + height
截取屏幕截图
编写一个函数来截取指定区域的屏幕截图,并将其转换为灰度图像。这个函数将会在后续的识别过程中使用。
def capture_screen():
saveDC = dc.CreateCompatibleDC()
# 创建位图对象
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(dc, right-left, bottom-top)
# 将位图选入到DC中
saveDC.SelectObject(saveBitMap)
# 截屏并保存到位图中
saveDC.BitBlt((0, 0), (right-left, bottom-top),
dc, (left, top), win32con.SRCCOPY)
# 将位图对象转换为numpy数组并进行颜色空间转换
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
screenshot = np.frombuffer(bmpstr, dtype='uint8').reshape(
(bmpinfo['bmHeight'], bmpinfo['bmWidth'], 4))[:, :, :3]
screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
# 释放资源
saveDC.DeleteDC()
win32gui.DeleteObject(saveBitMap.GetHandle())
return screenshot
识别二维码
使用pyzbar
库来
识别屏幕截图中的二维码。如果成功识别到二维码,我们将进一步处理它。
# 截取屏幕截图
screenshot = capture_screen()
# 尝试使用pyzbar库识别二维码
codes = decode(screenshot, symbols=[pyzbar.ZBarSymbol.QRCODE])
# 如果找到了二维码,输出其内容
if codes:
print("扫码成功!")
pattern = r"ticket=([a-f0-9]+)"
match = re.search(pattern, codes[0].data.decode())
# 正则请求地址
if match:
print(match.group(1))
# 进入抢码
start_time = time.time()
retcode = Request(match.group(1))
end_time = time.time()
if retcode == 0:
# 计算代码执行时间并输出
elapsed_time = end_time - start_time
print("抢码成功耗时 %.3f 秒" % elapsed_time)
random = 1.3
time.sleep(random)
print("防止过快被察觉插入随机延迟")
# 确认登陆
start_time = time.time()
ConfirmRequest(match.group(1))
end_time = time.time()
# 计算代码执行时间并输出
elapsed_time = end_time - start_time
print("确认登陆成功耗时 %.3f 秒" % elapsed_time)
# print("作者by:吾爱破解tseed")
# 等待一下
time.sleep(1)
else:
print("未知二维码抢码失败")
# 等待一下
time.sleep(1)
记录FPS和退出
最后,我们可以记录每秒的帧数,并在按下键盘上的任意键时退出程序。
# 记录每秒帧数
frame_count = 0
frame_start_time = time.time()
while True:
# ...(省略其他代码)
# 记录每秒帧数
frame_count += 1
if time.time() - frame_start_time >= 1:
fps = frame_count
print(f"FPS:{fps}" + "\r", end='', flush=True)
frame_count = 0
frame_start_time = time.time()
# 在窗口中显示截图
cv2.imshow("QR Code Scanner", screenshot)
# 检查是否按下了键盘上的任意键
if cv2.waitKey(1) != -1:
break
# 关闭窗口
cv2.destroyAllWindows()
结束语
通过本教程,你已经学会了如何使用Python编写一个自动抢码工具。这个工具可以用于各种需要自动化的场景,只需稍微调整代码即可。希望这个教程能帮助你更好地理解Python编程和自动化任务的原理,同时也能让你在特定情况下提高工作效率。
如果你对Python编程和自动化有更多的兴趣,不妨深入学习,探索更多有趣的应用领域!