当前位置: 首页 > news >正文

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能,可以通过集成 `chromedp` 库来控制 Chrome 浏览器进行截图。`chromedp` 是一个基于 Chrome DevTools 协议的 Go 包,可以用来在 Go 程序中模拟浏览器操作,如页面截图、DOM 操作、表单提交等。

下面是一个设计方案,展示如何使用 `chromedp` 在 GoZero 中实现网页截图功能。

### 1. 项目设计

我们将创建一个 GoZero 服务,提供一个 API 接口,通过 `chromedp` 实现网页截图。

#### 主要组件:
- **chromedp**:用于控制浏览器进行截图。
- **GoZero**:作为 API 网关,处理客户端请求,并调用 `chromedp` 来生成截图。
- **接口设计**:提供一个 API 接口,接收网页 URL 和一些截图参数,返回截图的图片。

### 2. 安装依赖

首先需要安装 `chromedp` 库以及 GoZero 框架。

```bash

go get github.com/chromedp/chromedp
go get github.com/tal-tech/go-zero


```

### 3. 实现步骤

#### 3.1 创建截图功能

我们先使用 `chromedp` 实现截图功能,返回网页截图的二进制数据。```go

package mainimport ("context""fmt""github.com/chromedp/chromedp""golang.org/x/net/context""io/ioutil""log""time"
)// TakeScreenshot 截取网页并返回图片二进制数据
func TakeScreenshot(url string) ([]byte, error) {// 创建一个 Chrome 浏览器实例opts := append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", true), // 无头浏览模式chromedp.Flag("disable-gpu", true),chromedp.Flag("no-sandbox", true),)allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)defer cancel()// 创建一个新的浏览器会话ctx, cancel := chromedp.NewContext(allocCtx)defer cancel()// 设置浏览器超时时间ctx, cancel = context.WithTimeout(ctx, 30*time.Second)defer cancel()var buf []byte// 截图的目标操作:打开页面并截取网页err := chromedp.Run(ctx,chromedp.Navigate(url),chromedp.Sleep(2*time.Second), // 等待页面加载完成chromedp.CaptureScreenshot(&buf), // 截取页面)if err != nil {return nil, fmt.Errorf("failed to capture screenshot: %v", err)}return buf, nil
}func main() {url := "https://www.example.com" // 你可以替换为任意网页 URLimg, err := TakeScreenshot(url)if err != nil {log.Fatalf("Error: %v", err)}// 将截图保存为本地文件err = ioutil.WriteFile("screenshot.png", img, 0644)if err != nil {log.Fatalf("Failed to save screenshot: %v", err)}log.Println("Screenshot saved successfully")
}


```

#### 3.2 创建 GoZero API 接口

接下来,我们在 GoZero 中创建一个 API 接口,允许客户端传递 URL 参数并获取截图。

1. **创建 API 结构**:我们需要一个请求结构体来接收 URL 和返回的图片数据。```go

// api/screenshot.api
type ScreenshotRequest struct {URL string `json:"url"`
}type ScreenshotResponse struct {ImageData string `json:"image_data"`
}


```

2. **API 处理逻辑**:在 `screenshot` 的处理函数中调用 `chromedp` 实现截图功能。```go

package handlerimport ("context""github.com/tal-tech/go-zero/rest/httpx""your_project/api""your_project/service""net/http"
)// ScreenshotHandler 处理网页截图请求
func ScreenshotHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {var req api.ScreenshotRequestif err := httpx.Parse(r, &req); err != nil {httpx.Error(w, err)return}// 调用截图服务imgData, err := service.TakeScreenshot(req.URL)if err != nil {httpx.Error(w, err)return}// 返回截图的 Base64 编码(或者返回二进制图片数据)httpx.OkJson(w, api.ScreenshotResponse{ImageData: "data:image/png;base64," + imgData,})
}


```

3. **服务层实现截图**:将 `chromedp` 截图逻辑提取到服务层。```go

package serviceimport ("fmt""github.com/chromedp/chromedp""golang.org/x/net/context""time"
)// TakeScreenshot 截取网页并返回图片二进制数据
func TakeScreenshot(url string) (string, error) {opts := append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", true),chromedp.Flag("disable-gpu", true),chromedp.Flag("no-sandbox", true),)allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)defer cancel()ctx, cancel := chromedp.NewContext(allocCtx)defer cancel()// 设置浏览器超时时间ctx, cancel = context.WithTimeout(ctx, 30*time.Second)defer cancel()var buf []byteerr := chromedp.Run(ctx,chromedp.Navigate(url),chromedp.Sleep(2*time.Second),chromedp.CaptureScreenshot(&buf),)if err != nil {return "", fmt.Errorf("failed to capture screenshot: %v", err)}// 将图片转成 Base64 编码并返回return base64.StdEncoding.EncodeToString(buf), nil
}


```

4. **注册路由**:在 `main.go` 中设置 API 路由并启动服务。```go

package mainimport ("github.com/tal-tech/go-zero/rest""your_project/handler"
)func main() {// 创建 GoZero 路由r := rest.NewRouter()// 注册网页截图接口r.Add("POST", "/api/screenshot", handler.ScreenshotHandler)// 启动服务r.Start(":8080")
}


```

### 4. 运行与测试

1. 启动 GoZero 服务:

```bash

go run main.go


```

2. 通过 `curl` 或者 Postman 向 `/api/screenshot` 发送请求,传递 `url` 参数:

```bash

curl -X POST http://localhost:8080/api/screenshot -d '{"url": "https://www.example.com"}' -H "Content-Type: application/json"


```

3. 如果一切正常,您将会得到返回的 Base64 编码的截图数据,或者直接返回图片文件。

### 5. 总结

- 我们利用 `chromedp` 来实现在 GoZero 框架中通过浏览器截图网页。
- 通过 API 接口,客户端传入网址,服务端处理后返回截图。
- `chromedp` 可以通过无头浏览器模式,模拟真实用户浏览网页,完成截图操作。

这个方案具有很好的可扩展性,可以支持更多功能,比如截图尺寸调整、延时加载、设置代理等。

相关文章:

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能,可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包,可以用来在 Go 程序中模拟浏览器操作,如页面截图、DOM 操作、表单提交等。 下面是一个…...

AI发展困境:技术路径与实践约束的博弈

标题:AI发展困境:技术路径与实践约束的博弈 文章信息摘要: AI技术发展路径主要受实践约束驱动,而非纯理论优势。大型AI实验室的成功更依赖优质执行力和资源优势,而非独特技术创新。当前AI发展面临评估体系与实际应用脱…...

[前端算法]排序算法

在js中一般用到sort方法 arr.sort((a,b)>{return a-b })基础排序 冒泡排序 function bubbleSort(arr) {let len arr.length;for (let i 0; i < len; i) {for(let j0;j<len-i-1;j){if(arr[j]>arr[j1]){[arr[j],arr[j1]] [arr[j1],arr[j]]}}}console.log(arr);…...

Zemax STAR 模块的入门设置

Zemax OpticStudio 中的 STAR 模块允许直接导入来自有限元分析 &#xff08;FEA&#xff09; 软件的变形数据&#xff0c;从而将光学设计与热和结构分析联系起来。这种集成可以分析实际环境因素&#xff08;如热和机械应力&#xff09;对光学性能的影响。该模块有助于了解光学系…...

知识图谱的语义叙事:构建智慧的连贯之路

目录 前言1. 什么是知识图谱的语义叙事1.1 语义清晰性1.2 叙事连贯性1.3 背景关联性 2. 知识图谱语义叙事的核心功能2.1 增强信息的可理解性2.2 提供上下文支持2.3 支持推理与发现2.4 提升知识可视化效果 3. 语义叙事的关键实现技术3.1 自然语言处理&#xff08;NLP&#xff09…...

Oracle graph 图数据库体验-安装篇

服务端安装 环境准备 安装数据库 DOCKER 安装23AI FREE &#xff0c;参考&#xff1a; https://container-registry.oracle.com/ords/f?p113:4:111381387896144:::4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:1…...

Nginx:从入门到实战使用教程

全方位解析Nginx&#xff1a;从入门到实战使用教程 Nginx安装、配置详细教程 文章目录 全方位解析Nginx&#xff1a;从入门到实战使用教程导语一、Nginx简介二、Nginx安装与配置 1. 在CentOS系统上安装Nginx&#xff1a;2. 在Ubuntu系统上安装Nginx&#xff1a;3. Nginx配置文…...

网络安全:信息时代的守护者

随着互联网的快速发展&#xff0c;网络安全问题日益成为全球关注的焦点。无论是个人用户、企业组织还是政府部门&#xff0c;网络安全都已成为保障信息安全、保护隐私、确保社会秩序的基石。在这个数字化时代&#xff0c;如何应对复杂多变的网络安全威胁&#xff0c;成为了我们…...

Visual Studio Code + Stm32 (IAR)

记录一下&#xff0c; 以前看别人在 vsc 下配置 stm32 工程非常麻烦。 最近&#xff0c;突然发现&#xff0c; iar 官方出了两个插件&#xff0c; iar build 、 iar C-Spy 安装之后&#xff0c;配置一下 iar 软件路径。 然后&#xff0c;直接打开工程目录&#xff0c;编译…...

JavaScript语言的正则表达式

JavaScript语言的正则表达式详解 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex或RegExp&#xff09;是一种强大的文本处理工具&#xff0c;可以在字符串中执行模式匹配和替换操作。在JavaScript中&#xff0c;正则表达式是处理字符串时不可或缺的部分&…...

R语言的编程范式

R语言的编程范式探讨 引言 R语言作为一种专门用于统计分析和数据可视化的编程语言&#xff0c;近年来得到了广泛的应用。无论是在学术研究、企业分析&#xff0c;还是在数据科学的各个领域&#xff0c;R语言凭借其强大的数据处理能力和丰富的图形化工具&#xff0c;吸引了大批…...

CentOS9 安装Docker+Dpanel+onlyoffice(https、更改字体、字号、去除限制)的避坑笔记

CentOS9 安装Dockeronlyoffice&#xff08;https、更改字体、字号、去除限制&#xff09;的避坑笔记 一、安装Docker二、更新docker镜像源&#xff1a;三、安装Dpanel四、安装onlyoffice五、更改字体和字号六、去除限制 动手前&#xff0c;预防遭遇各种莫名奇妙的问题&#xff…...

Excel 技巧11 - 如何使用Excel作成简单的排班表(★★),weekday 函数,TEXT函数

本文讲了如何在Excel中制作简单的排班表。 1&#xff0c;排班表Layout效果 - B2 单元格找那个输入 日期 - C3 - AG3 输入日&#xff0c;就是该月份的几号&#xff0c;比如1月5号&#xff0c;就输入5 如果是周六周日&#xff0c;背景色显示为绿色 - B4 ~ 输入员工名称 当 B2…...

StarRocks 怎么让特定的SQL路由到FE master节点的

背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的&#xff0c;而只有master节点才能对元数据进行写操作。但是为什么呢&#xff1f;哪里有体现呢&#xff1f; 这其中的原因在网上是搜不到的&#xff0c;所以大家只知道只有master节点才…...

在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息

打印崩溃调用栈和局部变量信息的方法有所不同。以下是针对 Windows、Linux 和 MacOS 的示例代码。 Windows 在 Windows 上&#xff0c;可以使用 Windows API 来捕获异常并打印调用栈。 #include <windows.h> #include <DbgHelp.h> #include <stdio.h> #in…...

解决npm install安装出现packages are looking for funding run `npm fund` for details问题

当我们运行npm install时&#xff0c;可能会收到类似以下的提示信息&#xff1a;“x packages are looking for funding.” 这并不是错误提示&#xff0c;也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…...

豆包MarsCode:小C点菜问题

问题描述 思路分析 这道题的核心任务是找出所有不超过给定价格 m 的菜肴中&#xff0c;最常见的菜肴价格&#xff0c;最后返回该价格的出现次数。 1. 题意理解&#xff1a; 给定一个最大价格 m&#xff0c;小C只会选择价格不超过 m 的菜。菜单上有 n 道菜&#xff0c;每道菜…...

K8S中Pod控制器之CronJob(CJ)控制器

CronJob 控制器是 Kubernetes 中用于周期性执行任务的一种控制器&#xff0c;它基于 Job 控制器来创建和管理作业。以下是 CronJob 的一些关键特点&#xff1a; 周期性调度&#xff1a;CronJob 允许您定义一个基于时间的调度&#xff0c;类似于 Linux 的 cron 工具&#xff0c;…...

FRP内网穿透0.61.1新版教程

在上一篇zerotier讲述了如何实现虚拟局域网搭建&#xff0c;这篇会讲述FRP内网穿透的使用教程 那么frp与zerotier的区别是什么呢&#xff1f;&#xff08;说人话&#xff09; FRP 主要用于内网服务向外网的单向暴露。 ZeroTier 用于构建一个虚拟的私有网络&#xff0c;实现多点…...

亲测解决`data_array` is not of type `MetaTensor, assuming affine to be identity

这个问题是由于orientation的数据增强在scaling之后导致的,解决方法是将这两个数据增强的顺序调换。 问题原文 lib/python3.10/site-packages/monai/transforms/spatial/array.py:623: UserWarning: `data_array` is...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...