很多时候需要看网课完成一下学习任务,但在某些平台在播完一条视频后并不会自动切播到下一条。所以这里简单用python写了一个脚本,利用PyAutoGui库自动完成一些如鼠标移动点击来快速切换的操作。
源码地址
现已将代码上传至GitHub仓库(其中包含一些其它帮助学习的程序):
https://github.com/Z-MiCTrue/Auto_Stuendthttps://github.com/Z-MiCTrue/Auto_Stuendt
环境准备
需要安装的库有:
numpy opencv-python pyautogui
目录结构
│ main.py
│ params.txt
│
└─templates1.png2.png......
代码速览
整体代码(auto_view.py):
import sys
import timefrom PIL import ImageGrab
import numpy as np
import cv2
import pyautogui# 倒数计时并打印
def countdown(total_time: int):for t in range(total_time):r = '\rcountdown: %ds [%s%s]' % ((total_time - t), '=' * (total_time - t), ' ' * t)sys.stdout.write(r)time.sleep(1)sys.stdout.flush()print('\nstart to work')# 读取txt数据
def txt2cache(filename):with open(filename, 'r', encoding='utf-8') as cache_data_txt:cache_data = cache_data_txt.read()cache_data = eval(cache_data) # eval函数用来执行一个字符串表达式, 这里是实例化字典return cache_data# 模板匹配
def template_match(img, template, mask=None):if len(img.shape) > 2:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)if len(template.shape) > 2:template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED, mask) # cv2的模板匹配minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) # 返回最大最小值及索引(x_1, y_1) = maxLocx_2 = x_1 + template.shape[1]y_2 = y_1 + template.shape[0]# cv2.rectangle(img, (x_1, y_1), (x_2, y_2), 0, 2) # 画出匹配框return np.array([x_1, y_1, x_2, y_2])class Auto_View:def __init__(self, params_txt):params = txt2cache(params_txt) # 从txt中读取配置self.screen_roi = params['screen_roi'] # 屏幕分辨率self.command_list = params['commands'] # 操作指令列表def grab_img(self):# 截图img = ImageGrab.grab(bbox=self.screen_roi)# 转为 cv2 格式img = cv2.cvtColor(np.array(img.convert('RGB')), cv2.COLOR_RGB2BGR)return imgdef start_work(self):countdown(5)for i, command in enumerate(self.command_list):print(f'perform operation: {i}')# 如果是路径字符串: 截图 + 读图匹配 + 鼠标点击if type(command) is str:img = self.grab_img() # 截图match_res = template_match(img, cv2.imread(command, 0), mask=None) # 读图匹配mouse_loc = np.array([np.mean(match_res[[0, 2]]), np.mean(match_res[[1, 3]])])pyautogui.click(x=mouse_loc[0], y=mouse_loc[1], clicks=1, interval=0, button='left') # 鼠标点击# 如果是数: 则等待相应时间elif type(command) in (int, float):time.sleep(command)print('finish')if __name__ == '__main__':auto_view = Auto_View('params.txt')auto_view.start_work()
其中 'params.txt' 内储存的是一个字典,示例内容如下:
{'screen_roi': (0, 0, 2560, 1600),'commands': [
'templates/1.png', 2,
'templates/2.png', 3,
'templates/3.png', 'templates/3.png', 'templates/3.png',
'templates/4.png', 3,
'templates/5.png', 4,
'templates/6.png', 1]}
如此书写主要是方便打包成exe后在没有python环境的系统上使用,通过修改txt文件中的列表,即可完成对整个操作的修改。
这里设计的执行逻辑是:循环读取命令,如果是模板图片路径,则屏幕截图 + 读图匹配 + 移动鼠标点击;如果是数,则等待(网页打开、视频观看至结束)。详细看注释。
快速使用
依次截图需要点击的图标在templates文件夹下,如图:
修改 'params.txt' 内的屏幕分辨率,路径以及等待时间
运行auto_view.py
睡一觉 ......
明早起来课程全部看完