iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >go语言使用Chromedp实现二维码登陆教程示例源码
  • 810
分享到

go语言使用Chromedp实现二维码登陆教程示例源码

2024-04-02 19:04:59 810人浏览 独家记忆
摘要

目录1 Chromedp是什么2 为什么不使用selenium3 文章解决了什么需求4.如何使用chromedp进行二维码登陆4.1 安装chromedp4.2 尝试打开网站4.3

源码点击下载

1 Chromedp是什么

chromedp是一个更快、更简单的golang库用于调用支持Chrome DevTools协议的浏览器,同时不需要额外的依赖(例如Selenium和Phantomjs

Chrome和Golang都与Google有着相当密切的关系,而Chrome DevTools其实就是Chrome浏览器按下F12之后的控制终端

2 为什么不使用Selenium

对于Golang开发来说,使用chromedp更为便捷,因为它仅仅需要Chrome浏览器而并不需要依赖ChromeDriver,省去了依赖问题,有助于自动化的构建和多平台架构的迁移

3 文章解决了什么需求

  • 如何使用chromedp进行二维码登陆
  • 如何将二维码展示在无图形化的终端上(makiuchi-d/gozxing解码skip2/ go-qrcode编码)
  • 如何保存Cookies实现短时间免登陆

网站会更新,文章不保证更新,请务必学会举一反三

4.如何使用chromedp进行二维码登陆

4.1 安装chromedp

  • 下载并安装Chrome浏览器
  • 创建Golang项目,开启Go Module(在项目目录下使用终端输入go mod init)
  • 在项目目录下使用终端输入:
go get -u GitHub.com/chromedp/chromedp

(如果有依赖问题请删除-u)

4.2 尝试打开网站

(以金山文档https://account.wps.cn/为例)

1.重新设置chromedp使用"有头"的方式打开,以便于我们进行debug

func main(){
    // chromdp依赖context上限传递参数
	ctx, _ := chromedp.NewExecAllocator(
		context.Background(),
		// 以默认配置的数组为基础,覆写headless参数
		// 当然也可以根据自己的需要进行修改,这个flag是浏览器的设置
		append(
			chromedp.DefaultExecAllocatorOptions[:],
			chromedp.Flag("headless", false),
		)...,
	)
}

2.创建chromedp上下文对象

func main(){
    // chromdp依赖context上限传递参数
    ...
    // 创建新的chromedp上下文对象,超时时间的设置不分先后
    // 注意第二个返回的参数是cancel(),只是我省略了
	ctx, _ = context.WithTimeout(ctx, 30*time.Second)
	ctx, _ = chromedp.NewContext(
		ctx,
		// 设置日志方法
		chromedp.WithLogf(log.Printf),
	)
	// 通常可以使用 defer cancel() 去取消
	// 但是在windows环境下,我们希望程序能顺带关闭掉浏览器
	// 如果不希望浏览器关闭,使用cancel()方法即可
	// defer cancel()
	// defer chromedp.Cancel(ctx)
}

3.执行自定义的任务

func main(){
    // chromdp依赖context上限传递参数
    ...
    // 创建新的chromedp上下文对象,超时时间的设置不分先后
    // 注意第二个返回的参数是cancel(),只是我省略了
    ...
    // 执行我们自定义的任务 - myTasks函数在第4步
	if err := chromedp.Run(ctx, myTasks()); err != nil {
		log.Fatal(err)
		return
	}
}

4.至此程序的初始化过程已经完成,接下来就是任务——打开登陆页面

// 自定义任务
func myTasks() chromedp.Tasks {
	return chromedp.Tasks{
		// 1. 打开金山文档的登陆界面
		chromedp.Navigate(loginURL),
	}
}

5.运行一下程序,可以看到Chrome被打开,同时访问了我们指定的网站

4.3 获取二维码(点击过程)

1.需要点击微信登陆按钮,先找到按钮的选择器,右键按钮并在菜单中点击检查,然后可以看到按钮的元素

2.右键元素打开菜单找到copy下的copy selector,即获取到选择器

3.我们尝试点击微信登陆按钮,发现还需要点击一下确认,重复上述步骤获取确认按钮的选择器

4.用代码执行上述点击步骤

// 自定义任务
func myTasks() chromedp.Tasks {
	return chromedp.Tasks{
		// 1. 打开金山文档的登陆界面
		chromedp.Navigate(loginURL),
		// 2. 点击微信登陆按钮
		// #wechat > span:nth-child(2)
		chromedp.Click(`#wechat > span:nth-child(2)`),
		// 3. 点击确认按钮
		// #dialog > div.dialog-wrapper > div > div.dialog-footer > div.dialog-footer-ok
		chromedp.Click(`#dialog > div.dialog-wrapper > div > div.dialog-footer > div.dialog-footer-ok`),
	}
}

5.运行程序即可直达二维码展示界面

6.用同样的方式,获取二维码图片的选择器

7.用代码实现获取二维码

有两点需要注意,第一是二维码有加载过程,第二是二维码是元素渲染,

我们需要用截图的方式获取(也可以用js来获取对应的href并下载,但是为了照顾小白,选择最简单的)

func myTasks() chromedp.Tasks {
	return chromedp.Tasks{
		// 1. 打开金山文档的登陆界面
		...
		// 2. 点击微信登陆按钮
		...
		// 3. 点击确认按钮
		...
		// 4. 获取二维码
		// #wximport
		getCode(),
	}
}
func getCode() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		// 1. 用于存储图片的字节切片
		var code []byte
		// 2. 截图
		// 注意这里需要注明直接使用ID选择器来获取元素(chromedp.ByID)
		if err = chromedp.Screenshot(`#wximport`, &code, chromedp.ByID).Do(ctx); err != nil {
			return
		}
		// 3. 保存文件
		if err = ioutil.WriteFile("code.png", code, 0755); err != nil {
			return
		}
		return
	}
}

8.执行程序即可发现目录下已经存储了二维码图片文件,我们可以通过扫描此二维码进行登陆,与浏览器上扫描为同一种效果

5. 如何将二维码展示在无图形化的终端上

(与chromedp无关,属于额外内容)

1.在上述步骤中,我们已经获取了二维码,接下来我们需要在终端显示二维码,首先是解码,这里使用gozxing库

func printQRCode(code []byte) (err error) {
	// 1. 因为我们的字节流是图像,所以我们需要先解码字节流
	img, _, err := image.Decode(bytes.NewReader(code))
	if err != nil {
		return
	}
	// 2. 然后使用gozxing库解码图片获取二进制位图
	bmp, err := gozxing.NewBinaryBitmapFromImage(img)
	if err != nil {
		return
	}
	// 3. 用二进制位图解码获取gozxing的二维码对象
	res, err := qrcode.NewQRCodeReader().Decode(bmp, nil)
	if err != nil {
		return
	}
	return
}

2.然后重新编码来输出二维码到终端,这里使用go-qrcode库

// 请注意import的库发生了重名
import (
	"github.com/makiuchi-d/gozxing"
	"github.com/makiuchi-d/gozxing/qrcode"
	goQrcode "github.com/skip2/go-qrcode"
)
func printQRCode(code []byte) (err error) {
	// 1. 因为我们的字节流是图像,所以我们需要先解码字节流
	...
	// 2. 然后使用gozxing库解码图片获取二进制位图
	...
	// 3. 用二进制位图解码获取gozxing的二维码对象
	...
	// 4. 用结果来获取go-qrcode对象(注意这里我用了库的别名)
	qr, err := goQrcode.New(res.String(), goQrcode.High)
	if err != nil {
		return
	}
	// 5. 输出到标准输出流
	fmt.Println(qr.ToSmallString(false))
	return
}

3.修改我们第二步的过程

func getCode() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		// 1. 用于存储图片的字节切片
		...
		// 2. 截图
		// 注意这里需要注明直接使用ID选择器来获取元素(chromedp.ByID)
		...
		// 3. 把二维码输出到标准输出流
		if err = printQRCode(code); err != nil {
			return err
		}
		return
	}
}

4.运行程序即可查看效果

6. 如何保存Cookies实现短时间免登陆

1.在上述过程中,我们可以通过二维码扫描登陆,网站会在登陆之后进行跳转,跳转后我们需要保存cookies来维持我们的登录状态,代码实现如下

// 保存Cookies
func saveCookies() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		// 等待二维码登陆
		if err = chromedp.WaitVisible(`#app`, chromedp.ByID).Do(ctx); err != nil {
			return
		}
		// cookies的获取对应是在devTools的network面板中
		// 1. 获取cookies
		cookies, err := network.GetAllCookies().Do(ctx)
		if err != nil {
			return
		}
		// 2. 序列化
		cookiesData, err := network.GetAllCookiesReturns{Cookies: cookies}.MarshalJSON()
		if err != nil {
			return
		}
		// 3. 存储到临时文件
		if err = ioutil.WriteFile("cookies.tmp", cookiesData, 0755); err != nil {
			return
		}
		return
	}
}

2.获取到Cookies之后,我们需要在程序运行时将Cookies从临时文件中加载到浏览器中

// 加载Cookies
func loadCookies() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		// 如果cookies临时文件不存在则直接跳过
		if _, _err := os.Stat("cookies.tmp"); os.IsNotExist(_err) {
			return
		}
		// 如果存在则读取cookies的数据
		cookiesData, err := ioutil.ReadFile("cookies.tmp")
		if err != nil {
			return
		}
		// 反序列化
		cookiesParams := network.SetCookiesParams{}
		if err = cookiesParams.UnmarshalJSON(cookiesData); err != nil {
			return
		}
		// 设置cookies
		return network.SetCookies(cookiesParams.Cookies).Do(ctx)
	}
}

3.通过上述两步我们已经可以保持登陆状态,然后我们需要检查一下是否成功,这里调用浏览器执行js脚本获取当前页面的网址,判断是否已经个人中心页面,如果为真,则停止操作

// 检查是否登陆
func checkLoginStatus() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		var url string
		if err = chromedp.Evaluate(`window.location.href`, &url).Do(ctx); err != nil {
			return
		}
		if strings.Contains(url, "Https://account.wps.cn/usercenter/apps") {
			log.Println("已经使用cookies登陆")
			chromedp.Stop()
		}
		return
	}
}

4.最终重新设置我们的浏览器任务即可

// 自定义任务
func myTasks() chromedp.Tasks {
	return chromedp.Tasks{
		// 0. 加载cookies <-- 变动
		loadCookies(),
		// 1. 打开金山文档的登陆界面
		...
		// 判断一下是否已经登陆  <-- 变动
		checkLoginStatus(),
		// 2. 点击微信登陆按钮
		// #wechat > span:nth-child(2)
		...
		// 3. 点击确认按钮
		// #dialog > div.dialog-wrapper > div > div.dialog-footer > div.dialog-footer-ok
		...
		// 4. 获取二维码
		// #wximport
		...
		// 5. 若二维码登录后,浏览器会自动跳转到用户信息页面  <-- 变动
		saveCookies(),
	}
}

5.我们使用已经登陆的cookies运行程序可以发现我们成功跳过登陆过程

以上就是go语言使用Chromedp实现二维码登陆教程示例源码的详细内容,更多关于go Chromedp二维码登陆的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: go语言使用Chromedp实现二维码登陆教程示例源码

本文链接: https://www.lsjlt.com/news/147693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言使用Chromedp实现二维码登陆教程示例源码
    目录1 Chromedp是什么2 为什么不使用Selenium3 文章解决了什么需求4.如何使用chromedp进行二维码登陆4.1 安装chromedp4.2 尝试打开网站4.3 ...
    99+
    2024-04-02
  • go语言怎么使用Chromedp实现二维码登陆
    本文小编为大家详细介绍“go语言怎么使用Chromedp实现二维码登陆”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言怎么使用Chromedp实现二维码登陆”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1...
    99+
    2023-06-30
  • Windows用户必看!Go语言实现二维码生成函数教程!
    二维码已经成为现代生活中不可或缺的一部分,我们可以在商场、餐厅、医院等各个场所看到二维码的身影。今天,我们将教大家如何使用Go语言实现二维码生成函数。使用该函数,您可以轻松地生成任何文本或网址的二维码。下面让我们开始吧! 第一步:安装Go...
    99+
    2023-09-14
    二维码 windows 函数
  • Go语言如何实现二维码生成?
    随着移动互联网的发展,二维码已经成为了一种非常普遍的扫码方式。在很多场景下,我们都可以看到二维码的身影。那么,在Go语言中如何实现二维码的生成呢?本文将会带大家一起探讨这个问题。 一、使用Go语言实现二维码的基本原理 在Go语言中,我们可...
    99+
    2023-06-04
    二维码 leetcode git
  • GO语言如何实现二维码同步?
    随着移动互联网的发展,二维码已成为人们生活中不可或缺的一部分。在很多场景中,二维码已经代替了传统的条形码,例如在商场购物时,顾客可以使用手机扫描二维码来获取商品信息和优惠信息。在这篇文章中,我们将介绍如何使用GO语言实现二维码同步。 在G...
    99+
    2023-08-23
    同步 二维码 spring
  • 如何使用Go语言实现实时生成JavaScript二维码?
    随着移动互联网的发展,二维码已经成为了一种非常方便的信息交互方式。在网页中,我们可以使用JavaScript来生成二维码。那么,如果我们想要在Go语言中实现实时生成JavaScript二维码,应该怎么做呢?本文将为您介绍如何使用Go语言实...
    99+
    2023-11-06
    实时 javascript 二维码
  • 如何使用Go语言解析二维码?
    二维码在现代生活中已经成为了一种非常流行的信息传递方式。无论是商家在商品上贴上的二维码,还是朋友圈里分享的二维码,都能够快速地传递信息。本文将介绍如何使用Go语言解析二维码,并附带演示代码。 安装Go语言环境 在开始之前,首先需要安装...
    99+
    2023-06-04
    二维码 leetcode git
  • Go语言能否实现二维码实时生成?
    二维码已经成为了现代生活中的一个重要元素,它可以用于各种场景,比如商业活动、支付、身份验证等等。在这些场景中,实时生成二维码是非常有必要的。那么,Go语言能否实现二维码实时生成呢?本文将给出答案。 首先,我们需要了解一下什么是二维码。二维...
    99+
    2023-10-26
    二维码 实时 spring
  • 如何使用Go语言实现自定义二维码样式?
    Go语言是一种高效、简洁的编程语言,在二维码生成中也有非常广泛的应用。本文将介绍如何使用Go语言实现自定义二维码样式。 一、二维码简介 二维码是一种二维条码,可以存储一些信息,如网址、电话号码、电子邮件等。它由黑色和白色模块组成,可以被扫描...
    99+
    2023-06-04
    二维码 leetcode git
  • 如何在GO语言中使用二维码实现实时响应?
    二维码是一种很流行的信息交互方式,它可以将文本、网址、电话号码等信息编码成图形,方便用户进行扫描和识别。在现代化的应用程序中,二维码也被广泛应用,例如在支付、会议签到、电子门票等方面。如何在GO语言中使用二维码实现实时响应呢?本篇文章将为...
    99+
    2023-07-19
    二维码 响应 实时
  • 二维码生成器:如何在Go语言中实现实时生成JavaScript二维码?
    二维码已经成为现代生活中不可或缺的一部分,它们被用于广告、宣传、票据、付款等各种场景。二维码的生成和解码已经得到了广泛的支持,因此,越来越多的人开始使用二维码来代替传统的条形码。 在本文中,我们将介绍如何在Go语言中实现实时生成JavaS...
    99+
    2023-11-06
    实时 javascript 二维码
  • 如何使用 Go 语言实现异步编程中的二维码生成?
    二维码作为现代通信技术中的重要组成部分,在我们的日常生活中扮演着越来越重要的角色。在许多应用程序中,我们需要对二维码进行生成、解析和处理。在本文中,我们将介绍如何使用 Go 语言实现异步编程中的二维码生成。 Go 语言是一种开源的编程语言...
    99+
    2023-07-22
    大数据 异步编程 二维码
  • 怎么用go语言编程实现二维码生成及识别
    本文小编为大家详细介绍“怎么用go语言编程实现二维码生成及识别”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用go语言编程实现二维码生成及识别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。安装 go-qrc...
    99+
    2023-06-30
  • 异步编程和大数据:Go 语言的二维码实现
    在当今数字化时代,二维码已经成为了一种非常方便的数据传输方式,它可以通过扫描二维码来获取信息,包括网址、联系方式、商品信息等等。在实现二维码的过程中,异步编程和大数据处理都是非常重要的因素。本文将介绍如何使用Go语言实现异步编程和大数据处...
    99+
    2023-07-22
    大数据 异步编程 二维码
  • 如何在GO语言中使用Spring框架实现二维码同步?
    二维码是现代社会中广泛使用的一种信息传输方式,其可以将大量的信息储存在一个小小的图形中,便于用户扫描和获取信息。在企业应用中,二维码的使用也越来越普遍,比如在物流、零售等领域,都可以利用二维码进行信息的传输和管理。本文将介绍如何在GO语言...
    99+
    2023-08-23
    同步 二维码 spring
  • 二维码生成器:使用Go语言和Linux系统轻松实现!
    二维码是一种二维条码,它可以存储大量信息,如URL、联系人信息、文本等。它已经被广泛应用于移动支付、广告传媒、商业推广等领域。而二维码生成器可以快速生成各种二维码,为人们提供便利。本文将介绍如何使用Go语言和Linux系统轻松实现一个二维码...
    99+
    2023-10-16
    spring linux 二维码
  • Go语言实现新春祝福二维码的生成
    目录前言简单二维码生成字节流二维码识别二维码前言 二维码现在是随处度可以看到,买东西,支付,添加好友只要你扫一扫就能完成整个工作,简单且方便。所以利用这个新春佳节做一个带着新春祝福的...
    99+
    2023-02-07
    Go语言生成祝福二维码 Go语言生成二维码 Go语言二维码
  • 二维码和NumPy:如何在Go语言中实现快速解码?
    随着移动互联网的普及,二维码已经成为了人们生活中不可或缺的一部分。二维码的出现不仅使得信息传播变得更加便捷,还可以为商家、政府等机构提供更加便捷的数据收集手段。但是,对于开发者来说,如何快速解码二维码却是一个不小的难题。本文将介绍如何使用...
    99+
    2023-09-08
    numpy apache 二维码
  • Go 语言中如何使用接口实现二维码扫描功能?
    随着移动互联网的快速发展,二维码已经成为了一种不可或缺的技术。而在开发过程中,如何快速、高效地实现二维码扫描功能是一个关键问题。本文将介绍如何使用 Go 语言中的接口实现二维码扫描功能,帮助开发者快速实现这一功能。 一、了解二维码扫描的原...
    99+
    2023-08-27
    二维码 索引 接口
  • 如何在Windows上使用Go编程语言生成二维码?
    Go是一种相对新兴的编程语言,它的简洁和高效性已经吸引了越来越多的程序员。在Windows系统中,我们可以使用Go编程语言来生成二维码,这篇文章将会为大家详细介绍如何使用Go来实现这个过程。 一、安装Go语言环境 在开始之前,我们需要在Wi...
    99+
    2023-09-14
    二维码 windows 函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作