Интеграция сервисов Яндекса с помощью 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)