我的编程空间,编程开发者的网络收藏夹
学习永远不晚

go语言怎么使用Chromedp实现二维码登陆

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

go语言怎么使用Chromedp实现二维码登陆

本文小编为大家详细介绍“go语言怎么使用Chromedp实现二维码登陆”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言怎么使用Chromedp实现二维码登陆”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

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/为例)

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

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

创建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)}

执行自定义的任务

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

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

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

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

go语言怎么使用Chromedp实现二维码登陆

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

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

go语言怎么使用Chromedp实现二维码登陆

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

go语言怎么使用Chromedp实现二维码登陆

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

go语言怎么使用Chromedp实现二维码登陆

用代码执行上述点击步骤

// 自定义任务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-okchromedp.Click(`#dialog > div.dialog-wrapper > div > div.dialog-footer > div.dialog-footer-ok`),}}

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

go语言怎么使用Chromedp实现二维码登陆

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

go语言怎么使用Chromedp实现二维码登陆

用代码实现获取二维码

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

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

func myTasks() chromedp.Tasks {return chromedp.Tasks{// 1. 打开金山文档的登陆界面...// 2. 点击微信登陆按钮...// 3. 点击确认按钮...// 4. 获取二维码// #wximportgetCode(),}}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}}

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

go语言怎么使用Chromedp实现二维码登陆

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

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

在上述步骤中,我们已经获取了二维码,接下来我们需要在终端显示二维码,首先是解码,这里使用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}

然后重新编码来输出二维码到终端,这里使用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}

修改我们第二步的过程

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}}

运行程序即可查看效果

go语言怎么使用Chromedp实现二维码登陆

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

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

// 保存Cookiesfunc 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. 获取cookiescookies, 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}}

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

// 加载Cookiesfunc 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}// 设置cookiesreturn network.SetCookies(cookiesParams.Cookies).Do(ctx)}}

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

// 检查是否登陆func checkLoginStatus() chromedp.ActionFunc {return func(ctx context.Context) (err error) {var url stringif 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}}

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

// 自定义任务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(),}}

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

go语言怎么使用Chromedp实现二维码登陆

读到这里,这篇“go语言怎么使用Chromedp实现二维码登陆”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

go语言怎么使用Chromedp实现二维码登陆

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

下载Word文档

猜你喜欢

go语言怎么使用Chromedp实现二维码登陆

本文小编为大家详细介绍“go语言怎么使用Chromedp实现二维码登陆”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言怎么使用Chromedp实现二维码登陆”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1
2023-06-30

怎么用go语言编程实现二维码生成及识别

本文小编为大家详细介绍“怎么用go语言编程实现二维码生成及识别”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用go语言编程实现二维码生成及识别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。安装 go-qrc
2023-06-30

怎么使用Go语言来实现密码算法

这篇“怎么使用Go语言来实现密码算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Go语言来实现密码算法”文章吧。首
2023-07-05

怎么使用Go语言实现Spark

这篇文章主要介绍了怎么使用Go语言实现Spark的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Go语言实现Spark文章都会有所收获,下面我们一起来看看吧。为什么使用Go语言实现SparkGo语言的成长
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录