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.
Requires
- php: ^8.1
- ext-curl: *
- ext-json: *
- fakerphp/faker: ^1.20
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0
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-запросов (сек) |
Как это работает
- GET
https://yandex.ru/images/search?text=<фраза>&isize=large - Из HTML извлекается JSON-состояние приложения (
data-stateкорневого элемента), декодируются сущности, парситсяinitialState.serpList.items.entities - Для каждой записи выбирается самый крупный URL с CDN Яндекса
(
avatars.mds.yandex.net) — они стабильно доступны, в отличие от оригиналов на сайтах-источниках (те часто отдают 403/таймаут) - Файл скачивается, проверяется сигнатура (JPEG/PNG/GIF/WEBP/BMP),
расширение берётся из
Content-Type
При капче/изменении разметки клиент делает до 3 попыток с повторной загрузкой
страницы, затем бросает RuntimeException с понятным сообщением.
Тесты
composer test # юнит-тесты (парсинг, генерация имён, сигнатуры) composer test-network # интеграционные: реальный поиск + скачивание
Лицензия
MIT. Изображения принадлежат их авторам; используйте в тестовых данных и не публикуйте их как собственные. Для production-контента проверяйте лицензии отдельно.