Как сделать скриншот веб-сайта с помощью PHP?
Основные подходы к созданию скриншотов в PHP
PHP сам по себе не может делать скриншоты веб-страниц, так как это серверный язык без браузерного движка. Для решения задачи нужно использовать внешние инструменты. Рассмотрим два самых популярных и надёжных способа: через библиотеку Puppeteer (Node.js) и через API сервисов.
Способ 1: Использование Puppeteer через exec()
Puppeteer — это библиотека для управления браузером Chrome/Chromium. Установите Node.js и Puppeteer на сервере:
npm install puppeteer
Создайте скрипт screenshot.js:
const puppeteer = require('puppeteer');
async function takeScreenshot(url) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
await page.screenshot({ path: 'screenshot.png', fullPage: true });
await browser.close();
}
const url = process.argv[2];
takeScreenshot(url);
Теперь вызывайте его из PHP:
<?php
function getScreenshot($url) {
$safeUrl = escapeshellarg($url);
$command = "node screenshot.js $safeUrl";
exec($command, $output, $returnCode);
if ($returnCode === 0) {
return 'screenshot.png';
} else {
return false;
}
}
$screenshot = getScreenshot('https://example.com');
if ($screenshot) {
echo "<img src='$screenshot' alt='Скриншот'>";
} else {
echo "Ошибка создания скриншота";
}
?>
Способ 2: Использование API (например, ScreenshotMachine)
Если нет возможности установить Node.js, используйте готовые сервисы. Пример с API ScreenshotMachine:
<?php
function getScreenshotAPI($url) {
$apiKey = 'YOUR_API_KEY';
$secret = 'YOUR_SECRET';
$params = [
'url' => $url,
'dimension' => '1366x768',
'device' => 'desktop',
'format' => 'png',
'cacheLimit' => '0',
'delay' => '200'
];
$query = http_build_query($params);
$apiUrl = "http://api.screenshotmachine.com/?key=$apiKey&$query";
$imageData = file_get_contents($apiUrl);
if ($imageData) {
file_put_contents('screenshot_api.png', $imageData);
return 'screenshot_api.png';
}
return false;
}
$screenshot = getScreenshotAPI('https://example.com');
if ($screenshot) {
echo "<img src='$screenshot' alt='Скриншот'>";
}
?>
Важные моменты
- Для Puppeteer нужен root-доступ к серверу для установки Chromium
- API-сервисы часто имеют ограничения по количеству запросов в день
- Всегда проверяйте лицензию сайта перед созданием скриншотов
- Для продакшена используйте кеширование, чтобы не генерировать скриншот каждый раз
Рекомендую начать с API, если проект небольшой, или с Puppeteer, если нужна полная кастомизация (например, скриншоты с авторизацией).
<<Альтернатива: использование Browsershot (обёртка для Puppeteer на PHP)
Если хотите оставаться в экосистеме PHP, используйте пакет spatie/browsershot. Он устанавливается через Composer и предоставляет удобный интерфейс для работы с Puppeteer:
composer require spatie/browsershot
Пример использования:
<?php
require 'vendor/autoload.php';
use Spatie\Browsershot\Browsershot;
function getScreenshotBrowsershot($url) {
$path = 'screenshot_bs.png';
Browsershot::url($url)
->windowSize(1366, 768)
->fullPage()
->save($path);
return $path;
}
$screenshot = getScreenshotBrowsershot('https://example.com');
echo "<img src='$screenshot' alt='Скриншот'>";
?>
Плюсы этого подхода: чистый PHP-код, поддержка JavaScript, возможность делать PDF, настраивать User-Agent и таймауты. Минус — всё равно требуется Node.js и Puppeteer на сервере. Установка Browsershot автоматически проверяет наличие бинарника Chromium.
Совет: для хостинга без shell-доступа рассмотрите сервис url2png.com или apify.com — они предоставляют простые REST API без необходимости установки софта.
Ответов пока нет.
Войдите чтобы оставить ответ