Можно ли сделать снимок экрана с веб-страницы с помощью JavaScript, а затем отправить его обратно на сервер?
Я не так обеспокоен проблемами безопасности браузера. и т.д., поскольку реализация будет для HTA. Но возможно ли это?
Можно ли сделать снимок экрана с веб-страницы с помощью JavaScript, а затем отправить его обратно на сервер?
Я не так обеспокоен проблемами безопасности браузера. и т.д., поскольку реализация будет для HTA. Но возможно ли это?
Я сделал это для HTA с помощью элемента управления ActiveX. Было довольно легко построить элемент управления в 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 на сервер, а затем создать скриншоты на стороне сервера.
Google делает это в Google+, а талантливый разработчик обратил его в конструкцию и выпустил http://html2canvas.hertzen.com/. Для работы в IE вам понадобится библиотека поддержки холста, такая как http://excanvas.sourceforge.net/
Другим возможным решением, которое я обнаружил, является http://www.phantomjs.org/, что позволяет очень легко делать скриншоты страниц и многое другое. Хотя мои первоначальные требования к этому вопросу уже недействительны (другая работа), я, скорее всего, буду интегрировать PhantomJS в будущие проекты.
Pounder, если это можно сделать, установив все элементы тела в холст, а затем используя 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 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");
Затем у вас есть скриншот на стороне сервера.
Это может быть не идеальное решение для вас, но это все равно стоит упомянуть.
Snapsie является открытым исходным кодом, ActiveX, который позволяет захватывать и сохранять снимки Internet Explorer. Как только DLL файл зарегистрирован на клиенте, вы сможете захватить скриншот и загрузить файл на сервер с JavaScript. Недостатки: ему необходимо зарегистрировать DLL файл на клиенте и работать только с Internet Explorer.
У нас было аналогичное требование для сообщений об ошибках. Поскольку это было для сценария интрасети, мы смогли использовать браузерные аддоны (например, Fireshot для Firefox и Скриншот IE для Internet Explorer).
SnapEngage использует Java-апплет (1.5+), чтобы сделать снимок экрана браузера. AFAIK, java.awt.Robot
должен выполнить задание - пользователь должен просто разрешить апплету делать это (один раз).
И я только что нашел сообщение об этом:
Вы можете добиться этого с помощью HTA и VBScript. Просто вызовите внешний инструмент, чтобы сделать скриншоты. Я забыл, что это за имя, но на Windows Vista есть инструмент для создания скриншотов. Вам даже не нужна дополнительная установка.
Как автоматическое - это полностью зависит от используемого вами инструмента. Если у него есть API, я уверен, что вы можете запустить скриншот и сохранить процесс через пару вызовов Visual Basic, не зная, что вы сделали то, что сделали.
Поскольку вы упомянули HTA, я предполагаю, что вы находитесь в Windows и (возможно) хорошо знаете свою среду (например, ОС и версию).
Отличное решение для снятия скриншотов в Javascript - это https://grabz.it.
У них есть гибкий и простой в использовании скриншот 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>
Снимок экрана можно настроить с помощью parameters. Например:
GrabzIt("KEY", "SECRET").ConvertURL("http://www.google.com",
{"width": 400, "height": 400, "format": "png", "delay", 10000}).Create();
</script>
Это все. Затем просто подождите немного, и изображение будет автоматически отображаться внизу страницы, без необходимости перезагрузки страницы.
Существуют другие функции механизма скриншотов, которые вы можете изучить здесь.
Также можно сохранить снимок экрана локально. Для этого вам нужно будет использовать API-интерфейс сервера GrabzIt. Подробнее см. Подробное руководство здесь.
Я обнаружил, что dom-to-image сделал хорошую работу (намного лучше, чем html2canvas). См. Следующий вопрос и ответ: fooobar.com/info/86327/...
Этот вопрос задает вопрос о возврате этого сервера на сервер, что должно быть возможно, но если вы хотите загрузить изображения, вы захотите объединить их с FileSaver.js, и если вы хотите загрузить zip с несколькими файлами изображений, все созданные на стороне клиента взгляните на jszip.