「GoCN酷Go推荐」chromedp一期 —— 截图小工具

推荐背景

chromedp是谷歌官方推出的无头浏览器,类似Selenium,但是由于Selenium对golang的支持并不是很好,而且我们也不需要去配置繁琐的chrome driver,有助于咱们golang的跨平台使用。

快速使用

准备环境

由于笔者只有windows和centos系统,就只介绍这两个系统的浏览器必要的安装方式:

Windows下直接安装chrome浏览器即可,不能用绿色版,必须是安装版
Centos下安装必要的驱动与文字库:
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum install mesa-libOSMesa-devel gnu-free-sans-fonts wqy-zenhei-fonts

安装

// 安装无头浏览器库 
go get github.com/chromedp/chromedp

由于网上都喜欢用来做爬虫,我就不做爬虫了,容易面向监狱编程,做个截图工具吧,想起当年PHP还用了第三方的CutyCapt,现在解放了。

手写截图工具(就直接上代码,代码中解释)

笔者喜欢一次性写完,自己粘贴复制到代码中实操一次即可。

package main

import (
 "context"
 "flag"
 "io/ioutil"
 "log"
 "os"
 "path/filepath"
 "regexp"
 "strings"
 "time"

 "github.com/chromedp/cdproto/page"
 "github.com/chromedp/chromedp"
)

type Chrome struct {
 Url         string
 UserAgent   string
 FullScreen  bool
 ResolutionX int
 ResolutionY int
 Delay       int64
}

var ChromeType *Chrome

// 初始化输入
func init() {
 ChromeType = new(Chrome)
 flag.StringVar(&ChromeType.Url, "url", "", "web http or https url (must)")
 flag.BoolVar(&ChromeType.FullScreen, "F", false, "full screenshots auto width and height")
 flag.StringVar(&ChromeType.UserAgent, "userAgent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36", "user agent string to use")
 flag.IntVar(&ChromeType.ResolutionX, "resolutionX", 1920, "screenshot resolution x")
 flag.IntVar(&ChromeType.ResolutionY, "resolutionY", 1080, "screenshot resolution y")
 flag.Int64Var(&ChromeType.Delay, "delay", 0, "delay in seconds between navigation and screenshot")
 flag.Parse()
}

// 网页截屏小工具
func main() {
 if ChromeType.Url == "" {
  panic("url must input!")
 }
 buf, err := ChromeType.Screenshot()
 if err != nil {
  panic(err.Error())
 }
 fp := ChromeType.SafeFileName()
 if err = ioutil.WriteFile(fp, buf, 0644); err != nil {
  panic(err.Error())
 }
 thisPath, _ := os.Getwd()
 log.Println("生成成功,文件名是:", filepath.Join(thisPath, fp))
}

func (chrome *Chrome) Screenshot() ([]byte, error) {
 // 组装 chromeDp的参数设置
 var options []chromedp.ExecAllocatorOption
 options = append(options, chromedp.DefaultExecAllocatorOptions[:]...)
 options = append(options, chromedp.UserAgent(chrome.UserAgent))
 options = append(options, chromedp.DisableGPU)
 options = append(options, chromedp.Flag("ignore-certificate-errors", true))
 options = append(options, chromedp.WindowSize(chrome.ResolutionX, chrome.ResolutionY)) // 分辨率生成

 actX, aCancel := chromedp.NewExecAllocator(context.Background(), options...)
 ctx, cancel := chromedp.NewContext(actX)
 defer aCancel()
 defer cancel()

 var buf []byte

 // 压缩js对话框 如:alert()
 chromedp.ListenTarget(ctx, func(ev interface{}) {
  if _, ok := ev.(*page.EventJavascriptDialogOpening); ok {
   go func() {
    if err := chromedp.Run(ctx,
     page.HandleJavaScriptDialog(true),
    ); err != nil {
     panic(err)
    }
   }()
  }
 })

 // 是否全屏
 if chrome.FullScreen {
  if err := chromedp.Run(ctx, chromedp.Tasks{
   chromedp.Navigate(chrome.Url),
   chromedp.Sleep(time.Duration(chrome.Delay) * time.Second),
   chromedp.FullScreenshot(&buf, 100),
  }); err != nil {
   return nil, err
  }

 } else {
  // 不是全屏下就直接生成
  if err := chromedp.Run(ctx, chromedp.Tasks{
   chromedp.Navigate(chrome.Url),
   chromedp.Sleep(time.Duration(chrome.Delay) * time.Second),
   chromedp.CaptureScreenshot(&buf),
  }); err != nil {
   return nil, err
  }
 }
 return buf, nil
}

// SafeFileName 生成安全文件名,且生成png后缀的地址
func (chrome *Chrome) SafeFileName() string {
 name := strings.ToLower(chrome.Url)
 name = strings.Trim(name, " ")

 separators, err := regexp.Compile(`[ &_=+:/]`)
 if err == nil {
  name = separators.ReplaceAllString(name, "-")
 }

 legal, err := regexp.Compile(`[^[:alnum:]-.]`)
 if err == nil {
  name = legal.ReplaceAllString(name, "")
 }

 for strings.Contains(name, "--") {
  name = strings.Replace(name, "--", "-", -1)
 }

 return name + `.png`
}

上面几乎注释都有,运行cli:

可以先-h 看看:
go run main.go -h
之后咱们直接来,存储下来的截图是在当前执行命令的位置:
go run main.go -url="https://game.lingwoyun.cn/"
如果要截全屏,加F咯:
go run main.go -url="https://game.lingwoyun.cn/" -F

结果:
PS E:\code\src\first\an_screenshots> go run main.go -url="https://game.lingwoyun.cn/"
2021/11/22 18:24:57 生成成功,文件名是:E:\code\src\first\an_screenshots\https-game.lingwoyun.cn-.png

总结

github.com/chromedp/chromedp 这个库中有很多的操作,在我的demo项目中只用了其中的很小一部分,其他更复杂的功能有需要可自行查阅。

《酷Go推荐》招募:

各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。

大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名

扫码也可以加入 GoCN 的大家族哟~

「GoCN酷Go推荐」chromedp一期 —— 截图小工具_第1张图片

你可能感兴趣的:(go,golang,chrome,rust,selenium)