Делаем скриншоты с помощью пакета Laravel Screenshot

Новый пакет Spatie Laravel Screenshot предоставляет простой способ автоматически делать скриншоты веб-страниц прямо из вашего приложения на Laravel. Он пригодится, например, для создания изображений страниц, генерации Open Graph-картинок, визуальных отчетов или мониторинга.

Что такое Laravel Screenshot

Laravel Screenshot - это пакет, который позволяет захватывать скриншоты HTML-страниц или произвольного HTML-кода и сохранять их в файл. В основе лежит архитектура с драйверами. Вы сами выбираете, каким способом делать скриншот:

  • Browsershot - по умолчанию использует безголовый Chromium (через Node.js). Требует установленный Chrome/Chromium и Node.js.

  • Cloudflare Browser Rendering API - альтернатива без необходимости иметь браузер на сервере. Не требует Node.js и Chrome, заменяя их удалённым API-рендерингом от Cloudflare.

Пакет поставляется с удобными настройками по умолчанию: разрешение окна 1280×800, коэффициент устройства 2× для ретины, формат PNG и ожидание, пока сеть полностью загрузится перед снятием скриншота.

Установка через Composer

Выполните команду в корне проекта:

composer require spatie/laravel-screenshot

После установки при необходимости можно опубликовать конфигурационный файл:

php artisan vendor:publish --tag="laravel-screenshot-config"

Это позволит изменить драйвер, размеры окна, формат изображения и другие параметры по умолчанию.

Дополнительно может понадобиться установка самого Browsershot:

composer require spatie/browsershot

Начало работы: простой пример

После установки пакета можно сделать скриншот любой страницы буквально в пару строк:

use Spatie\LaravelScreenshot\Facades\Screenshot;

Screenshot::url('https://example.com')->save('screenshot.png');

Этот код загрузит страницу по URL и сохранит её в виде PNG-изображения с настройками по умолчанию.

Настройка размеров и качества

С помощью методов цепочки можно управлять размерами изображения, качеством и форматом:

Screenshot::url('https://example.com')
    ->width(1920)
    ->height(1080)
    ->quality(80)
    ->save('screenshot.jpg');
  • width и height задают размеры окна браузера.

  • quality регулирует качество при сохранении в JPEG (0–100).

Асинхронное создание скриншотов

Если вы хотите генерировать скриншоты в фоновом режиме (например, после отправки формы), пакет поддерживает очередь задач:

Screenshot::url('https://example.com')
    ->saveQueued('screenshot.png')
    ->then(fn (string $path, ?string $diskName) => 
        Mail::to($user)->send(new ScreenshotMail($path))
    );

После завершения генерации вы можете выполнить callback-функцию: например, отправить уведомление пользователю.

Тестирование скриншотов

Для тестирования пакет предоставляет удобные утилиты, которые позволяют подделать процесс скриншота без реального захвата изображения:

Screenshot::fake();

$this->get(route('screenshot'))->assertOk();

Screenshot::assertSaved(function ($screenshot) {
    return $screenshot->url === 'https://example.com';
});

Это позволяет проверять, вызывался ли метод захвата страницы, без сетевых запросов и записей на диск.

Примеры сценариев применения

Пакет особенно полезен в следующих случаях:

  • Автоматическая генерация Open Graph-изображений для страниц сайта (превью в соцсетях).

  • Снятие отчётных изображений и визуальных снимков для документации или маркетинга.

  • Мониторинг внешних страниц и визуальное сравнение изменений.

  • Интеграция в отчёты о тестировании.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Почему стоит использовать Python для скриптов

Почему Bash-скрипты часто ломаются на macOS и в CI, и как Python решает эту проблему. Разбираем, в каких случаях Python лучше подходит для автоматизации, чем bash, и почему он делает скрипты понятнее, стабильнее и кросс-платформеннее.

Laravel 12.44: добавлены HTTP-клиентские callbacks после получения ответа

Обзор релиза Laravel 12.44: добавлен метод afterResponse() для HTTP-клиента, новые методы для тестов и улучшенная валидация дат. Поясняется, как использовать новые фичи на практике.