golang快速實現服務端網頁截圖

蕭瀟發表於2021-03-02

golang是近幾年發展非常迅猛的一款伺服器端的語言,其生態也日益豐富。對於使用golang實現網頁截圖這個需求,筆者在經過一番調研之後發現大家有推薦Selenium方案,但是這一方案問題較多:

  • 需要安裝Selenium或是PhantomJS
  • PhantomJS已經停止維護了
  • Selenium的執行需要安裝chromedriver
  • chromedriver對chrome的版本有一定要求

還有推薦headless chrome方案的,但是這一方案也需要自行在伺服器端安裝一款瀏覽器,對伺服器的壓力比較大,併發效能也不好,所以最後筆者直接選用了一款第三方API的截圖服務。

該服務有如下特點:

  • 支援多線路
  • 支援登入截圖
  • 支援UA變換
  • 支援Cookie注入 實現登入截圖
  • 支援自定義寬高
  • 支援網頁滾動截圖
  • 支援設定截圖前的延遲時間

使用方式也很簡單,我們開啟它的首頁 www.screenshotmaster.com/ 註冊一個賬號,然後你會在使用者中心獲取到一個唯一的Token,儲存好這個Token 不要洩漏!

下面來看看它支援的引數:

image.png

您可以前往API文件頁面檢視更多的引數。

使用golang呼叫截圖大師的介面獲取截圖:

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    url2 "net/url"
    "os"
)

func main() {
    // 引數
    token := "YOUR_API_TOKEN"
    url := url2.QueryEscape("https://www.baidu.com")
    width := 1280
    height := 800
    full_page := 1

    // 構造URL
    query := "https://www.screenshotmaster.com/api/v1/screenshot"
    query += fmt.Sprintf("?token=%s&url=%s&width=%d&height=%d&full_page=%s",
        token, url, width, height, full_page)

    // 呼叫API
    resp, err := http.Get(query)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // 檢查是否呼叫成功
    if resp.StatusCode != 200 {
        errorBody, _ := ioutil.ReadAll(resp.Body)
        panic(fmt.Errorf("error while calling api %s", errorBody))
    }

    // 儲存截圖
    file, err := os.Create("./screenshot.png")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    _, err = io.Copy(file, resp.Body)
    if err != nil {
        panic(err)
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章