Интеграция сервисов Яндекса с помощью PHP

Раздел: Интеграция API -> Интеграция сервисов Яндекса

Интеграция Яндекс API на PHP

Как выполнить запрос к любому Яндекс API на PHP?

Основной подход - использование API-ключа (или OAuth-токена) и отправка HTTP-запросов через cURL. После получения ответа в формате JSON данные обрабатываются функцией json_decode. Для авторизации в большинстве API Яндекса требуется передавать заголовок Authorization: Api-Key <ключ> или OAuth в виде Bearer-токена.

$key = 'ваш_api_ключ';
$url = 'https://api.rainy.ru/v1.0/...';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Api-Key ' . $key,
    'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpCode === 200) {
    $data = json_decode($response, true);
    // обработка
} else {
    // логирование ошибки
}
  

Api yandex php (яндекс api на php)

Альтернативные варианты:
  • Использование библиотеки Guzzle (Composer-пакет guzzlehttp/guzzle) для более удобного управления запросами.
  • Применение file_get_contents с созданием контекста stream_context_create - подходит для простых GET-запросов, но ограничен в настройке.
Типичные ошибки:
  • Код 401 - неверный или отсутствующий API-ключ. Проверяется правильность ключа и доступ сервиса.
  • Код 403 - превышена квота или нет прав доступа. Используется проверка баланса и тарифа.
  • Ошибка SSL - необходимо обновить CA-сертификаты в PHP или отключить проверку (не рекомендуется).

Как перевести текст через Яндекс.Переводчик?

Наиболее эффективное решение - использование REST API Яндекс.Переводчика (версия 1.5). Запрос отправляется методом POST на https://translate.yandex.net/api/v1.5/tr.json/translate. Параметры: key, text, lang (направление перевода, например 'en-ru'). Ответ содержит поле text с переведённым текстом.

$key = 'trnsl.1.1.201610...';
$text = 'Hello, world!';
$lang = 'en-ru';
$url = 'https://translate.yandex.net/api/v1.5/tr.json/translate';
$postData = http_build_query([
    'key' => $key,
    'text' => $text,
    'lang' => $lang
]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpCode === 200) {
    $result = json_decode($response, true);
    echo $result['text'][0]; // выведет 'Привет, мир!'
}
  
Вариант с официальным SDK - установка пакета yandex/translate через Composer. SDK автоматически обрабатывает авторизацию и ошибки, упрощая код.

use Yandex\Translate\Translator;
$translator = new Translator('trnsl.1.1.201610...');
$result = $translator->translate('Hello', 'en-ru');
echo $result->getText();
  
Проблемы:
  • Превышение дневной квоты - проверяется в личном кабинете.
  • Неверное направление перевода - язык должен быть указан в формате 'en-ru' или 'ru-en'.
  • Спецсимволы в тексте - требуется URL-кодирование (http_build_query это делает).

Как получить данные о погоде через Яндекс.Погоду?

Основной способ - использование API Яндекс.Погоды (версия 2). Необходим ключ доступа (доступен в Яндекс.Облаке). Запрос GET на https://api.weather.yandex.ru/v2/informers?lat=55.7558&lon=37.6176 возвращает JSON с текущей погодой, прогнозом, ветром и давлением.

$key = 'ваш_ключ_погоды';
$lat = 55.7558;
$lon = 37.6176;
$url = "https://api.weather.yandex.ru/v2/informers?lat=$lat&lon=$lon";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-Yandex-API-Key: ' . $key]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
$temp = $data['fact']['temp']; // температура в °C
  
Альтернатива - использование устаревшего API Informer (без ключа, но с ограничениями и устаревшим форматом). Не рекомендуется для новых проектов.
Частые ошибки:
  • Ошибка 403 - ключ не активирован для сервиса Погоды. Проверяется в Яндекс.Облаке.
  • Неверные координаты - lat/lon с точками или за пределами России возвращают пустой ответ.
  • Тарификация - бесплатный тариф имеет лимит запросов в сутки.

Как работать с файлами на Яндекс.Диске?

Эффективный способ - использование REST API Яндекс.Диска (документация). Требуется OAuth-токен с правами на чтение/запись. Пример загрузки файла через PUT-запрос:

$token = 'ваш_oauth_токен';
$filePath = '/home/user/file.txt';
$remotePath = 'disk:/file.txt';
$url = 'https://cloud-api.yandex.net/v1/disk/resources/upload?path=' . urlencode($remotePath);

// Получение ссылки для загрузки
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: OAuth ' . $token]);
$response = curl_exec($ch);
$data = json_decode($response, true);
$href = $data['href']; // ссылка для PUT-запроса
curl_close($ch);

// Загрузка файла
$ch2 = curl_init($href);
curl_setopt($ch2, CURLOPT_PUT, true);
curl_setopt($ch2, CURLOPT_INFILE, fopen($filePath, 'r'));
curl_setopt($ch2, CURLOPT_INFILESIZE, filesize($filePath));
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch2);
$httpCode = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
curl_close($ch2);
  
Вариант с библиотекой - пакет arhitector/yandex-disk-php (Composer). Упрощает авторизацию, работу с папками, скачивание.

use Arhitector\Yandex\Disk;
$disk = new Disk($token);
$disk->upload(__DIR__ . '/local.txt', 'disk:/remote.txt', true);
  
Проблемы:
  • Неверный OAuth-токен - требуется получить новый через OAuth-авторизацию.
  • Путь не существует - при загрузке в несуществующую папку возникает ошибка 409. Необходимо сначала создать папку через PUT /v1/disk/resources.
  • Лимиты - для бесплатных аккаунтов есть ограничения на размер файлов.

Как получить статическое изображение карты через Яндекс.Карты?

Простой метод - использование Static API. GET-запрос на https://static-maps.yandex.ru/1.x/?ll=37.62,55.76&size=450,450&z=10&l=map&pt=37.62,55.76,pm2rdm. Этот запрос возвращает изображение в формате PNG. В PHP можно сразу вывести или сохранить.

$params = http_build_query([
    'll' => '37.62,55.76',
    'size' => '450,450',
    'z' => 10,
    'l' => 'map',
    'pt' => '37.62,55.76,pm2rdm'
]);
$url = 'https://static-maps.yandex.ru/1.x/?' . $params;
$image = file_get_contents($url);
file_put_contents('map.png', $image);
  
Альтернатива - использование JavaScript API (не PHP) для интерактивных карт. На серверной стороне можно генерировать HTML с embedded картой.
Ошибки:
  • Некорректные координаты - ll должен быть в формате 'longitude,latitude' без пробелов.
  • Превышение суточного лимита - бесплатный тариф ограничен (25 000 запросов/сутки).
  • Карта не отображается - если параметры невалидны, возвращается HTTP 400.

Как распознать текст на изображении с помощью Yandex Vision?

Основной метод - отправка POST-запроса к Vision API (v1). Требуется IAM-токен или API-ключ. Изображение передаётся в виде base64 строки. Ответ содержит распознанный текст.

$key = 'ваш_iam_токен'; // или api_key
$imagePath = 'doc.jpg';
$imageData = base64_encode(file_get_contents($imagePath));
$body = json_encode([
    'config' => ['descriptionFilter' => ['text_detection' => null]],
    'source' => ['imageContent' => $imageData]
]);
$url = 'https://vision.api.cloud.yandex.net/vision/v1/batchAnalyze';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $key,
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$response = curl_exec($ch);
$data = json_decode($response, true);
$text = $data['results'][0]['textDetection']['text'] ?? '';
  
Вариант с использованием SDK - установка yandex-cloud-sdk-php (неофициальный). Упрощает получение IAM-токена.
Типичные проблемы:
  • Прeвышение лимита размера изображения (макс. 20 МБ).
  • Неверный формат - поддерживаются JPEG, PNG, PDF.
  • Ошибка 401 - недействительный IAM-токен, необходимо обновить.

Как сгенерировать текст с помощью YandexGPT?

Наиболее эффективный способ - вызов YandexGPT API (на платформе Yandex Cloud). Требуется каталог и сервисный аккаунт с ролью ai.vision.user (или ai.speechkit). Используется POST-запрос на https://llm.api.cloud.yandex.net/llm/v1alpha/instruct.

$iamToken = 'ваш_iam_token';
$folderId = 'b1g...';
$prompt = 'Расскажи вкратце о PHP';
$body = json_encode([
    'model' => 'yandexgpt-lite',
    'instructionText' => $prompt,
    'maxTokens' => 100
]);
$url = 'https://llm.api.cloud.yandex.net/llm/v1alpha/instruct';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $iamToken,
    'x-folder-id: ' . $folderId,
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$response = curl_exec($ch);
$data = json_decode($response, true);
$answer = $data['result']['alternatives'][0]['text'] ?? '';
  
Альтернатива через SpeechKit - если требуется голосовой ввод/вывод, используется Yandex SpeechKit API.
Ошибки:
  • Код 403 - не хватает прав сервисному аккаунту.
  • Код 400 - неверный body (модель, формат prompt).
  • Лимиты токенов - maxTokens не должен превышать 2000 для lite модели.

Расширенные примеры интеграции Яндекс API на PHP

Пример 1: полный цикл работы с Яндекс.Переводчиком (список языков, перевод, обработка ошибок)

Код ниже получает доступные направления перевода, переводит заданный текст и корректно обрабатывает возможные ошибки:

Пример

$apiKey = 'trnsl.1.1.201610...';

// Получение списка языков
$urlLangs = 'https://translate.yandex.net/api/v1.5/tr.json/getLangs?key=' . $apiKey . '&ui=ru';
$langsResponse = file_get_contents($urlLangs);
if ($langsResponse === false) {
    die('Ошибка получения списка языков');
}
$langsData = json_decode($langsResponse, true);
echo 'Доступные языки: ' . implode(', ', array_keys($langsData['langs'])) . "\n";

// Перевод текста
$text = 'Hello, world!';
$targetLang = 'ru';
$urlTranslate = 'https://translate.yandex.net/api/v1.5/tr.json/translate?key=' . $apiKey . '&text=' . urlencode($text) . '&lang=en-' . $targetLang;

$ch = curl_init($urlTranslate);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $result = json_decode($response, true);
    if (isset($result['text'][0])) {
        echo "Перевод: " . $result['text'][0] . "\n";
    } else {
        echo 'Нет поля text в ответе' . "\n";
        print_r($result);
    }
} elseif ($httpCode === 401) {
    echo 'Неверный API-ключ';
} elseif ($httpCode === 402) {
    echo 'Превышена квота';
} else {
    echo 'HTTP ошибка: ' . $httpCode;
}

Результат выполнения:

Доступные языки: af, am, ar, az, ba, be, bg, bn, bs, ca, ceb, cs, cy, da, de, el, en, eo, es, et, eu, fa, fi, fr, fy, ga, gd, gl, gu, ha, haw, he, hi, hmn, hr, ht, hu, hy, id, ig, is, it, iw, ja, jw, ka, kk, km, kn, ko, ku, ky, la, lb, lo, lt, lv, mg, mi, mk, ml, mn, mr, ms, mt, my, ne, nl, no, ny, or, pa, pl, ps, pt, ro, ru, sd, si, sk, sl, sm, sn, so, sq, sr, st, su, sv, sw, ta, te, tg, th, tk, tl, tr, tt, ug, uk, ur, uz, vi, xh, yi, yo, zu
Перевод: Привет, мир!

Пример 2: загрузка файла на Яндекс.Диск через REST API (создание папки, загрузка, проверка)

Пример

$token = 'ваш_oauth_токен';
$localFile = __DIR__ . '/example.txt';
$remoteFolder = 'disk:/Загрузки/';
$remoteFile = $remoteFolder . basename($localFile);

// Создание папки, если её нет
$urlCreate = 'https://cloud-api.yandex.net/v1/disk/resources?path=' . urlencode($remoteFolder);
$chCreate = curl_init($urlCreate);
curl_setopt($chCreate, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($chCreate, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chCreate, CURLOPT_HTTPHEADER, ['Authorization: OAuth ' . $token]);
$respCreate = curl_exec($chCreate);
$httpCreate = curl_getinfo($chCreate, CURLINFO_HTTP_CODE);
curl_close($chCreate);

if ($httpCreate !== 201 && $httpCreate !== 204) {
    // 409 - папка уже существует
    if ($httpCreate === 409) {
        echo 'Папка уже существует' . "\n";
    } else {
        die('Ошибка создания папки: ' . $respCreate);
    }
}

// Получение ссылки для загрузки
$urlUpload = 'https://cloud-api.yandex.net/v1/disk/resources/upload?path=' . urlencode($remoteFile) . '&overwrite=true';
$chHref = curl_init($urlUpload);
curl_setopt($chHref, CURLOPT_RETURNTRANSFER, true);
curl_setopt($chHref, CURLOPT_HTTPHEADER, ['Authorization: OAuth ' . $token]);
$respHref = curl_exec($chHref);
$dataHref = json_decode($respHref, true);
curl_close($chHref);

if (isset($dataHref['href'])) {
    $href = $dataHref['href'];
    // Загрузка файла
    $chPut = curl_init($href);
    curl_setopt($chPut, CURLOPT_PUT, true);
    curl_setopt($chPut, CURLOPT_INFILE, fopen($localFile, 'r'));
    curl_setopt($chPut, CURLOPT_INFILESIZE, filesize($localFile));
    curl_setopt($chPut, CURLOPT_RETURNTRANSFER, true);
    $respPut = curl_exec($chPut);
    $httpPut = curl_getinfo($chPut, CURLINFO_HTTP_CODE);
    curl_close($chPut);
    if ($httpPut === 201) {
        echo 'Файл успешно загружен' . "\n";
    } else {
        echo 'Ошибка загрузки: ' . $respPut . "\n";
    }
} else {
    echo 'Не удалось получить ссылку для загрузки';
    print_r($dataHref);
}

Результат:

Папка уже существует
Файл успешно загружен

Пример 3: распознавание текста из изображения по URL через Yandex Vision

Пример

$iamToken = 'ваш_iam_токен';
$folderId = 'b1g...';
$imageUrl = 'https://example.com/document.jpg';

$body = json_encode([
    'folderId' => $folderId,
    'analyzeSpecs' => [
        [
            'content' => [
                'image' => [
                    'imageSource' => [
                        'imageUrl' => $imageUrl
                    ]
                ]
            ],
            'features' => [
                ['type' => 'TEXT_DETECTION']
            ]
        ]
    ]
]);

$url = 'https://vision.api.cloud.yandex.net/vision/v1/batchAnalyze';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $iamToken,
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $data = json_decode($response, true);
    $text = $data['results'][0]['textDetection']['text'] ?? 'Текст не найден';
    echo "Распознанный текст: \n" . $text;
} else {
    echo 'Ошибка: ' . $response;
}

Результат (пример):

Распознанный текст: 
Договор №123 от 01.01.2023

Пример 4: генерация ответа YandexGPT с системным сообщением

Пример

$iamToken = 'ваш_iam_токен';
$folderId = 'b1g...';

$messages = [
    ['role' => 'system', 'text' => 'Ты профессиональный PHP-разработчик.'],
    ['role' => 'user', 'text' => 'Напиши класс для работы с Яндекс API.']
];

$body = json_encode([
    'model' => 'yandexgpt',
    'generationOptions' => [
        'maxTokens' => 500,
        'temperature' => 0.6
    ],
    'messages' => $messages
]);

$url = 'https://llm.api.cloud.yandex.net/llm/v1/completion';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $iamToken,
    'x-folder-id: ' . $folderId,
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $data = json_decode($response, true);
    $answer = $data['result']['alternatives'][0]['message']['text'] ?? '';
    echo 'Ответ YandexGPT: ' . $answer;
} else {
    echo 'Ошибка: ' . $response;
}

Результат (сгенерированный текст):

Ответ YandexGPT: Класс для работы с Яндекс API может включать методы для выполнения запросов, обработки ответов и управления ключами. Примерный каркас:

class YandexApiClient {
    private $apiKey;
    public function __construct($apiKey) {
        $this->apiKey = $apiKey;
    }
    public function request($method, $url, $data = []) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Api-Key ' . $this->apiKey]);
        // ...
    }
}

Яндекс API на PHP - comments

En
Api yandex php (php)