使用JavaScript截取网页的屏幕截图?


148

是否可以使用JavaScript截取网页的屏幕截图,然后将其提交回服务器?

我不太担心浏览器的安全性问题。等,因为实施将针对HTA。但是有可能吗?


您能否阐明为什么要这样做?也许还有其他解决方案来截取屏幕截图。
andyuk

我正在寻找让用户大致设计他们想要的东西,一些草图和一些拖放对象的方法。然后,我希望将此“设计”用作生产过程中的部分说明。这绝对是一个涉及用户的步骤,在这里没有什么秘密:)
Scott Bennett-McLeish

Answers:


42

我已经通过使用ActiveX控件为HTA完成了此操作。在VB6中构建控件以截取屏幕截图非常容易。我必须使用keybd_event API调用,因为SendKeys无法执行PrintScreen。这是代码:

Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Const CaptWindow = 2

Public Sub ScreenGrab()
   keybd_event &H12, 0, 0, 0
   keybd_event &H2C, CaptWindow, 0, 0
   keybd_event &H2C, CaptWindow, &H2, 0
   keybd_event &H12, 0, &H2, 0
End Sub

这只会使您到达将窗口转到剪贴板。

另一个选择是,如果要获取屏幕快照的窗口是HTA,则只需使用XMLHTTPRequest将DOM节点发送到服务器,然后在服务器端创建屏幕快照。


我同意艾伦(Allen)的观点,这是一种巧妙地对页面进行屏幕截图的方法!
Ricket 2010年

请问什么是“ HTA”?
皮特·艾文

2
@PeteAlvin HTA是超文本应用程序,它是在Internet Explorer中运行特权JS应用程序的一种方式。今天不是很重要。
乔尔·安奈尔

141

Google正在Google+中进行此操作,而一位才华横溢的开发人员对其进行了反向工程,并制作了http://html2canvas.hertzen.com/。要在IE中工作,您需要一个画布支持库,例如http://excanvas.sourceforge.net/


2
谢谢您,在您的文章中的链接解释了everyting以及
侯赛因BABAL

2
如果您不想自己做,可以尝试使用Usersnap。这是一种解决方案,可在不安装插件的情况下从访问者那里获得准确的浏览器屏幕截图(并且无需安装Java,ActiveX或Flash)。
格雷戈尔


14

我发现的另一种可能的解决方案是http://www.phantomjs.org/,它使人们可以非常轻松地拍摄页面截图以及更多内容。尽管我对这个问题的原始要求不再有效(不同的工作),但我可能会将PhantomJS集成到未来的项目中。


您知道phantomjs是否可以在页面(而不是整个页面)上生成元素的图像吗?
trusktr 2012年

是的你可以。无论是使用这个片段与PhantomJS或使用CasperJS
zopieux 2012年


9

一种可能的方法是,如果在Windows上运行并安装了.NET,则可以执行以下操作:

public Bitmap GenerateScreenshot(string url)
{
    // This method gets a screenshot of the webpage
    // rendered at its full size (height and width)
    return GenerateScreenshot(url, -1, -1);
}

public Bitmap GenerateScreenshot(string url, int width, int height)
{
    // Load the webpage into a WebBrowser control
    WebBrowser wb = new WebBrowser();
    wb.ScrollBarsEnabled = false;
    wb.ScriptErrorsSuppressed = true;
    wb.Navigate(url);
    while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }


    // Set the size of the WebBrowser control
    wb.Width = width;
    wb.Height = height;

    if (width == -1)
    {
        // Take Screenshot of the web pages full width
        wb.Width = wb.Document.Body.ScrollRectangle.Width;
    }

    if (height == -1)
    {
        // Take Screenshot of the web pages full height
        wb.Height = wb.Document.Body.ScrollRectangle.Height;
    }

    // Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control
    Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
    wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
    wb.Dispose();

    return bitmap;
}

然后通过PHP,您可以执行以下操作:

exec("CreateScreenShot.exe -url http://.... -save C:/shots domain_page.png");

然后,您将截图保存在服务器端。


1
尽管与这些问题无关,但这是一个很棒的建议!谢谢 !
mihai 2011年

为什么它不加载某些样式,甚至我也可以看到它们已加载到IE9中?
TJ博士2014年

7

对于您来说,这可能不是理想的解决方案,但仍然值得一提。

Snapsie是一个开放源代码ActiveX对象,它可以捕获和保存Internet Explorer屏幕快照。在客户端上注册DLL文件后,您应该能够捕获屏幕截图并将其使用JavaScript上传到服务器。缺点:它需要在客户端注册DLL文件,并且只能与Internet Explorer一起使用。




1

您可以使用HTA和VBScript来实现。只需调用外部工具即可进行屏幕截图。我忘记了名称,但是在Windows Vista上有一个用于截屏的工具。您甚至不需要额外安装。

至于自动-这完全取决于您使用的工具。如果它具有API,我相信您可以通过几次Visual Basic调用来触发屏幕截图和保存过程,而用户不会知道您做了什么。

既然您提到了HTA,我假设您使用的是Windows,并且(可能)非常了解您的环境(例如OS和版本)。


他正尝试将其作为Web应用程序的一部分,跨客户的计算(非个人使用)进行
mrBorna 2011年

1

我发现dom-to-image效果很好(比html2canvas好得多)。请参阅以下问题和解答:https : //stackoverflow.com/a/32776834/207981

这个问题询问将其提交回服务器的可能性,但这是可能的,但是如果您要下载图像,则需要将其与FileSaver.js结合使用,以及如果要使用所有生成的多个图像文件都在客户端查看jszip


0

https://grabz.it提供了一种使用Javascript截屏的绝佳解决方案。

它们具有灵活且易于使用的屏幕快照API,可以由任何类型的JS应用程序使用。

如果您想尝试,首先应该获得授权应用密钥+机密免费的SDK

然后,在您的应用中,实现步骤将是:

// include the grabzit.min.js library in the web page you want the capture to appear
<script src="grabzit.min.js"></script>

//use the key and the secret to login, capture the url
<script>
GrabzIt("KEY", "SECRET").ConvertURL("http://www.google.com").Create();
</script>

屏幕截图可以使用不同的参数进行自定义。例如:

GrabzIt("KEY", "SECRET").ConvertURL("http://www.google.com", 
{"width": 400, "height": 400, "format": "png", "delay", 10000}).Create();
</script>

就这样。然后,稍等片刻,图像将自动显示在页面底部,而无需重新加载页面。

屏幕快照机制还有其他功能,您可以在此处进行探索。

也可以将屏幕截图保存在本地。为此,您将需要利用GrabzIt服务器端API。有关更多信息,请在此处查看详细指南。


0

如果您愿意在服务器端进行操作,则可以使用PhantomJS之类的选项,现在不建议使用。最好的方法是在Head.Chrome上使用类似Puppeteer之类的Headless Chrome 。使用Puppeteer捕获网页非常简单,如下所示:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();

但是,它需要无头chrome才能在您的服务器上运行,这有一定的依赖性,可能不适用于受限的环境。(此外,如果您不使用Node.JS,则可能需要自己处理浏览器的安装/启动。)

如果您愿意使用SaaS服务,则有很多选择,例如



0

截至今天2020年4月GitHub库html2Canvas https://github.com/niklasvh/html2canvas

GitHub 20K星 | Azure管道:成功| 下载1.3M / mo |

quote:“ JavaScript HTML渲染器。该脚本允许您直接在用户浏览器上拍摄网页或其一部分的“屏幕快照”。该屏幕截图基于DOM,因此可能与实际表示形式并非100%准确不会生成实际的屏幕截图,而是根据页面上的可用信息来构建屏幕截图。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.