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 模块允许直接导入来自有限元分析 (FEA) 软件的变形数据,从而将光学设计与热和结构分析联系起来。这种集成可以分析实际环境因素(如热和机械应力)对光学性能的影响。该模块有助于了解光学系…...
知识图谱的语义叙事:构建智慧的连贯之路
目录 前言1. 什么是知识图谱的语义叙事1.1 语义清晰性1.2 叙事连贯性1.3 背景关联性 2. 知识图谱语义叙事的核心功能2.1 增强信息的可理解性2.2 提供上下文支持2.3 支持推理与发现2.4 提升知识可视化效果 3. 语义叙事的关键实现技术3.1 自然语言处理(NLP)…...
Oracle graph 图数据库体验-安装篇
服务端安装 环境准备 安装数据库 DOCKER 安装23AI FREE ,参考: 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:从入门到实战使用教程 Nginx安装、配置详细教程 文章目录 全方位解析Nginx:从入门到实战使用教程导语一、Nginx简介二、Nginx安装与配置 1. 在CentOS系统上安装Nginx:2. 在Ubuntu系统上安装Nginx:3. Nginx配置文…...
网络安全:信息时代的守护者
随着互联网的快速发展,网络安全问题日益成为全球关注的焦点。无论是个人用户、企业组织还是政府部门,网络安全都已成为保障信息安全、保护隐私、确保社会秩序的基石。在这个数字化时代,如何应对复杂多变的网络安全威胁,成为了我们…...
Visual Studio Code + Stm32 (IAR)
记录一下, 以前看别人在 vsc 下配置 stm32 工程非常麻烦。 最近,突然发现, iar 官方出了两个插件, iar build 、 iar C-Spy 安装之后,配置一下 iar 软件路径。 然后,直接打开工程目录,编译…...
JavaScript语言的正则表达式
JavaScript语言的正则表达式详解 正则表达式(Regular Expression,简称Regex或RegExp)是一种强大的文本处理工具,可以在字符串中执行模式匹配和替换操作。在JavaScript中,正则表达式是处理字符串时不可或缺的部分&…...
R语言的编程范式
R语言的编程范式探讨 引言 R语言作为一种专门用于统计分析和数据可视化的编程语言,近年来得到了广泛的应用。无论是在学术研究、企业分析,还是在数据科学的各个领域,R语言凭借其强大的数据处理能力和丰富的图形化工具,吸引了大批…...
CentOS9 安装Docker+Dpanel+onlyoffice(https、更改字体、字号、去除限制)的避坑笔记
CentOS9 安装Dockeronlyoffice(https、更改字体、字号、去除限制)的避坑笔记 一、安装Docker二、更新docker镜像源:三、安装Dpanel四、安装onlyoffice五、更改字体和字号六、去除限制 动手前,预防遭遇各种莫名奇妙的问题ÿ…...
Excel 技巧11 - 如何使用Excel作成简单的排班表(★★),weekday 函数,TEXT函数
本文讲了如何在Excel中制作简单的排班表。 1,排班表Layout效果 - B2 单元格找那个输入 日期 - C3 - AG3 输入日,就是该月份的几号,比如1月5号,就输入5 如果是周六周日,背景色显示为绿色 - B4 ~ 输入员工名称 当 B2…...
StarRocks 怎么让特定的SQL路由到FE master节点的
背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的,而只有master节点才能对元数据进行写操作。但是为什么呢?哪里有体现呢? 这其中的原因在网上是搜不到的,所以大家只知道只有master节点才…...
在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息
打印崩溃调用栈和局部变量信息的方法有所不同。以下是针对 Windows、Linux 和 MacOS 的示例代码。 Windows 在 Windows 上,可以使用 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时,可能会收到类似以下的提示信息:“x packages are looking for funding.” 这并不是错误提示,也不会影响项目的正常运行。其实实在提醒有一些软件包正在寻求资金支持。 根据提示输入npm fund可以查看详细的信息&#…...
豆包MarsCode:小C点菜问题
问题描述 思路分析 这道题的核心任务是找出所有不超过给定价格 m 的菜肴中,最常见的菜肴价格,最后返回该价格的出现次数。 1. 题意理解: 给定一个最大价格 m,小C只会选择价格不超过 m 的菜。菜单上有 n 道菜,每道菜…...
K8S中Pod控制器之CronJob(CJ)控制器
CronJob 控制器是 Kubernetes 中用于周期性执行任务的一种控制器,它基于 Job 控制器来创建和管理作业。以下是 CronJob 的一些关键特点: 周期性调度:CronJob 允许您定义一个基于时间的调度,类似于 Linux 的 cron 工具,…...
FRP内网穿透0.61.1新版教程
在上一篇zerotier讲述了如何实现虚拟局域网搭建,这篇会讲述FRP内网穿透的使用教程 那么frp与zerotier的区别是什么呢?(说人话) FRP 主要用于内网服务向外网的单向暴露。 ZeroTier 用于构建一个虚拟的私有网络,实现多点…...
亲测解决`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...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...
HTML版英语学习系统
HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具,使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章,系统朗读帮助练习听力和发音,适合跟读练习,模仿学习;实时词典查询 - 双…...
视觉slam--框架
视觉里程计的框架 传感器 VO--front end VO的缺点 后端--back end 后端对什么数据进行优化 利用什么数据进行优化的 后端是怎么进行优化的 回环检测 建图 建图是指构建地图的过程。 构建的地图是点云地图还是什么信息的地图? 建图并没有一个固定的形式和算法…...
第2篇:BLE 广播与扫描机制详解
本文是《BLE 协议从入门到专家》专栏第二篇,专注于解析 BLE 广播(Advertising)与扫描(Scanning)机制。我们将从协议层结构、广播包格式、设备发现流程、控制器行为、开发者 API、广播冲突与多设备调度等方面,全面拆解这一 BLE 最基础也是最关键的通信机制。 一、什么是 B…...
