PHP клиент для работы с Yandex Search API. Позволяет выполнять поисковые запросы через Yandex Cloud Search API и получать результаты поиска. Может использоваться для поиска позиций вашего сайта.
- Автоматическое управление IAM токенами (обновление при истечении)
- Поддержка различных типов поиска (русский, турецкий, международный)
- Поддержка множества регионов России и других стран
- Асинхронные запросы с проверкой статуса операции
- Извлечение ссылок из XML результатов
- Интеграция с PSR-3 логгерами
- Полная поддержка типов (PHP 8.1+)
- PHP 8.1 или выше
- Composer
- OAuth токен от Yandex
- Folder ID в Yandex Cloud
composer require nulldec0de/yandex-search-api-php-client- Клонируйте репозиторий:
git clone https://github.com/NullDec0de/YandexSearchAPI-php.git- Установите зависимости:
composer install<?php
require_once 'vendor/autoload.php';
use YandexSearchAPI\YandexSearchAPIClient;
use YandexSearchAPI\SearchType;
use YandexSearchAPI\Region;
// Инициализация клиента
$client = new YandexSearchAPIClient(
    folderId: 'your-folder-id',
    oauthToken: 'your-oauth-token'
);
// Простой поиск с ожиданием результатов
try {
    $links = $client->getLinks(
        queryText: 'PHP programming',
        searchType: SearchType::RUSSIAN,
        region: Region::MOSCOW_AND_MOSCOW_REGION,
        nLinks: 10
    );
    
    foreach ($links as $link) {
        echo $link . "\n";
    }
} catch (\YandexSearchAPI\YandexSearchAPIError $e) {
    echo "Ошибка: " . $e->getMessage() . "\n";
}<?php
use YandexSearchAPI\YandexSearchAPIClient;
use YandexSearchAPI\SearchType;
use YandexSearchAPI\Region;
use Psr\Log\LoggerInterface;
// С кастомным логгером
$logger = new MyCustomLogger();
$client = new YandexSearchAPIClient(
    folderId: 'your-folder-id',
    oauthToken: 'your-oauth-token',
    logger: $logger
);
// Асинхронный поиск
$operationId = $client->search(
    queryText: 'Yandex Cloud',
    searchType: SearchType::RUSSIAN,
    region: Region::RUSSIA,
    page: 0,
    nLinks: 20
);
// Проверка статуса и получение результатов
sleep(2);
$xmlResults = $client->getSearchResults($operationId);
// Извлечение ссылок из XML
$links = YandexSearchAPIClient::extractYandexSearchLinks($xmlResults);<?php
$client = new YandexSearchAPIClient(
    folderId: 'your-folder-id',
    oauthToken: 'your-oauth-token'
);
// Автоматическое ожидание результатов с таймаутом
try {
    $xmlResults = $client->searchAndWait(
        queryText: 'Python tutorials',
        searchType: SearchType::INTERNATIONAL,
        region: Region::RUSSIA,
        maxWait: 300,  // максимум 5 минут ожидания
        interval: 1,   // проверка каждую секунду
        nLinks: 15
    );
    
    $links = YandexSearchAPIClient::extractYandexSearchLinks($xmlResults);
} catch (\YandexSearchAPI\YandexSearchTimeoutError $e) {
    echo "Таймаут: " . $e->getMessage() . "\n";
}public function __construct(
    string $folderId,
    string $oauthToken,
    ?LoggerInterface $logger = null,
    ?Client $httpClient = null
)Параметры:
- $folderId- ID папки в Yandex Cloud (обязательный)
- $oauthToken- OAuth токен от Yandex (обязательный)
- $logger- Экземпляр PSR-3 логгера (опционально)
- $httpClient- Кастомный Guzzle HTTP клиент (опционально)
Выполняет поисковый запрос и возвращает ID операции.
public function search(
    string $queryText,
    SearchType $searchType = SearchType::RUSSIAN,
    Region $region = Region::RUSSIA,
    int $page = 0,
    int $nLinks = 10,
    float $responseTimeout = 5.0
): stringПараметры:
- $queryText- Текст поискового запроса
- $searchType- Тип поиска (по умолчанию- SearchType::RUSSIAN)
- $region- Регион поиска (по умолчанию- Region::RUSSIA)
- $page- Номер страницы результатов (по умолчанию 0)
- $nLinks- Количество ссылок на странице (по умолчанию 10)
- $responseTimeout- Таймаут ответа в секундах (по умолчанию 5.0)
Возвращает: ID операции (string)
Исключения: YandexSearchAPIError
Получает результаты поиска по ID операции.
public function getSearchResults(string $operationId): stringПараметры:
- $operationId- ID операции, полученный из метода- search()
Возвращает: XML контент с результатами поиска (string)
Исключения: YandexSearchAPIError
Выполняет поиск и ожидает завершения операции с автоматической проверкой статуса.
public function searchAndWait(
    string $queryText,
    SearchType $searchType = SearchType::RUSSIAN,
    Region $region = Region::RUSSIA,
    int $maxWait = 300,
    int $interval = 1,
    int $nLinks = 10
): stringПараметры:
- $queryText- Текст поискового запроса
- $searchType- Тип поиска
- $region- Регион поиска
- $maxWait- Максимальное время ожидания в секундах (по умолчанию 300)
- $interval- Интервал проверки статуса в секундах (по умолчанию 1)
- $nLinks- Количество ссылок на странице
Возвращает: XML контент с результатами поиска (string)
Исключения: YandexSearchTimeoutError, YandexSearchAPIError
Удобный метод для получения только ссылок из результатов поиска.
public function getLinks(
    string $queryText,
    SearchType $searchType = SearchType::RUSSIAN,
    Region $region = Region::RUSSIA,
    int $nLinks = 10,
    int $maxWait = 300,
    int $interval = 1
): arrayВозвращает: Массив URL-адресов (string[])
Исключения: YandexSearchTimeoutError, YandexSearchAPIError
Статический метод для извлечения ссылок из XML контента.
public static function extractYandexSearchLinks(string $xmlContent): arrayПараметры:
- $xmlContent- XML контент с результатами поиска
Возвращает: Массив URL-адресов (string[])
Типы поиска:
- SearchType::RUSSIAN- Поиск по русскоязычному интернету
- SearchType::TURKISH- Поиск по турецкому интернету
- SearchType::INTERNATIONAL- Международный поиск
Поддерживаемые регионы включают:
- Region::RUSSIA- Вся Россия
- Region::MOSCOW_AND_MOSCOW_REGION- Москва и Московская область
- Region::SAINT_PETERSBURG- Санкт-Петербург
- Region::EKATERINBURG- Екатеринбург
- Region::NOVOSIBIRSK- Новосибирск
- И многие другие регионы России и стран СНГ
Полный список регионов доступен в файле Enums.php.
Форматы ответа:
- ResponseFormat::XML- XML формат
- ResponseFormat::HTML- HTML формат
- YandexSearchAPIError- Базовое исключение для всех ошибок API
- YandexSearchTimeoutError- Исключение при таймауте ожидания результатов
- YandexAuthError- Исключение при ошибках аутентификации
- Перейдите на Yandex OAuth
- Создайте новое приложение
- Получите OAuth токен
- Войдите в Yandex Cloud Console
- Выберите или создайте облако
- Создайте каталог (folder)
- Скопируйте Folder ID из адресной строки или настроек каталога
use YandexSearchAPI\Region;
$regions = [
    Region::MOSCOW_AND_MOSCOW_REGION,
    Region::SAINT_PETERSBURG,
    Region::EKATERINBURG
];
foreach ($regions as $region) {
    $links = $client->getLinks(
        queryText: 'рестораны',
        region: $region,
        nLinks: 5
    );
    
    echo "Регион: {$region->value}\n";
    foreach ($links as $link) {
        echo "  - $link\n";
    }
}for ($page = 0; $page < 3; $page++) {
    $operationId = $client->search(
        queryText: 'PHP разработка',
        page: $page,
        nLinks: 10
    );
    
    sleep(2);
    $results = $client->getSearchResults($operationId);
    $links = YandexSearchAPIClient::extractYandexSearchLinks($results);
    
    echo "Страница " . ($page + 1) . ":\n";
    foreach ($links as $link) {
        echo "  - $link\n";
    }
}try {
    $links = $client->getLinks('test query');
} catch (\YandexSearchAPI\YandexAuthError $e) {
    echo "Ошибка аутентификации: " . $e->getMessage() . "\n";
} catch (\YandexSearchAPI\YandexSearchTimeoutError $e) {
    echo "Таймаут: " . $e->getMessage() . "\n";
} catch (\YandexSearchAPI\YandexSearchAPIError $e) {
    echo "Ошибка API: " . $e->getMessage() . "\n";
} catch (\Exception $e) {
    echo "Неожиданная ошибка: " . $e->getMessage() . "\n";
}Клиент поддерживает PSR-3 логгеры:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$logger = new Logger('yandex_search');
$logger->pushHandler(new StreamHandler('php://stdout', Logger::DEBUG));
$client = new YandexSearchAPIClient(
    folderId: 'your-folder-id',
    oauthToken: 'your-oauth-token',
    logger: $logger
);- PHP 8.1+
- Расширение ext-json
- Расширение ext-xml
- Расширение ext-curl(для Guzzle)
composer testЕсли у вас возникли вопросы или проблемы:
- Проверьте документацию Yandex Search API
- Создайте Issue на GitHub
- Убедитесь, что ваши OAuth токен и Folder ID корректны