python实现自动抢课脚本的示例代码

作者:DanteIoVeYou 时间:2022-03-12 08:16:19 

自动抢课脚本使用手册

@danteking dating from 2021.12.7 and last updating at 2021.12.8
gitee仓库
github仓库

借助pyautogui库,我们可以轻松地控制鼠标、键盘以及进行图像识别,实现自动抢课的功能

1.准备工作

我们在仓库里提供了2个必须的文件,包括:

  • auto_get_lesson_pic_recognize.py:脚本文件

  • info.xlsx:执行操作信息文件

在运行这个脚本(auto_get_lesson_pic_recognize.py)前,你需要:

1.安装python并成功配置环境变量,可以在cmd下这样检查;若返回版本号,则已安装


python --version

2.安装以下的依赖,windows用户请以管理员用户运行cmd并依次执行:


# pyautogui库
pip install pyautogui
# 读取excel表格的库
pip install xlrd==1.2.0
# 向计算机的剪贴板发送文本/从计算机剪贴板接收文本的库
pip install pyperclip
# 计算机视觉库
pip install opencv-python
# 图像处理库
pip install pillow

到此,成功安装了5个库

2.配合使用py脚本和xlsx文件

第一步

需要将抢课的每一步所需要点击的图标/超链接在头脑中想清楚

第二步

将抢课每一步的所需点击的图标/超链接截图,保存在和py脚本同一路径下

python实现自动抢课脚本的示例代码

打开excel表格,根据第一行提示在单元格中进行输入:

python实现自动抢课脚本的示例代码

A列------备注(可填可不填)

B列------操作类型,目前包括:

  • 1.左键单击(循环直到找到图片为止):意思就是如果没有找到你设置的那张图片,它就一直找下去,找不到就不停;你所设置的次数是找到成功的次数

  • 2.输入字符串

  • 3.等待

  • 4.热键

  • 5.左键单击(无需找到图片):找图片不管找没找到,就找那这么多次,次数=找到成功的次数+找到失败的次数

C列------B列的参数

  • 待点击图标名(包括图片后缀名,如.png)

  • 等待的时间(秒)

  • 输入的字符串

  • 热键

D列------单击重复次数

  • 不填,默认为1

  • 若想无限单击,填-1

按照你的选课步骤从第2行开始顺序填写excel表格的执行步骤

此时,保存excel表格

第三步

我们打开需要进行操作的选课网页

我们在cmd下切换到脚本所在目录


# 切换到D盘
D:
# 切换到xx文件夹
cd xx
python auto_get_lesson_pic_recognize.py

根据提示执行即可

上图示例

python实现自动抢课脚本的示例代码

3.auto_get_lesson_pic_recognize功能介绍

(1).抢课一次

注意

截图时请随机应变,匹配到图像后,鼠标自动点击图像正中央,建议配合qq截图,ctrl+a/t+a,选取一个独一无二的标记在截图中并且将所要点击的点放在qq截图四个蓝点的中央

python实现自动抢课脚本的示例代码

  • 如果遇到同一画面中需要点击的图标存在多个一样的,没有特征参照物,可以在那一步设置等待若干秒,手动点击图标

  • 若未成功识别图片,将循环执行识别操作;手动点击图标成功,excel表格中中的指令也会跳到下一条

  • 考虑到网络延迟问题,建议合理利用等待功能

(2).蹲点捡漏

在抢课一次的基础上套了一层死循环

巧妙利用f5、左键单击(循环直到找到图片为止)、左键单击(无需找到图片),可以24h挂机实现蹲点捡漏

请发挥你的聪明才智,正确截图

python实现自动抢课脚本的示例代码

4.坐标版本(不建议使用)

坐标版本位于coordinate_version目录下

如果能够确切知道所点击的位置的坐标,可以选用坐标版本

配合qq截图,你能够轻松知道你的鼠标在1920×1080分辨率下在屏幕上的坐标(以像素为单位)

顺序排列单击位置的坐标,实现抢课

excel表格中根据提示填写坐标、操作

5.代码


import pyautogui
import time
import xlrd
import pyperclip

# 定义鼠标事件
# duration类似于移动时间或移动速度,省略后则是瞬间移动到指定的位置
def Mouse(click_times, img_name, retry_times):
   if retry_times == 1:
       location = pyautogui.locateCenterOnScreen(img_name, confidence=0.9)
       if location is not None:
           pyautogui.click(location.x, location.y, clicks=click_times, duration=0.2, interval=0.2)

elif retry_times == -1:
       while True:
           location = pyautogui.locateCenterOnScreen(img_name,confidence=0.9)
           if location is not None:
               pyautogui.click(location.x, location.y, clicks=click_times, duration=0.2, interval=0.2)
   elif retry_times > 1:
       i = 1
       while i < retry_times + 1:
           location = pyautogui.locateCenterOnScreen(img_name,confidence=0.9)
           if location is not None:
               pyautogui.click(location.x, location.y, clicks=click_times, duration=0.2, interval=0.2)
               print("重复{}第{}次".format(img_name, i))
               i = i + 1

# cell_value     1.0:左键单击
#                2.0:输入字符串
#                3.0:等待
#                4.0:热键

# 任务一:进行一轮抢课
def WorkFunction1(sheet):
   i = 1
   while i < sheet.nrows:
       # 取excel表格中第i行操作
       cmd_type = sheet.cell_value(i, 1)
       # 1:左键单击
       if cmd_type == 1.0:
           # 获取图片名称
           img_name = sheet.cell_value(i, 2)
           retry_times = 1
           if sheet.cell_type(i, 3) == 2 and sheet.cell_value(i, 3) != 0:
               retry_times = sheet.cell_value(i, 3)
           Mouse(1, img_name, retry_times)
           print("单击左键:{}  Done".format(img_name))

# 2:输入字符串
       elif cmd_type == 2.0:
           string = sheet.cell_value(i, 2)
           pyperclip.copy(string)
           pyautogui.hotkey('ctrl','v')
           print("输入字符串:{}  Done".format(string))
       # 3:等待
       elif cmd_type == 3.0:
           wait_time = sheet.cell_value(i, 2)
           time.sleep(wait_time)
           print("等待 {} 秒  Done".format(wait_time))
       # 4:键盘热键
       elif cmd_type == 4.0:
           hotkey = sheet.cell_value(i, 2)
           # 防止刷新过快停留在原网页
           time.sleep(1)
           pyautogui.hotkey(hotkey)
           print("按下 {}  Done".format(hotkey))
           time.sleep(1)
       i = i + 1

# 任务二:蹲点等人退课
def WorkFunction2(sheet) :
   while True:
       WorkFunction1(sheet)
       time.sleep(2)

if __name__ == '__main__':
   start_time = time.time()
   file = "info.xlsx"
   # 打开文件
   xr = xlrd.open_workbook(filename=file)
   # 通过索引顺序获取表单
   sheet = xr.sheet_by_index(0)
   print("------欢迎使用自动抢课脚本------")
   print("---------@danteking---------")
   print("1.抢课一次")
   print("2.蹲点等人退课后抢指定课")
   choice = input(">>")
   start_time = time.time()

if choice == "1":
       WorkFunction1(sheet)
   elif choice == "2":
       WorkFunction2(sheet)
   else:
       print("非法输入,退出")
   end_time = time.time()
   time_consume = end_time - start_time
   time_consume = ('%.2f' % time_consume)
   print("耗时 {} 秒".format(time_consume))

来源:https://blog.csdn.net/m0_52640673/article/details/121889155

标签:python,自动抢课
0
投稿

猜你喜欢

  • python距离测量的方法

    2022-12-05 18:27:45
  • 浅谈python中常用的excel模块库

    2021-04-20 11:29:41
  • Pytorch Tensor的索引与切片例子

    2022-12-08 16:28:10
  • 教你如何用python开发一款数字推盘小游戏

    2021-11-03 23:22:14
  • python文件操作的基础详细讲解(write、read、readlines、readline)

    2021-04-05 19:31:44
  • Python和GO语言实现的消息摘要算法示例

    2023-03-27 02:07:05
  • MySQL查看和修改字符编码的实现方法

    2024-01-26 00:20:22
  • python 性能优化方法小结

    2022-08-04 21:13:43
  • 详解如何模拟实现node中的Events模块(通俗易懂版)

    2024-05-05 09:20:55
  • python中将阿拉伯数字转换成中文的实现代码

    2021-09-30 05:45:25
  • Oracle 管道 解决Exp/Imp大量数据处理问题

    2009-07-12 18:31:00
  • python包相关知识点之包的导入、相对路径以及绝对路径

    2023-08-11 11:09:46
  • Pytorch创建张量的四种方法

    2023-11-20 15:25:36
  • Go 加密解密算法小结

    2024-04-26 17:29:00
  • python 获取文件列表(或是目录例表)

    2021-06-27 20:14:24
  • Python中 传递值 和 传递引用 的区别解析

    2023-12-26 07:05:22
  • 解决iframe的frameborder在chrome/ff/ie下的差异

    2023-08-09 00:23:24
  • python if not in 多条件判断代码

    2023-06-29 17:40:57
  • python pymysql链接数据库查询结果转为Dataframe实例

    2024-01-16 22:07:29
  • 使用python+pandas读写xlsx格式中的数据

    2023-03-25 00:55:16
  • asp之家 网络编程 m.aspxhome.com