很多时候需要看网课完成一下学习任务,但在某些平台在播完一条视频后并不会自动切播到下一条。所以这里简单用python写了一个脚本,利用PyAutoGui库自动完成一些如鼠标移动点击来快速切换的操作。
源码地址
现已将代码上传至GitHub仓库(其中包含一些其它帮助学习的程序):
https://github.com/Z-MiCTrue/Auto_Stuendthttps://github.com/Z-MiCTrue/Auto_Stuendt
环境准备
需要安装的库有:
numpy opencv-python pyautogui
目录结构
│ main.py
│ params.txt
│
└─templates
1.png
2.png
......
代码速览
整体代码(auto_view.py):
import sys
import time
from 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) = maxLoc
x_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 img
def 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
睡一觉 ......文章来源:https://www.toymoban.com/news/detail-442966.html
明早起来课程全部看完文章来源地址https://www.toymoban.com/news/detail-442966.html
到了这里,关于[脚本] 如果电脑不会自己看网氪,就应该用Python教会它的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!