golang是近幾年發展非常迅猛的一款伺服器端的語言,其生態也日益豐富。對於使用golang實現網頁截圖這個需求,筆者在經過一番調研之後發現大家有推薦Selenium方案,但是這一方案問題較多:
- 需要安裝Selenium或是PhantomJS
- PhantomJS已經停止維護了
- Selenium的執行需要安裝chromedriver
- chromedriver對chrome的版本有一定要求
還有推薦headless chrome方案的,但是這一方案也需要自行在伺服器端安裝一款瀏覽器,對伺服器的壓力比較大,併發效能也不好,所以最後筆者直接選用了一款第三方API的截圖服務。
該服務有如下特點:
- 支援多線路
- 支援登入截圖
- 支援UA變換
- 支援Cookie注入 實現登入截圖
- 支援自定義寬高
- 支援網頁滾動截圖
- 支援設定截圖前的延遲時間
使用方式也很簡單,我們開啟它的首頁 www.screenshotmaster.com/ 註冊一個賬號,然後你會在使用者中心獲取到一個唯一的Token,儲存好這個Token 不要洩漏!
下面來看看它支援的引數:
您可以前往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 協議》,轉載必須註明作者和本文連結