「GoCN酷Go推薦」?chromedp一期 —— 截圖小工具
推薦背景
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 的大家族喲~
評(píng)論
圖片
表情
