关于hta:使用JavaScript为网页截图吗?

关于hta:使用JavaScript为网页截图吗?

Take a screenshot of a webpage with JavaScript?

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

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


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


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

1
2
3
4
5
6
7
8
9
10
11
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集成到未来的项目中。


如果有可能这样做的话是Pounder的方法,那就是将整个人体元素设置为canvase,然后使用canvas2image?

http://www.nihilogic.dk/labs/canvas2image/


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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.webp");

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


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

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


报告错误有类似的要求。由于它是针对Intranet方案的,因此我们能够使用浏览器插件(例如Firefox的Fireshot和InternetExplorer的IE截图)。


SnapEngage使用Java小程序(1.5+)制作浏览器屏幕截图。 AFAIK,java.awt.Robot应该完成该工作-用户只允许applet进行一次(一次)。

我刚刚找到了有关它的帖子:

  • 堆栈溢出问题JavaScript代码无需使用ActiveX即可截取网站的屏幕截图
  • 博客文章SnapABug的工作原理–以及他们应该做什么

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

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


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

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

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


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

1
2
3
4
5
6
7
8
9
10
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.webp'});

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

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

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

  • 休息包
  • 网址框
  • 屏幕截图层


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

它们具有灵活且易于使用的屏幕截图API,可被任何类型的JS应用程序使用。

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

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

1
2
3
4
5
6
// include the grabzit.min.js library in the web page you want the capture to appear
<script src="grabzit.min.js">

//use the key and the secret to login, capture the url

GrabzIt("KEY","SECRET").ConvertURL("http://www.google.com").Create();

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

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

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

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

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


推荐阅读

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    linux服务器基本命令?

    linux服务器基本命令?,地址,系统,设备,网络,工作,标准,信息,电脑,命令,密码,l

    linux服务器下载命令?

    linux服务器下载命令?,服务,密码,系统,档案,工具,网络,公共,百度,地址,认证,l

    linux命令提交代码?

    linux命令提交代码?,工作,系统,地址,代码,命令,数据,信息,目录,标准,发行,求

    linux安装浏览器命令?

    linux安装浏览器命令?,官网,系统,平台,网站,管理,设备,咨询,工具,官方网站,

    linux服务器常用命令?

    linux服务器常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,设备,功能,

    怎么提交linux命令?

    怎么提交linux命令?,服务,系统,环境,最新,百度,下来,数据,密码,地址,工作,用T

    linux服务器保存命令?

    linux服务器保存命令?,时间,状态,档案,电脑,命令,信息,位置,编辑,文件,模式,L

    linux服务器扫盘命令?

    linux服务器扫盘命令?,地址,工作,命令,目录,数据,单位,名称,系统,管理,信息,L

    linux命令切换服务器?

    linux命令切换服务器?,地址,名称,系统,环境,实时,命令,服务器,脚本,路径,版

    linux服务器搭建命令?

    linux服务器搭建命令?,系统,服务,软件,地址,平台,在线,密码,工具,环境,百度,l

    服务器重启命令linux?

    服务器重启命令linux?,工作,标准,设备,服务,系统,名称,命令,百度,网络,密码,

    linux浏览网页的命令?

    linux浏览网页的命令?,工作,系统,传播,地址,命令,环境,发行,信息,网络,基础,l

    linux命令访问网页?

    linux命令访问网页?,地址,传播,网络,系统,软件,网址,密码,服务,数据,首次,lin

    linux启动浏览器命令?

    linux启动浏览器命令?,系统,情况,发行,不了,官网,环境,工具,传播,基础,软件,

    linux服务器删除命令?

    linux服务器删除命令?,系统,服务,管理,情况,命令,工作,互动,地址,软件,较大,l

    linux网页访问命令?

    linux网页访问命令?,地址,网络,工作,系统,命令,传播,信息,软件,代码,首次,在L

    linux服务器负荷命令?

    linux服务器负荷命令?,信息,电脑,中科,环境,工具,系统,平均,检测,情况,状态,l

    linux默认浏览器命令?

    linux默认浏览器命令?,环境,系统,发行,工程,工具,浏览器,软件,情况,网站,管

    linux常见服务器命令?

    linux常见服务器命令?,信息,工作,标准,地址,设备,系统,情况,时间,状态,命令,