脚本如何实现自动化截图

wen 实用脚本 2

本文目录导读:

脚本如何实现自动化截图

  1. 浏览器自动化截图(Python + Selenium)
  2. 系统级截图(Python + Pillow/PyAutoGUI)
  3. JavaScript实现网页截图
  4. 命令行工具
  5. 定时自动截图脚本
  6. 浏览器扩展开发(Chrome扩展)
  7. 高级应用:监控系统变化
  8. 使用建议:

我来介绍几种实现自动化截图的方法,涵盖不同平台和使用场景:

浏览器自动化截图(Python + Selenium)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
# 配置浏览器选项
chrome_options = Options()
chrome_options.add_argument('--headless')  # 无头模式
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--window-size=1920,1080')
# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)
try:
    # 打开网页
    driver.get('https://example.com')
    time.sleep(2)  # 等待页面加载
    # 全页面截图
    driver.save_screenshot('full_page.png')
    # 元素截图
    element = driver.find_element_by_class_name('content')
    element.screenshot('element.png')
    # 特定区域截图
    driver.get_screenshot_as_file('region.png')
finally:
    driver.quit()

系统级截图(Python + Pillow/PyAutoGUI)

import pyautogui
from PIL import ImageGrab
import time
# 全屏截图
pyautogui.screenshot('screen.png')
# 特定区域截图
region = (100, 100, 800, 600)
pyautogui.screenshot('region.png', region=region)
# 使用PIL
image = ImageGrab.grab(bbox=(0, 0, 1920, 1080))
image.save('screen_full.png')
# 多窗口截图
def screenshot_window(window_title):
    import win32gui
    import win32ui
    import win32con
    # 查找窗口
    hwnd = win32gui.FindWindow(None, window_title)
    if hwnd:
        # 获取窗口尺寸
        left, top, right, bottom = win32gui.GetWindowRect(hwnd)
        width = right - left
        height = bottom - top
        # 截图
        image = ImageGrab.grab(bbox=(left, top, right, bottom))
        image.save(f'{window_title}.png')
# 调用截图特定窗口
screenshot_window('记事本')

JavaScript实现网页截图

// 使用html2canvas库
async function captureElement(element) {
    const canvas = await html2canvas(element);
    const image = canvas.toDataURL('image/png');
    // 下载图片
    const link = document.createElement('a');
    link.download = 'screenshot.png';
    link.href = image;
    link.click();
}
// 使用现代浏览器API
async function captureScreen() {
    try {
        const stream = await navigator.mediaDevices.getDisplayMedia();
        const track = stream.getVideoTracks()[0];
        const imageCapture = new ImageCapture(track);
        const bitmap = await imageCapture.grabFrame();
        // 转换为图片
        const canvas = document.createElement('canvas');
        canvas.width = bitmap.width;
        canvas.height = bitmap.height;
        canvas.getContext('2d').drawImage(bitmap, 0, 0);
        const image = canvas.toDataURL('image/png');
        stream.getTracks().forEach(track => track.stop());
        return image;
    } catch (error) {
        console.error('截图失败:', error);
    }
}

命令行工具

# Windows使用PowerShell
powershell -command "Add-Type -AssemblyName System.Windows.Forms; $screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds; $bitmap = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height); $graphics = [System.Drawing.Graphics]::FromImage($bitmap); $graphics.CopyFromScreen($screen.Location, [System.Drawing.Point]::Empty, $screen.Size); $bitmap.Save('screenshot.png')"
# 使用scrot(Linux)
scrot -d 5 'screenshot.png'  # 延迟5秒截图
scrot -s 'selected.png'       # 选择区域截图
# 使用import(ImageMagick)
import -window root screenshot.png  # 截取整个屏幕

定时自动截图脚本

import time
import datetime
from PIL import ImageGrab
import os
def scheduled_screenshot():
    # 创建保存目录
    if not os.path.exists('screenshots'):
        os.makedirs('screenshots')
    for i in range(10):  # 截取10次
        # 获取当前时间
        timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
        # 截图
        image = ImageGrab.grab()
        # 保存文件
        filename = f'screenshots/{timestamp}.png'
        image.save(filename)
        print(f'保存: {filename}')
        # 等待5分钟
        time.sleep(300)
if __name__ == '__main__':
    scheduled_screenshot()

浏览器扩展开发(Chrome扩展)

// manifest.json
{
  "manifest_version": 3,
  "name": "自动截图扩展",
  "version": "1.0",
  "permissions": ["activeTab", "tabs"],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html"
  }
}
// background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.action === 'capture') {
    chrome.tabs.captureVisibleTab((dataUrl) => {
      sendResponse({ screenshot: dataUrl });
    });
  }
});

高级应用:监控系统变化

import os
from PIL import Image, ImageChops
def monitor_screen(template, threshold=0.05):
    """监控屏幕变化"""
    while True:
        # 截图当前画面
        current = ImageGrab.grab()
        # 与模板比较
        diff = ImageChops.difference(current, template)
        diff_bbox = diff.getbbox()
        if diff_bbox is None:
            print("画面无变化")
        else:
            # 计算差异程度
            diff_area = (diff_bbox[2] - diff_bbox[0]) * (diff_bbox[3] - diff_bbox[1])
            total_area = current.width * current.height
            if diff_area / total_area > threshold:
                print(f"检测到显著变化,保存截图")
                current.save('change_detected.png')
                break
        time.sleep(5)  # 每5秒检查一次

使用建议:

  1. 性能优化:对于高频率截图,考虑使用无头浏览器或更轻量的库
  2. 错误处理:添加异常处理和重试机制
  3. 存储管理:定期清理旧的截图文件
  4. 并发处理:如果截图操作频繁,考虑使用多线程

选择哪种方案取决于你的具体需求:

  • 网页测试:使用 Selenium 或 Playwright
  • 系统监控:使用 PyAutoGUI 或 PIL
  • 批量处理:使用命令行工具
  • 浏览器扩展:开发 Chrome extension

需要我详细展开某个特定方案的实现吗?

抱歉,评论功能暂时关闭!