当前位置: 首页 > 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...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

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

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

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...