Скриншоты сайта
Есть ли способ сделать снимок экрана сайта в PHP, а затем сохранить его в файл?
27 ответов
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ: через 7 лет я все еще получаю отклики за этот ответ, но я думаю, что этот теперь гораздо точнее.
Конечно, вы можете, но вам нужно будет отрисовать страницу с чем-то. Если вы действительно хотите использовать только php, я предлагаю вам HTMLTOPS, который визуализирует страницу и выводит ее в файл ps (ghostscript), а затем конвертирует ее в файлы.jpg, .png, .pdf.. может быть немного медленнее с сложные страницы (и не поддерживают все CSS).
Иначе, вы можете использовать http://wkhtmltopdf.org/ для вывода html-страницы в формате pdf, jpg и т. Д. Примите CSS2.0, используйте webkit (оболочку сафари) для рендеринга страницы.. так что все должно быть в порядке. Вы должны установить его на свой сервер, а также..
ОБНОВЛЕНИЕ Теперь, с новой функцией HTML5 и JS, также можно отобразить страницу в объект холста с помощью JavaScript. Вот хорошая библиотека для этого: Html2Canvas, а вот реализация того же автора для получения обратной связи, подобной G+. После того, как вы поместили dom на холст, вы можете отправить его на сервер через ajax и сохранить его в формате jpg.
РЕДАКТИРОВАТЬ: Вы можете использовать инструмент imagemagick для преобразования PDF в PNG. Моя версия wkhtmltopdf не поддерживает изображения. Например convert html.pdf -append html.png
,
РЕДАКТИРОВАТЬ: Этот небольшой скрипт оболочки дает простой / но рабочий пример использования на Linux с php5-cli и инструментами, упомянутыми выше.
РЕДАКТИРОВАТЬ: я заметил, что теперь команда wkhtmltopdf работает над другим проектом: wkhtmltoimage, который дает вам JPG напрямую
Начиная с PHP 5.2.2, можно захватывать сайт исключительно с помощью PHP!
imagegrabscreen - захватывает весь экран
<?php
$img = imagegrabscreen();
imagepng($img, 'screenshot.png');
?>
imagegrabwindow - захватывает окно или его клиентскую область, используя дескриптор окна (свойство HWND в экземпляре COM)
<?php
$Browser = new COM('InternetExplorer.Application');
$Browserhandle = $Browser->HWND;
$Browser->Visible = true;
$Browser->Fullscreen = true;
$Browser->Navigate('http://www.stackru.com');
while($Browser->Busy){
com_message_pump(4000);
}
$img = imagegrabwindow($Browserhandle, 0);
$Browser->Quit();
imagepng($img, 'screenshot.png');
?>
Изменить: Обратите внимание, что эти функции доступны только в системах Windows!
Если вы не хотите использовать какие-либо сторонние инструменты, я наткнулся на простое решение, использующее API Google Page Insight.
Просто нужно назвать это API с параметрами screenshot=true
,
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=www.stackru.com/&key={your_api_key}&screenshot=true
Для просмотра мобильного сайта пройти &strategy=mobile
в параметрах,
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=www.stackru.com/&key={your_api_key}&screenshot=true&strategy=mobile
ДЕМО.
Вы можете использовать простой безголовый браузер, такой как PhantomJS, чтобы захватить страницу.
Также вы можете использовать PhantomJS с PHP.
Проверьте этот маленький скрипт php, который делает это. Посмотрите здесь https://github.com/microweber/screen
А вот и API- http://screen.microweber.com/shot.php?url=https://stackru.com/questions/757675/website-screenshots-using-php
Это должно быть хорошо для вас:
Убедитесь, что вы скачали дистрибутив wkhtmltoimage!
Это на Python, но, просматривая документацию и код, вы можете точно увидеть, как это делается. Если вы можете запустить Python, то это готовое решение для вас:
Обратите внимание, что все может работать на одной машине для одной платформы или на одной машине с виртуальными машинами, работающими на других платформах.
Бесплатно, с открытым исходным кодом, прокрутите вниз страницы для ссылок на документацию, исходный код и другую информацию.
Да. Вам понадобятся некоторые вещи, которые:
Смотрите khtmld(aemon) на *nx. Посмотрите Url2Jpg для Windows, но так как это приложение dotNet, вам также следует проверить Url2Bmp
Оба являются консольными инструментами, которые вы можете использовать в своем веб-приложении, чтобы получить скриншот.
Есть также веб-сервисы, которые предлагают это. Проверьте это, например.
Редактировать:
Эта ссылка полезна для.
Вариантов много, и у всех есть свои плюсы и минусы. Вот список вариантов, упорядоченных по сложности реализации.
Вариант 1: использовать API (самый простой)
Pros
- Выполнить Javascript
- Почти идеальный рендеринг
- Быстро при правильном использовании параметров кэширования
- Шкала обрабатывается API
- Точное время, окно просмотра, ...
- Большую часть времени они предлагают бесплатный план
Cons
- Не бесплатно, если вы планируете использовать их много
Вариант 2: используйте одну из множества доступных библиотек
- дом-к-изображения
- wkhtmltoimage (включен в инструмент wkhtmltopdf)
- phpwkhtmltopdf
- ...
Pros
- Конверсия в большинстве случаев довольно быстрая
Cons
- Плохой рендеринг
- Не выполняет JavaScript
- Отсутствует поддержка последних веб-функций (FlexBox, расширенные селекторы, веб-шрифты, размеры ящиков, медиазапросы, теги HTML5...)
- Иногда не так просто установить
- Сложно масштабировать
Вариант 3: используйте PhantomJs и, возможно, библиотеку-обертку
- PhantomJs
- php-phantomjs (библиотека-оболочка php для PhantomJs)
- ...
Pros
- Выполнить Javascript
- Довольно быстро
Cons
- Плохой рендеринг
- PhantomJs устарела и больше не поддерживается.
- Отсутствует поддержка последних веб-функций (FlexBox, расширенные селекторы, веб-шрифты, размеры ящиков, медиазапросы, теги HTML5...)
- Сложно масштабировать
- Не так легко заставить его работать, если есть загружаемые изображения...
Вариант 4: используйте Chrome Headless и, возможно, библиотеку-обертку
Pros
- Выполнить Javascript
- Почти идеальный рендеринг
Cons
- Не так просто получить желаемый результат в отношении:
- время загрузки страницы
- интеграция с прокси
- автоматическая прокрутка
- ...
- Сложно масштабировать
- Довольно медленно и даже медленнее, если HTML содержит внешние ссылки
Отказ от ответственности: я основатель ApiFlash. Я сделал все возможное, чтобы дать честный и полезный ответ.
Да, это. Если вам нужно только изображение URL, попробуйте это
<img src='http://zenithwebtechnologies.com.au/thumbnail.php?url=www.subway.com.au'>
Передавайте URL в качестве аргумента, и вы получите изображение для более подробной информации, перейдите по ссылке http://zenithwebtechnologies.com.au/auto-thumbnail-generation-from-url.html
Ну, PhantomJS - это браузер, который можно легко поставить на сервер и интегрировать в php. Вы можете найти код в WDudes. Они включают в себя намного больше функций, таких как указание размера изображения, кэша, загрузки в виде файла или отображения в img src и т. Д.
<img src=”screenshot.php?url=google.com” />
Параметры URL
Ширина и высота: screenshot.php? Url=google.com&w=1000&h=800
С кадрированием: screenshot.php? Url=google.com&w=1000&h=800&clipw=800&cliph=600
Отключить кеш и загрузить свежие скриншоты:
screenshot.php? URL = google.com и кэш = 0Чтобы загрузить изображение: screenshot.php? Url = google.com & download = true
Вы можете увидеть учебное пособие здесь: Снимок экрана сайта с использованием PHP без API
Cutycapt сохраняет веб-страницы в большинстве графических форматов (JPG, PNG..) скачать его с Synaptic, он работает намного лучше, чем wkhtmltopdf
Я всегда использую экран microweber, чтобы сделать снимок экрана любой веб-страницы. Здесь мы можем найти хорошо написанный учебник. Это проще и не должно занимать более 3 минут, чтобы учиться.
Есть много проектов с открытым исходным кодом, которые могут создавать скриншоты. Например, PhantomJS, webkit2png и т. Д.
Большая проблема этих проектов заключается в том, что они основаны на более старой технологии браузеров и имеют проблемы с отображением многих сайтов, особенно сайтов, использующих веб-шрифты, flexbox, svg и различные другие дополнения к спецификации HTML5 и CSS за последние пару месяцев / лет.
Я перепробовал несколько сторонних сервисов, и большинство из них основаны на PhantomJS, что означает, что они также создают скриншоты низкого качества. Лучший сторонний сервис для создания скриншотов сайта - https://urlbox.io/. Это платная услуга, хотя есть бесплатная 7-дневная пробная версия, чтобы протестировать ее без каких-либо платных планов.
Вот ссылка на документацию, и ниже приведены простые шаги, чтобы заставить его работать на PHP с помощью composer.
// 1 . Get the urlbox/screenshots composer package (on command line):
composer require urlbox/screenshots
// 2. Set up the composer package with Urlbox API credentials:
$urlbox = UrlboxRenderer::fromCredentials('API_KEY', 'API_SECRET');
// 3. Set your options (all options such as full page/full height screenshots, retina resolution, viewport dimensions, thumbnail width etc can be set here. See the docs for more.)
$options['url'] = 'example.com';
// 4. Generate the Urlbox url
$urlboxUrl = $urlbox->generateUrl($options);
// $urlboxUrl is now 'https://api.urlbox.io/v1/API_KEY/TOKEN/png?url=example.com'
// 5. Now stick it in an img tag, when the image is loaded in browser, the API call to urlbox will be triggered and a nice PNG screenshot will be generated!
<img src="$urlboxUrl" />
Например, вот полный снимок экрана этой страницы:
Наконец, я настроил использование https://github.com/microweber/screen, как предложено @boksiora.
Изначально при попытке упомянутой ссылки вот что я получил:
Please download this script from here https://github.com/microweber/screen
Я на Linux. Так что, если вы хотите запустить его, вы можете настроить мой шаг следуя вашей среде.
Вот шаг, который я сделал на моей оболочке DOCUMENT_ROOT
папка:
$ sudo wget https://github.com/microweber/screen/archive/master.zip
$ sudo unzip master.zip
$ sudo mv screen-master screen
$ sudo chmod +x screen/bin/phantomjs
$ sudo yum install fontconfig
$ sudo yum install freetype*
$ cd screen
$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo php composer.phar update
$ cd ..
$ sudo chown -R apache screen
$ sudo chgrp -R www screen
$ sudo service httpd restart
Направьте ваш браузер на screen/demo/shot.php?url=google.com
, Когда вы видите скриншот, все готово. Обсуждение дополнительных настроек доступно здесь и здесь.
Я на Windows, поэтому я смог использовать функцию imagegrabwindow после прочтения подсказки здесь от Стефана. Я добавил обрезку (чтобы избавиться от заголовка браузера, полос прокрутки и т. Д.) И изменение размера, чтобы получить окончательное изображение. Вот мой код Надеюсь, что это помогает кому-то.
Я написал быстрое и грязное приложение на днях для этого с помощью Google API. Безусловно, возможности для улучшения...
- Он использует последнюю версию Google API версии 5.
- Размер изображения теперь 500px в ширину
- Поддерживает рабочий стол и мобильный вид
- Сохранить в файл в указанной папке
- Включите элементарную систему кэширования
Найдите это здесь с живой демонстрацией и кодом.
Я не размещал код здесь просто потому, что продолжаю дорабатывать его и, надеюсь, когда у меня будет время, преобразовать его в подходящий класс.
Вы можете использовать решение https://grabz.it/.
Он имеет PHP API, который очень гибок и может вызываться по-разному, например, из cronjob или веб-страницы PHP.
Для его реализации вам необходимо сначала получить ключ и секретный ключ приложения, а также загрузить (бесплатный) SDK.
И пример для реализации. Прежде всего инициализация:
include("GrabzItClient.class.php");
// Create the GrabzItClient class
// Replace "APPLICATION KEY", "APPLICATION SECRET" with the values from your account!
$grabzIt = new GrabzItClient("Sign in to view your Application Key", "Sign in to view your Application Secret");
И пример скриншота:
// To take a image screenshot
$grabzIt->URLToImage("http://www.google.com");
// Or to take a PDF screenshot
$grabzIt->URLToPDF("http://www.google.com");
// Or to convert online videos into animated GIF's
$grabzIt->URLToAnimation("http://www.example.com/video.avi");
// Or to capture table(s)
$grabzIt->URLToTable("http://www.google.com");
Далее идет сохранение. Вы можете использовать один из двух методов сохранения, Save
если общедоступный дескриптор обратного вызова доступен и SaveTo
если не. Проверьте документацию для деталей.
Я использовал блюгу. API позволяет делать 100 снимков в месяц без оплаты, но иногда он использует более 1 кредита на одну страницу. Я только что закончил обновление модуля drupal, Bluga WebThumbs до drupal 7, который позволяет вам печатать миниатюру в шаблоне или входном фильтре.
Основным преимуществом использования этого API-интерфейса является то, что он позволяет указывать размеры браузера в случае, если вы используете адаптивный CSS, поэтому я использую его для получения визуализаций для мобильного и планшетного макета, а также для обычного.
Есть клиенты API для следующих языков:
PHP, Python, Ruby, Java, .Net C#, Perl и Bash (сценарий оболочки выглядит так, как будто он требует perl)
Есть несколько способов, которыми вы можете добиться этого в PHP, но на самом деле лучше делегировать это API, не основанному на PHP, который вы можете создать самостоятельно или за который вы можете заплатить. Многие люди уже перечисляли в ответах API-интерфейсы для скриншотов, и вы можете использовать любой из них для достижения этой цели. Мой собственный API скриншотов очень хорошо протестирован и охватывает множество случаев рендеринга, которые не охватываются большинством API, но, честно говоря, для большинства людей это перебор.
Я рекомендую создать свой собственный API с помощью Puppeteer, который в настоящее время является каноническим решением для создания решений для создания снимков экрана. Мой сервис GetScreenshot построен на основе Puppeteer.
Вы можете создать бессерверное решение Puppeteer на AWS или GCP, используя что-то вроде https://www.npmjs.com/package/chrome-aws-lambda, который является отличным бессерверным пакетом для Puppeteer, который поставляется с предварительно загруженным Chromium.
Все зависит от того, как вы хотите сделать скриншот.
Вы можете сделать это через PHP, используя веб-сервис, чтобы получить изображение для вас
Для этого у grabz.it есть веб-сервис, вот статья, показывающая простой пример использования сервиса.
После долгих поисков в сети я нашел это.
PPTRAAS > Бесплатный инструмент для захвата скриншота путем передачи вашего URL в качестве параметра
Они предоставляют несколько вариантов, просто нажав их URL.
Получить полный скриншот страницы
https://pptraas.com/screenshot?url={ВЫ URL ЗДЕСЬ}
Получить скриншот страницы определенного размера
https://pptraas.com/screenshot?url={ВАШ URL ЗДЕСЬ}&size=400 400
Можно даже конвертировать страницу в PDF
https://pptraas.com/pdf?url={ВЫ URL ЗДЕСЬ}
Я использовал page2images. Он разработан на базе кутикапты, который действительно быстр и стабилен. Если вы не хотите тратить слишком много времени на производительность и настройку, вы должны использовать это. Если вы зайдете на их сайт, вы можете найти более подробную информацию и образец кода PHP.
Вы можете использовать cutycapt.
kwhtml устарел и показывает страницу как старый браузер.
Вы могли бы сделать 2 вещи.
Используйте кукловод
Вы можете использовать пакет PHP Puppeteer, чтобы развернуть браузер и сделать снимок экрана.
Используйте API
Есть много API для скриншотов. Вы можете, например, посмотреть на https://screenshotapi.net/. (Отказ от ответственности, я создатель этого API)
Я обнаружил, что это лучший и самый простой инструмент: ScreenShotMachine. Это платный сервис, но вы получаете 100 бесплатных скриншотов и можете купить еще 2000 за (около) 20 долларов, так что это довольно хорошая сделка. Он очень прост в использовании, вы просто используете URL, поэтому я написал этот небольшой скрипт для сохранения файла на его основе:
<?php
$url = file_get_contents("http://api.screenshotmachine.com/?key={mykey}&url=https://stackru.com&size=X");
$file = fopen("snapshots/stack.jpg", "w+");
fwrite($file, $url);
fclose($file);
die("saved file!");
?>
У них здесь очень хорошая документация, так что вы обязательно должны посмотреть.
Не напрямую. Такие программы, как Selenium, имеют такие функции и могут управляться PHP, но имеют другие зависимости (например, запуск своего сервера на основе Java на компьютере с браузером, который вы хотите сделать снимок экрана)