<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          「GoCN酷Go推薦」?chromedp一期 —— 截圖小工具

          共 4509字,需瀏覽 10分鐘

           ·

          2021-11-26 22:42

          推薦背景

          chromedp是谷歌官方推出的無頭瀏覽器,類似Selenium,但是由于Selenium對(duì)golang的支持并不是很好,而且我們也不需要去配置繁瑣的chrome driver,有助于咱們golang的跨平臺(tái)使用。

          快速使用

          準(zhǔn)備環(huán)境

          由于筆者只有windows和centos系統(tǒng),就只介紹這兩個(gè)系統(tǒng)的瀏覽器必要的安裝方式:

          Windows下直接安裝chrome瀏覽器即可,不能用綠色版,必須是安裝版
          Centos下安裝必要的驅(qū)動(dòng)與文字庫:
          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

          由于網(wǎng)上都喜歡用來做爬蟲,我就不做爬蟲了,容易面向監(jiān)獄編程,做個(gè)截圖工具吧,想起當(dāng)年P(guān)HP還用了第三方的CutyCapt,現(xiàn)在解放了。

          手寫截圖工具(就直接上代碼,代碼中解釋)

          筆者喜歡一次性寫完,自己粘貼復(fù)制到代碼中實(shí)操一次即可。

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

          //?網(wǎng)頁截屏小工具
          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的參數(shù)設(shè)置
          ?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對(duì)話框?如: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`
          }

          上面幾乎注釋都有,運(yùn)行cli:

          可以先-h 看看:
          go?run?main.go?-h
          之后咱們直接來,存儲(chǔ)下來的截圖是在當(dāng)前執(zhí)行命令的位置:
          go?run?main.go?-url="https://game.lingwoyun.cn/"
          如果要截全屏,加F咯:
          go?run?main.go?-url="https://game.lingwoyun.cn/"?-F

          結(jié)果:
          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

          總結(jié)

          github.com/chromedp/chromedp 這個(gè)庫中有很多的操作,在我的demo項(xiàng)目中只用了其中的很小一部分,其他更復(fù)雜的功能有需要可自行查閱。


          《酷Go推薦》招募:


          各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到

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


          大概規(guī)則和每日新聞?lì)愃疲绻麍?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名!戳「閱讀原文」,即可報(bào)名


          掃碼也可以加入 GoCN 的大家族喲~



          瀏覽 87
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产AA级片久久 | 日韩AV电影免费观看 | 一本到久久 | 91人妻在线 | 波多野结衣国产在线 |