告别复制网址→打开浏览器→手动截图的繁琐流程!在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)
}
Coze插件实现网页一键截图
2646

被折叠的 条评论
为什么被折叠?



