接到一个需求,要求能自动点击视频播放键,当视频停止播放后接着让其播放。
这种与场景强相关的需求,需要看视频网站的具体行为。有的会自动检测活跃度,如果鼠标没反应播放就会暂停。有的会检测鼠标位置,如果脱离播放框就会暂停。还要看视频上一级播放完后是否会自动播放下一级。
研究完视频网站的播放行为,下一步就可以进行实际测试了。比如视频的行为是播完一级后会跳至下一级并暂停。此时就要决定什么时候点播放,如果没播完点击动作会将视频暂停,只有在暂停时才需要点播放。
将问题拆解:
-
如何查询当前鼠标的坐标
-
如何检查视频当前是播放状态还是暂停状态
-
如何触发鼠标点击动作
首先需要搞清楚鼠标的坐标,以下 python 程序可以实时显示当前鼠标坐标:
首先定位视频中的播放按钮坐标,后续根据坐标执行点击动作。查坐标的代码如下:
from pynput import mouse
import keyboard
def on_move(x, y):
print(f"当前鼠标位置:x={x}, y={y}")
# 创建鼠标监听器
listener = mouse.Listener(on_move=on_move)
# 启动监听线程
listener.start()
try:
# 等待Ctrl+C按下
keyboard.wait("ctrl+c")
except KeyboardInterrupt:
pass
finally:
# 停止鼠标监听器
listener.stop()
listener.join()
使用前需要安装 pynput 和 keyboard 模块:
pip install pynput
pip install keyboard
定位坐标后,下一步是检查播放页面是暂停状态还是播放状态。这里用到的方法是比较指定区域的图像是静止画面还是动态画面。通过前后图像对比,如果相同则是静止画面,处于暂停状态,相反则是播放状态。
程序运行前需要提供播放键的坐标,供鼠标点击和比较画面用,这里是视频的正中间的位置。程序的命令行界面如下:
自动播放视频的代码为:
from PIL import ImageGrab
import numpy as np
import time
import pyautogui
import argparse
default_x, default_y = 659, 353
x_coordinate = default_x
y_coordinate = default_y
width = 50
height = 50
def click_one():
pyautogui.moveTo(x_coordinate, y_coordinate)
pyautogui.click()
def capture_screen(x, y, width, height):
# 捕获屏幕上指定坐标范围的截图
screen = ImageGrab.grab(bbox=(x, y, x + width, y + height))
return np.array(screen)
def images_are_equal(image1, image2):
# 比较两个图像是否相似
difference = np.sum(np.abs(image1 - image2))
return difference < 1000 # 调整阈值以适应你的需求
def is_screen_static(x, y, width, height, check_interval=1, max_checks=10):
previous_image = capture_screen(x, y, width, height)
for _ in range(max_checks):
time.sleep(check_interval)
current_image = capture_screen(x, y, width, height)
if not images_are_equal(previous_image, current_image):
return False
previous_image = current_image
return True
def main():
global x_coordinate, y_coordinate
parser = argparse.ArgumentParser(description='鼠标监听脚本')
parser.add_argument('-x', '--x', type=int, default=default_x, help='鼠标点击的 x 坐标值,默认为659')
parser.add_argument('-y', '--y', type=int, default=default_y, help='鼠标点击的 y 坐标值,默认为353')
args = parser.parse_args()
x_coordinate = args.x
y_coordinate = args.y
while True:
if is_screen_static(x_coordinate, y_coordinate, width, height):
print("The specified screen area is static.")
print(f"当前坐标:{x_coordinate} {y_coordinate}")
click_one()
else:
print("The specified screen area is not static.")
pass
print('sleep...')
time.sleep(30)
if __name__ == '__main__':
main()
最后使用 pyinstaller 将代码编译为 exe 可执行文件,后面就可以交付使用了,在对方电脑上不用安装 python 运行环境。以上代码依赖的模块为:
pip install pillow
pip install numpy
pip install pyautogui
pyinstaller 打包命令为:
pyinstaller --onefile auto.py
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。
原文始发于微信公众号(生有可恋):自动刷视频的小工具
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论