Avatar ·

Как сделать скриншот веб-сайта с помощью PHP?

Всем привет! Я начинающий PHP разработчик и столкнулся с задачей, которая поставила меня в тупик. Мне нужно сделать скриншот веб-сайта на PHP. Заказчик хочет, чтобы при вводе URL в форму автоматически создавалась миниатюра страницы (превью). Я думал, что это будет просто, но оказалось, что стандартные функции PHP (типа `file_get_contents` или `imagecreatefromjpeg`) не работают для этой цели — они получают только HTML-код, а не визуальное изображение страницы. Я попытался использовать простой подход: загрузить страницу и сохранить её как HTML, но это не даёт картинку. Вот мой код: ```php $url = 'https://example.com'; $html = file_get_contents($url); file_put_contents('screenshot.html', $html); ``` Проблема в том, что браузер не отрисовывает страницу. Я слышал, что существуют сервисы типа Google PageSpeed API или специальные библиотеки, но не знаю, как их правильно подключить. Также пробовал установить расширение `php-gd`, но оно только для работы с изображениями, а не для захвата экрана. Подскажите, пожалуйста, какие есть способы сделать скриншот сайта на PHP? Нужно ли использовать внешние API, или можно обойтись только серверными инструментами? Желательно с примером кода, который реально работает. Заранее спасибо! <<>>

Основные подходы к созданию скриншотов в 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 без необходимости установки софта.