[脚本] 如果电脑不会自己看网页,就应该用Python教会它

很多时候需要看网课完成一下学习任务,但在某些平台在播完一条视频后并不会自动切播到下一条。所以这里简单用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

睡一觉 ……

明早起来课程全部看完

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年5月11日
下一篇 2023年5月11日

相关推荐