英文:
How to take screenshot of a website using Golang?
问题
我正在寻找一种方法,可以使用Golang给定一个URL并截取网站的屏幕截图。我搜索了一些结果,但没有找到任何有用的信息。请问有人可以帮助我吗?
英文:
What I'm looking to do, given a URL and take a screenshot of the website using Golang. I searched for results but I didn't get any. Can anyone please help me.
答案1
得分: 4
你可以使用Go版本的Selenium,如果你选择这个方案的话。https://godoc.org/github.com/tebeka/selenium
英文:
You can use a Go version of Selenium if you want to go that route. https://godoc.org/github.com/tebeka/selenium
答案2
得分: 3
目前没有纯粹的 Golang 方法可以实现这一点,因为它必须涉及某种形式的浏览器。
实现此功能的最简单方法可能是:
- 找一个好用的 NodeJS 库来截取网站截图
- 创建一个适合你需求的 NodeJS 脚本来截取截图(输入/输出和设置)
- 从 Golang 中执行这个 NodeJS 脚本,并在你的 Golang 代码中处理结果
这不是最干净的方法来完成这个任务 - 如果你想要更干净的方法,可能需要构建/找到一个控制浏览器的 Golang 包,这样你就可以跳过 NodeJS 中间人。
英文:
There is no pure golang way to do at the moment this since it must involve a browser is some form.
The easiest path to achieve this functionality is probably:
- Find a nice NodeJS library to take website screenshots
- Create a NodeJS script that is suits your needs for taking screenshots (i/o and settings)
- Execute this NodeJS script from Golang and handle the results in your Golang code
Not the cleanest method to get this done though - if you want it cleaner you probably have to build/find a golang package that controls a browser so you can skip the NodeJS middleman.
答案3
得分: 2
我使用https://github.com/mafredri/cdp和一个Chrome无头docker容器解决了这个问题。
你可以在这里查看我的服务示例:https://gist.github.com/efimovalex/9f9b815b0d5b1b7889a51d46860faf8a
英文:
I solved this issue using https://github.com/mafredri/cdp and a Chrome headless docker container.
You can see my service example here: https://gist.github.com/efimovalex/9f9b815b0d5b1b7889a51d46860faf8a
答案4
得分: 1
使用Go和Chrome/Chromium的一些其他工具包括:
gowitness
命令行应用程序screenshot
库web2image
基于chromedp
的命令行应用程序
英文:
A few more tools using Go and Chrome/Chromium include:
gowitness
CLI appscreenshot
libraryweb2image
CLI app based onchromedp
答案5
得分: 0
我正在为这个特定任务编写一个程序。以下是一个浏览google.com
并截取屏幕截图的示例代码。
package main
import (
"time"
driver "github.com/dreygur/webdriver"
)
func main() {
url := `https://google.com`
driver.RunServer("./geckodriver")
driver.GetSession()
driver.Get(url)
time.Sleep(8 * time.Second)
driver.Screenshot("google")
time.Sleep(8 * time.Second)
defer driver.Kill()
}
要安装该模块,请运行go get github.com/dreygur/webdriver
。
英文:
I was writing a program for this specific task. Here is a sample code that browse google.com
and takes a screenshot.
package main
import (
"time"
driver "github.com/dreygur/webdriver"
)
func main() {
url := `https://google.com`
driver.RunServer("./geckodriver")
driver.GetSession()
driver.Get(url)
time.Sleep(8 * time.Second)
driver.Screenshot("google")
time.Sleep(8 * time.Second)
defer driver.Kill()
}
To install the module, run go get github.com/dreygur/webdriver
答案6
得分: 0
你可以使用chromedp。但是你需要安装Chrome浏览器!
示例:
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/chromedp/chromedp"
)
func TackScreenShot(ctx context.Context, url string) ([]byte, error) {
context, cancel := chromedp.NewContext(ctx)
defer cancel()
var filebyte []byte
if err := chromedp.Run(context, chromedp.Tasks{
chromedp.Navigate(url),
chromedp.Sleep(3 * time.Second),
chromedp.CaptureScreenshot(&filebyte),
}); err != nil {
return nil, err
}
return filebyte, nil
}
func main() {
url := "https://google.com"
ctx := context.TODO()
data, err := TackScreenShot(ctx, url)
if err != nil {
panic(err)
}
defer ctx.Done()
pngFile, err := os.Create("./shot.png")
if err != nil {
panic(err)
}
defer pngFile.Close()
pngFile.Write(data)
fmt.Println("截图已保存!")
}
英文:
You can use chromedp.
But you need install chrome browser!
Example :
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/chromedp/chromedp"
)
func TackScreenShot(ctx context.Context, url string) ([]byte, error) {
context, cancel := chromedp.NewContext(ctx)
defer cancel()
var filebyte []byte
if err := chromedp.Run(context, chromedp.Tasks{
chromedp.Navigate(url),
chromedp.Sleep(3 * time.Second),
chromedp.CaptureScreenshot(&filebyte),
}); err != nil {
return nil, err
}
return filebyte, nil
}
func main() {
url := "https://google.com"
ctx := context.TODO()
data, err := TackScreenShot(ctx, url)
if err != nil {
panic(err)
}
defer ctx.Done()
pngFile, err := os.Create("./shot.png")
if err != nil {
panic(err)
}
defer pngFile.Close()
pngFile.Write(data)
fmt.Println("screen shot tacked!")
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论