verusdev/faker-yandex-images

Faker provider that fills projects with real images found on Yandex.Images by search phrase (e.g. 'bmw x5') — downloads them locally and returns file paths. Ideal for seeding CRM photos.

Maintainers

Package info

github.com/verusdev/faker-yandex-images

pkg:composer/verusdev/faker-yandex-images

Transparency log

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-08-05 18:37 UTC

This package is auto-updated.

Last update: 2026-08-05 19:05:32 UTC


README

Провайдер для fakerphp/faker, который заполняет сиды реальными фотографиями из Яндекс.Картинок по поисковой фразе — например, "bmw x5" или "фото автомобиля". Идеально подходит для наполнения CRM/каталогов фотографиями автомобилей, товаров, людей и т.д.

Изображения скачиваются локально в указанную директорию (например, в storage/app/public/...), провайдер возвращает абсолютные пути к файлам.

Установка

composer require verusdev/faker-yandex-images

Локальная разработка (path-репозиторий)

Если пакет лежит рядом с проектом:

{
    "repositories": [
        { "type": "path", "url": "../faker-yandex-images", "options": { "symlink": true } }
    ],
    "require": {
        "verusdev/faker-yandex-images": "*"
    }
}

Через GitHub

{
    "repositories": [
        { "type": "vcs", "url": "https://github.com/verusdev/faker-yandex-images" }
    ],
    "require": {
        "verusdev/faker-yandex-images": "^1.0"
    }
}

Использование

Laravel-фабрика

use Faker\Generator;
use Verusdev\FakerYandexImages\Provider\YandexImagesProvider;

$faker = app(Generator::class);
$faker->addProvider(new YandexImagesProvider($faker));

// ...в фабрике:
'photo' => $faker->yandexImage('bmw x5', ['directory' => storage_path('app/public/cars')]),

Сидер: 100 автомобилей одной модели, уникальные фото

Результаты поиска кэшируются по фразе на время жизни провайдера: один поиск на Яндекс.Картинках (≈30 фото) → 100 записей получают случайные фото из пула, скачивание происходит только при обращении к каждой записи. Опция unique (включена по умолчанию) гарантирует, что каждый вызов возвращает новое фото: пока пул не исчерпан, повторов не будет; после исчерпания история сбрасывается.

use Faker\Factory;
use Verusdev\FakerYandexImages\Provider\YandexImagesProvider;

$faker = Factory::create();
$faker->addProvider(new YandexImagesProvider($faker));

$models = ['bmw x5', 'toyota camry', 'kia sportage'];

foreach ($models as $model) {
    // 30 уникальных фото на модель (1 страница выдачи)
    $photos = $faker->yandexImages($model, 30, [
        'directory' => storage_path('app/public/cars'),
        'prefix'    => $faker->slug($model), // slug() встроен в Faker
    ]);

    foreach ($photos as $i => $photo) {
        Car::create(['name' => $model, 'photo' => basename($photo)]);
    }
}

Только URL (без скачивания)

$faker->yandexImageUrl('bmw x5');          // https://avatars.mds.yandex.net/...
$faker->yandexImageUrls('bmw x5', 5);      // массив из 5 уникальных URL

API провайдера

Метод Описание
yandexImage(string $query, array $options = []): string Скачивает 1 случайное фото, возвращает путь к файлу
yandexImages(string $query, int $count = 1, array $options = []): list<string> Скачивает N уникальных фото
yandexImageUrl(string $query, array $options = []): string Возвращает URL без скачивания
yandexImageUrls(string $query, int $count = 1, array $options = []): list<string> Возвращает N уникальных URL

Опции

Опция По умолчанию Описание
directory sys_get_temp_dir()/faker-yandex-images Куда сохранять файлы
prefix slug фразы (например bmw-x5) Префикс имени файла: bmw-x5-a3f2c9.jpg
filename Полное имя файла (перекрывает prefix)
random true Случайная картинка из выдачи; false — по порядку
unique true Каждый вызов возвращает новое фото: уже выданные не повторяются, пока пул поиска не исчерпан, затем история сбрасывается. false — повторения допустимы
pages 1 Сколько страниц выдачи собрать (по ~30 фото)
perPage 30 Ожидаемое число фото на страницу (Яндекс отдаёт ~30)
imageSize large small / medium / large / wallpaper
imageType null jpg / png / gif — фильтр по формату
minWidth, minHeight 0 Отсев мелких изображений
timeout 25 Таймаут HTTP-запросов (сек)

Как это работает

  1. GET https://yandex.ru/images/search?text=<фраза>&isize=large
  2. Из HTML извлекается JSON-состояние приложения (data-state корневого элемента), декодируются сущности, парсится initialState.serpList.items.entities
  3. Для каждой записи выбирается самый крупный URL с CDN Яндекса (avatars.mds.yandex.net) — они стабильно доступны, в отличие от оригиналов на сайтах-источниках (те часто отдают 403/таймаут)
  4. Файл скачивается, проверяется сигнатура (JPEG/PNG/GIF/WEBP/BMP), расширение берётся из Content-Type

При капче/изменении разметки клиент делает до 3 попыток с повторной загрузкой страницы, затем бросает RuntimeException с понятным сообщением.

Тесты

composer test             # юнит-тесты (парсинг, генерация имён, сигнатуры)
composer test-network     # интеграционные: реальный поиск + скачивание

Лицензия

MIT. Изображения принадлежат их авторам; используйте в тестовых данных и не публикуйте их как собственные. Для production-контента проверяйте лицензии отдельно.