是否有可能使用JavaScript对网页进行截屏,并将其提交回服务器?
我所关心的不是浏览器安全问题,而是实现方式适用于HTA。但这是否可行?
是否有可能使用JavaScript对网页进行截屏,并将其提交回服务器?
我所关心的不是浏览器安全问题,而是实现方式适用于HTA。但这是否可行?
谷歌在 Google+ 上实现了这个功能,一位才华横溢的开发者反向工程并制作了 http://html2canvas.hertzen.com/ 。要在 IE 中运行,您需要一个支持画布的库,例如 http://excanvas.sourceforge.net/
我已经使用一个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节点发送到服务器,然后在服务器端创建屏幕截图。
我发现的另一种可能的解决方案是http://www.phantomjs.org/,它允许非常容易地对网页进行截图等操作。虽然我最初提出的问题需求已经失效了(工作不同了),但我可能会在未来的项目中集成PhantomJS。
请问是否可以通过将整个body元素设置为canvas,并使用canvas2image进行操作?
如果你在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");
这样你就能在服务器端得到屏幕截图了。
getDisplayMedia
,但是 browsershot
的默认用法有些过头了,因为它会拍摄整个窗口的图片,这在大多数情况下可能并不理想。开发者可以控制这一点(将 displaySurface
设置为 application
、browser
、monitor
或 window
),用户也可以控制是否允许,但我认为大多数开发者只想要浏览器选项卡的内容,而不是实际的浏览器窗口。 - Dan Atkinson SnapEngage 使用一个 Java applet(1.5+)来进行浏览器截图。据我所知,java.awt.Robot
应该可以胜任这项工作 - 用户只需允许一次 applet 进行截图。
我刚刚发现了一个相关的帖子: