Coze插件AI复刻之:网页截图
告别复制网址→打开浏览器→手动截图的繁琐流程!在Coze发现一款极简插件:只需粘贴网址,1秒自动生成高清截图!亲测比传统方式快10倍,果断用AI复刻自用——现在分享网页内容再也不用切换软件了!
package mainimport ("fmt""log""net/url""os""path/filepath""time""github.com/playwright-community/playwright-go"
)type ScreenshotOptions struct {targetURL stringsavePath stringfullPage boolwidth intheight 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)
}