Coze插件AI复刻之:网页截图

Coze插件实现网页一键截图

告别复制网址→打开浏览器→手动截图的繁琐流程!在Coze发现一款极简插件:只需粘贴网址,1秒自动生成高清截图!亲测比传统方式快10倍,果断用AI复刻自用——现在分享网页内容再也不用切换软件了!

package main

import (
	"fmt"
	"log"
	"net/url"
	"os"
	"path/filepath"
	"time"

	"github.com/playwright-community/playwright-go"
)

type ScreenshotOptions struct {
	targetURL string
	savePath  string
	fullPage  bool
	width     int
	height    int
}

// CaptureFullPageScreenshot 截取长网页完整内容并保存
// targetURL: 目标网页地址
// savePath: 截图保存路径(相对/绝对路径均可)
func CaptureFullPageScreenshot(options ScreenshotOptions) error {
	if options.targetURL == "" {
		return fmt.Errorf("targetURL 不能为空")
	}
	if options.savePath == "" {
		return fmt.Errorf("savePath 不能为空")
	}
	if options.width == 0 {
		options.width = 1920
	}
	if options.height == 0 {
		options.height = 1080
	}
	// 1. 初始化 Playwright 实例(需确保本地已安装 Playwright 浏览器依赖)
	pw, err := playwright.Run()
	if err != nil {
		return fmt.Errorf("初始化 Playwright 失败: %w", err)
	}
	// 延迟关闭 Playwright,确保资源释放
	defer pw.Stop()

	// 2. 启动浏览器(可选 chromium/firefox/webkit,headless 模式不显示窗口)
	browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{
		Headless: playwright.Bool(true),    // 生产环境建议开启无头模式
		Args:     []string{"--no-sandbox"}, // 避免权限问题(Linux 环境常用)
	})
	if err != nil {
		return fmt.Errorf("启动浏览器失败: %w", err)
	}
	// 延迟关闭浏览器
	defer browser.Close()

	// 3. 创建新页面
	page, err := browser.NewPage(playwright.BrowserNewPageOptions{
		Viewport: &playwright.Size{
			Width:  options.width,
			Height: options.height,
		},
		Screen: &playwright.Size{
			Width:  options.width,
			Height: options.height,
		},
	})
	if err != nil {
		return fmt.Errorf("创建页面失败: %w", err)
	}
	// 延迟关闭页面
	defer page.Close()

	// 4. 访问目标网页,等待页面完全加载(load 状态包含所有资源)
	if _, err := page.Goto(options.targetURL, playwright.PageGotoOptions{
		WaitUntil: playwright.WaitUntilStateDomcontentloaded, // 等待页面加载完成
	}); err != nil {
		return fmt.Errorf("访问网页 %s 失败: %w", options.targetURL, err)
	}

	// 如果不是完整页面,才需要滚动
	if !options.fullPage {
		// 循环滚动10次,每次滚动1000像素,间隔1秒(根据页面长度调整)
		for i := 0; i < 10; i++ {
			if err := page.Mouse().Wheel(0, 1000); err != nil { // 向下滚动1000像素
				log.Printf("滚动页面失败: %v", err)
				break
			}
			time.Sleep(300 * time.Millisecond) // 等待加载新内容
		}

		// 滚动到页面底部
		if err := page.Mouse().Wheel(0, 10000); err != nil { // 向下滚动10000像素
			log.Printf("滚动页面失败: %v", err)
		}
	}

	time.Sleep(1 * time.Second) // 等待加载新内容

	// 5. 关键:设置 FullPage: true 截取整个网页
	if _, err := page.Screenshot(playwright.PageScreenshotOptions{
		Path:     playwright.String(options.savePath), // 保存路径
		FullPage: playwright.Bool(options.fullPage),   // 核心参数:截取完整页面
		Type:     playwright.ScreenshotTypePng,        // 图片格式(png/jpeg/webp)
		//Quality:  playwright.Int(90),           // 仅 jpeg/webp 有效,质量 0-100
	}); err != nil {
		return fmt.Errorf("生成截图失败: %w", err)
	}

	// 转换为绝对路径,方便用户查看
	absPath, _ := filepath.Abs(options.savePath)
	fmt.Printf("长网页截图已保存至:%s\n", absPath)
	return nil
}

func main() {
	saveDir := "./screenshots/" + time.Now().Format("20060102")
	// 新建截图目录
	if err := os.MkdirAll(saveDir, 0755); err != nil {
		log.Fatalf("创建目录失败: %v", err)
	}
	// 示例
	targetURL := "https://www.ai-ku.cn/"
	// 解析URL,获取文件名
	parsedURL, err := url.Parse(targetURL)
	if err != nil {
		log.Fatalf("解析URL失败: %v", err)
	}
	filename := filepath.Base(parsedURL.Hostname()) + ".png" // 提取路径中的文件名,添加.png后缀
	savePath := filepath.Join(saveDir, filename)             // 保存到当前目录

	// 统计执行时间
	startTime := time.Now()
	// 执行截图并处理错误
	if err := CaptureFullPageScreenshot(ScreenshotOptions{
		targetURL: targetURL,
		savePath:  savePath,
		fullPage:  true,
		width:     1920,
		height:    1080,
	}); err != nil {
		log.Fatalf("截图任务失败: %v", err)
	}
	// 计算执行时间
	elapsed := time.Since(startTime)
	fmt.Printf("截图任务完成!耗时: %v\n", elapsed)
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值