Skip to content

Instantly share code, notes, and snippets.

@toufik-airane
Created August 27, 2020 10:37
Show Gist options
  • Save toufik-airane/2597dcd1e5179671a0f3f07339821d48 to your computer and use it in GitHub Desktop.
Save toufik-airane/2597dcd1e5179671a0f3f07339821d48 to your computer and use it in GitHub Desktop.
Screenshot a list of URLs using Google Chrome API
package main
import (
"bufio"
"context"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
"time"
"github.com/mafredri/cdp"
"github.com/mafredri/cdp/devtool"
"github.com/mafredri/cdp/protocol/page"
"github.com/mafredri/cdp/protocol/security"
"github.com/mafredri/cdp/rpcc"
)
var filename string
func init() {
flag.StringVar(&filename, "f", "", `Specify a filename with a list of URLs.`)
flag.Parse()
flag.Usage = func() {
fmt.Fprintln(os.Stderr, "~ govisu")
flag.PrintDefaults()
}
if len(filename) == 0 {
flag.Usage()
log.Fatal()
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
defer cancel()
devt := devtool.New("http://127.1:9222")
pt, err := devt.Get(ctx, devtool.Page)
if err != nil {
pt, err = devt.Create(ctx)
if err != nil {
log.Println(`๐Ÿ’ Manually run a Google Chrome daemon.
On MacOS ๐Ÿ : /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 --no-first-run --no-default-browser-check --user-data-dir=$(mktemp -d -t 'chrome-remote_data_dir') --headless &`)
log.Fatal(err)
}
}
security.NewSetIgnoreCertificateErrorsArgs(true)
conn, err := rpcc.DialContext(ctx, pt.WebSocketDebuggerURL)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
c := cdp.NewClient(conn)
domContent, err := c.Page.LoadEventFired(ctx)
if err != nil {
log.Fatal(err)
}
defer domContent.Close()
if err = c.Page.Enable(ctx); err != nil {
log.Fatal(err)
}
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
navArgs := page.NewNavigateArgs(scanner.Text())
_, err := c.Page.Navigate(ctx, navArgs)
if err != nil {
log.Fatal(err)
}
if _, err = domContent.Recv(); err != nil {
log.Fatal(err)
}
screenshotName := strings.ReplaceAll(scanner.Text(), "/", "") + ".jpg"
screenshotArgs := page.NewCaptureScreenshotArgs().
SetFormat("jpeg").
SetQuality(10)
screenshot, err := c.Page.CaptureScreenshot(ctx, screenshotArgs)
if err != nil {
log.Fatal(err)
}
if err = ioutil.WriteFile(screenshotName, screenshot.Data, 0644); err != nil {
log.Fatal(err)
}
fmt.Printf("Saved screenshot: %s\n", screenshotName)
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment