Сделать снимок экрана веб-страницы с помощью JavaScript?

Можно ли сделать снимок экрана веб-страницы с помощью JavaScript, а затем отправить его обратно на сервер?

Меня не особо беспокоят вопросы безопасности браузера. и т.д., поскольку реализация будет для HTA. Но возможно ли это?

Не могли бы вы пояснить, почему вы хотите это сделать? Возможно, есть альтернативные решения для снятия скриншотов.

andyuk 13.09.2008 14:31

Я хочу, чтобы пользователь в общих чертах спроектировал то, что он хочет, небольшой набросок и немного перетаскивания объектов. Затем я хочу, чтобы этот «дизайн» использовался как часть инструкций в производственном процессе. Это определенно шаг с участием пользователя, здесь нет ничего секретного :)

Scott Bennett-McLeish 13.09.2008 19:08

Возможный дубликат Как сделать снимок экрана посетителя?

ilhan 09.05.2019 02:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
148
3
124 344
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Вы можете добиться этого с помощью HTA и VBScript. Просто вызовите внешний инструмент, чтобы сделать снимок экрана. Я забыл, как это называется, но на Windows Vista есть инструмент для создания снимков экрана. Для этого вам даже не потребуется дополнительная установка.

Что касается автоматического - это полностью зависит от используемого вами инструмента. Если у него есть API, я уверен, что вы можете запустить процесс создания снимка экрана и сохранения с помощью пары вызовов Visual Basic, при этом пользователь не будет знать, что вы сделали то, что сделали.

Поскольку вы упомянули HTA, я предполагаю, что вы работаете в Windows и (вероятно) очень хорошо знаете свою среду (например, ОС и версию).

Он пытается сделать это как часть веб-приложения на клиентских компьютерах, а не для личного использования.

mrBorna 16.08.2011 22:30

У нас было аналогичное требование для сообщения об ошибках. Поскольку это был сценарий для интрасети, мы смогли использовать надстройки браузера (например, Fireshot для Firefox и Скриншот IE для Internet Explorer).

Ответ принят как подходящий

Я сделал это для HTA ​​с помощью элемента управления ActiveX. Было довольно легко создать элемент управления в VB6, чтобы сделать снимок экрана. Мне пришлось использовать вызов API keybd_event, потому что 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 на сервер, а затем создать снимки экрана на стороне сервера.

Я согласен с Алленом, это гениальный способ потенциально сделать скриншот страницы!

Ricket 21.05.2010 04:25

Что за "HTA", пожалуйста?

Pete Alvin 16.05.2016 12:51

@PeteAlvin HTA - это гипертекстовое приложение, которое использовалось для запуска привилегированных JS-приложений в Internet Explorer. Сегодня не очень актуально.

Joel Anair 18.05.2016 18:21

Возможно, это не идеальное решение для вас, но о нем все же стоит упомянуть.

Снэпси - это объект ActiveX с открытым исходным кодом, который позволяет снимать и сохранять снимки экрана Internet Explorer. После регистрации файла DLL на клиенте вы сможете сделать снимок экрана и загрузить файл на сервер с помощью JavaScript. Минусы: необходимо зарегистрировать DLL-файл на клиенте, работает только с Internet Explorer.

SnapEngage использует Java-апплет (1.5+) для создания снимка экрана браузера. AFAIK, java.awt.Robot должен выполнять эту работу - пользователь должен просто разрешить апплету сделать это (один раз).

И я только что нашел об этом сообщение:

Pounder's, если это возможно сделать, установив все элементы тела в холст, а затем используя canvas2image?

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

интересно, поможет ли SVG, возможно, придется взглянуть на источник Google

Luke Stanley 12.07.2011 21:14

Вы можете использовать код Niklas html2canvas для рендеринга html на холсте, а затем использовать его для сохранения изображения.

trusktr 20.02.2012 12:47

Возможный способ сделать это, если вы работаете в 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");

Тогда у вас есть снимок экрана на стороне сервера.

Хотя это немного не связано с вопросами, это отличное предложение! Спасибо !

mihai 28.12.2011 22:21

почему он не загружает некоторые стили, которые даже я вижу загруженными в IE9 ?!

Dr TJ 17.07.2014 06:09

Google делает это в Google+, а талантливый разработчик перепроектировал это и создал http://html2canvas.hertzen.com/. Для работы в IE вам понадобится библиотека поддержки холста, например http://excanvas.sourceforge.net/

Спасибо, ссылки в вашем посте все хорошо объясняют

Hüseyin BABAL 31.08.2011 13:38

Если вы не хотите делать это сами, стоит попробовать Usersnap. Это легкое решение, позволяющее получать точные скриншоты браузера от ваших посетителей без установки плагина (и без Java, ActiveX или Flash вообще).

Gregor 19.06.2013 19:37

Еще одно возможное решение, которое я обнаружил, - это http://www.phantomjs.org/, которое позволяет очень легко делать скриншоты страниц и многое другое. Хотя мои первоначальные требования к этому вопросу больше не действуют (другая работа), я, скорее всего, интегрирую PhantomJS в будущие проекты.

Знаете ли вы, могут ли phantomjs генерировать изображение элемента на странице (а не всей страницы)?

trusktr 20.02.2012 12:59

Да, ты можешь. Либо используйте этот фрагмент с PhantomJS, либо используйте CasperJS.

zopieux 18.08.2012 14:21

Отличное решение для создания снимков экрана в 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>

Снимок экрана можно настроить с другим параметры. Например:

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

Вот и все. Затем просто подождите немного, и изображение автоматически появится внизу страницы, без необходимости перезагружать страницу.

Есть и другие функции механизма скриншотов, которые вы можете изучить здесь.

Также возможно сохранить снимок экрана локально. Для этого вам нужно будет использовать API на стороне сервера GrabzIt. Для получения дополнительной информации ознакомьтесь с подробным руководством здесь.

Я обнаружил, что dom-to-image хорошо поработал (намного лучше, чем html2canvas). См. Следующий вопрос и ответ: https://stackoverflow.com/a/32776834/207981

Этот вопрос касается отправки этого обратно на сервер, что должно быть возможно, но если вы хотите загрузить изображение (я), вы захотите объединить его с FileSaver.js, и если вы хотите загрузить zip с несколькими изображениями файлы, все сгенерированные на стороне клиента, обращаются к jszip.

Если вы хотите сделать это на стороне сервера, есть такие параметры, как PhantomJS, которые теперь устарели. Лучшим вариантом будет Headless Chrome с чем-то вроде Кукловод на Node.JS. Захват веб-страницы с помощью 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();
})();

Однако для работы на ваших серверах требуется безголовый хром, который имеет некоторые зависимости и может не подходить в ограниченных средах. (Кроме того, если вы не используете Node.JS, вам может потребоваться самостоятельно выполнить установку / запуск браузеров.)

Если вы хотите использовать услугу SaaS, есть много вариантов, например

Это старый вопрос, но, возможно, есть еще кто-то, кто заинтересован в современном ответе:

Вы можете использовать getDisplayMedia:

https://github.com/ondras/browsershot

На сегодняшний день, апрель 2020 г., библиотека GitHub html2Canvas https://github.com/niklasvh/html2canvas

GitHub 20K звезд | Azure pipeles: выполнено успешно | Загрузок 1,3 млн / мес |

цитата: "Средство визуализации JavaScript HTML Скрипт позволяет вам делать «скриншоты» веб-страниц или их частей прямо в браузере пользователя.. Снимок экрана основан на модели DOM и, как таковой, может не быть на 100% точным для реального представления, поскольку он не создает фактический снимок экрана, а строит снимок экрана на основе информации, доступной на странице.

Я сделал простую функцию, которая использует rasterizeHTML для создания svg и / или изображения с содержимым страницы.

Проверить это:

https://github.com/orisha/tdg-screen-shooter-pure-js

Другие вопросы по теме