Яндекс.Вебмастер — это бесплатный сервис для владельцев сайтов, который предоставляет ценнейшую информацию о видимости ресурса в поисковой системе Яндекс. Одной из ключевых возможностей сервиса является доступ к данным о поисковых запросах, по которым пользователи находят ваш сайт. Для разработчиков и SEO-специалистов особенно ценна возможность автоматизировать получение этой информации через API Яндекс.Вебмастер, что позволяет интегрировать данные непосредственно в свои приложения и системы мониторинга.
В этой статье мы рассмотрим, как с помощью PHP получить список популярных поисковых запросов для всех сайтов, добавленных в ваш аккаунт Яндекс.Вебмастер. Это особенно полезно для создания собственных дашбордов, автоматизации SEO-отчетов и интеграции поисковой аналитики в панели управления хостингом или CMS.
Предварительные требования
Перед началом работы необходимо:
-
Зарегистрировать приложение на oauth.yandex.ru
-
Получить ID приложения и пароль, которые будут использоваться для OAuth-авторизации
-
Убедиться, что сайты подтверждены в Яндекс.Вебмастер, так как API возвращает данные только для верифицированных сайтов
Получение OAuth-токена
Для работы с API необходимо получить токен доступа. Процесс авторизации состоит из нескольких этапов:
$client_id = "ваш_id_приложения";
$client_secret = "ваш_пароль_приложения";
// Перенаправляем пользователя на страницу авторизации
if (!isset($_GET["code"])) {
Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".$client_id);
die();
}
// Получаем токен по коду подтверждения
function getOAuthToken($code, $client_id, $client_secret) {
$url = "https://oauth.yandex.ru/token";
$data = array(
'grant_type' => 'authorization_code',
'code' => $code,
'client_id' => $client_id,
'client_secret' => $client_secret
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code != 200) {
throw new Exception("Ошибка получения токена: ".$response);
}
$response_data = json_decode($response, true);
return $response_data['access_token'];
}
// Использование
$token = getOAuthToken($_GET["code"], $client_id, $client_secret);
Токен действителен в течение 180 дней, поэтому его можно сохранить в базе данных для повторного использования
Получение ID пользователя и списка сайтов
После получения токена нужно определить ID пользователя и получить список его сайтов:
function getUserId($token) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://webmaster.yandex.ru/api/me");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: OAuth '.$token,
'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code != 200) {
throw new Exception("Ошибка получения ID пользователя");
}
// Ответ содержит ссылку вида: https://webmaster.yandex.ru/api/123456789
$user_id = str_replace('https://webmaster.yandex.ru/api/', '', $response);
return trim($user_id);
}
function getHosts($user_id, $token) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://webmaster.yandex.ru/api/".$user_id."/hosts");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: OAuth '.$token,
'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code != 200) {
throw new Exception("Ошибка получения списка сайтов");
}
$xml = new SimpleXMLElement($response);
$hosts = array();
foreach($xml->host as $host) {
$hosts[] = array(
'name' => (string)$host->name,
'host_id' => (string)$host->attributes()->href,
'verification_state' => (string)$host->verification->attributes()->state,
'crawling_state' => (string)$host->crawling->attributes()->state
);
}
return $hosts;
}
// Использование
$user_id = getUserId($token);
$hosts = getHosts($user_id, $token);
Получение популярных поисковых запросов для сайта
Для получения популярных поисковых запросов используется метод GET /v4/user/{user-id}/hosts/{host-id}/search-queries/popular
.
Параметры запроса:
| Параметр |
Обязательный |
Описание |
order_by |
Да |
Сортировка: TOTAL_SHOWS (показы) или TOTAL_CLICKS (клики) |
query_indicator |
Нет |
Индикаторы: TOTAL_SHOWS, TOTAL_CLICKS, AVG_SHOW_POSITION, AVG_CLICK_POSITION |
device_type_indicator |
Нет |
Тип устройства: ALL, DESKTOP, MOBILE_AND_TABLET и др. |
limit |
Нет |
Количество записей (1-500), по умолчанию 500 |
offset |
Нет |
Смещение списка |
function getPopularQueries($user_id, $host_id, $token, $params = array()) {
$default_params = array(
'order_by' => 'TOTAL_SHOWS',
'limit' => 500
);
$params = array_merge($default_params, $params);
$query_string = http_build_query($params);
$url = "https://api.webmaster.yandex.net/v4/user/".$user_id."/hosts/".$host_id."/search-queries/popular?".$query_string;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: OAuth '.$token,
'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code != 200) {
throw new Exception("Ошибка получения запросов: HTTP код ".$http_code);
}
$data = json_decode($response, true);
return $data;
}
// Пример использования для получения 200 самых популярных запросов по кликам
$queries = getPopularQueries($user_id, $host_id, $token, array(
'order_by' => 'TOTAL_CLICKS',
'limit' => 200
));
Обработка результатов
Ответ API содержит массив запросов с информацией о показах, кликах и позициях:
// Пример обработки ответа
if (isset($queries['queries']) && is_array($queries['queries'])) {
foreach ($queries['queries'] as $query) {
echo "Запрос: " . $query['query_text'] . "\n";
echo "ID: " . $query['query_id'] . "\n";
echo "Показы: " . ($query['indicators']['TOTAL_SHOWS'] ?? 'N/A') . "\n";
echo "Клики: " . ($query['indicators']['TOTAL_CLICKS'] ?? 'N/A') . "\n";
echo "Средняя позиция показа: " . ($query['indicators']['AVG_SHOW_POSITION'] ?? 'N/A') . "\n";
echo "---\n";
}
echo "Период данных: с " . $queries['date_from'] . " по " . $queries['date_to'] . "\n";
echo "Всего доступно запросов: " . $queries['count'] . "\n";
}
Полный пример скрипта
<?php
class YandexWebmasterAPI {
private $token;
private $user_id;
public function __construct($token) {
$this->token = $token;
$this->user_id = $this->getUserId();
}
private function apiCall($url, $headers = []) {
$default_headers = [
'Authorization: OAuth ' . $this->token,
'Content-Type: application/json'
];
$headers = array_merge($default_headers, $headers);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code != 200) {
throw new Exception("API error: HTTP code " . $http_code . ", response: " . $response);
}
return json_decode($response, true);
}
private function getUserId() {
// Реализация получения ID пользователя
// ...
}
public function getHosts() {
// Реализация получения списка сайтов
// ...
}
public function getAllPopularQueries($params = []) {
$hosts = $this->getHosts();
$all_queries = [];
foreach ($hosts as $host) {
if ($host['verification_state'] !== 'VERIFIED') {
continue;
}
$host_queries = $this->getPopularQueries($host['host_id'], $params);
$all_queries[$host['name']] = $host_queries;
}
return $all_queries;
}
// Остальные методы класса...
}
// Использование
try {
$webmaster_api = new YandexWebmasterAPI($token);
$all_queries = $webmaster_api->getAllPopularQueries([
'order_by' => 'TOTAL_SHOWS',
'limit' => 100
]);
// Сохранение или обработка результатов
file_put_contents('popular_queries.json', json_encode($all_queries, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
} catch (Exception $e) {
echo "Ошибка: " . $e->getMessage();
}
Яндекс.Вебмастер — это бесплатный сервис для владельцев сайтов, который предоставляет ценнейшую информацию о видимости ресурса в поисковой системе Яндекс. Одной из ключевых возможностей сервиса является доступ к данным о поисковых запросах, по которым пользователи находят ваш сайт. Для разработчиков и SEO-специалистов особенно ценна возможность автоматизировать получение этой информации через API Яндекс.Вебмастер, что позволяет интегрировать данные непосредственно в свои приложения и системы мониторинга.
В этой статье мы рассмотрим, как с помощью PHP получить список популярных поисковых запросов для всех сайтов, добавленных в ваш аккаунт Яндекс.Вебмастер. Это особенно полезно для создания собственных дашбордов, автоматизации SEO-отчетов и интеграции поисковой аналитики в панели управления хостингом или CMS.
Предварительные требования
Перед началом работы необходимо:
Зарегистрировать приложение на oauth.yandex.ru
Указать название и описание приложения
Выдать права: «Добавлять сайты в сервис Яндекс.Вебмастер и получать информацию о статусе индексирования»
Указать Callback URI
Получить ID приложения и пароль, которые будут использоваться для OAuth-авторизации
Убедиться, что сайты подтверждены в Яндекс.Вебмастер, так как API возвращает данные только для верифицированных сайтов
Получение OAuth-токена
Для работы с API необходимо получить токен доступа. Процесс авторизации состоит из нескольких этапов:
Токен действителен в течение 180 дней, поэтому его можно сохранить в базе данных для повторного использования
Получение ID пользователя и списка сайтов
После получения токена нужно определить ID пользователя и получить список его сайтов:
Получение популярных поисковых запросов для сайта
Для получения популярных поисковых запросов используется метод
GET /v4/user/{user-id}/hosts/{host-id}/search-queries/popular.
Параметры запроса:
order_byTOTAL_SHOWS(показы) илиTOTAL_CLICKS(клики)query_indicatorTOTAL_SHOWS,TOTAL_CLICKS,AVG_SHOW_POSITION,AVG_CLICK_POSITIONdevice_type_indicatorALL,DESKTOP,MOBILE_AND_TABLETи др.limitoffsetОбработка результатов
Ответ API содержит массив запросов с информацией о показах, кликах и позициях:
Полный пример скрипта
<?php class YandexWebmasterAPI { private $token; private $user_id; public function __construct($token) { $this->token = $token; $this->user_id = $this->getUserId(); } private function apiCall($url, $headers = []) { $default_headers = [ 'Authorization: OAuth ' . $this->token, 'Content-Type: application/json' ]; $headers = array_merge($default_headers, $headers); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($http_code != 200) { throw new Exception("API error: HTTP code " . $http_code . ", response: " . $response); } return json_decode($response, true); } private function getUserId() { // Реализация получения ID пользователя // ... } public function getHosts() { // Реализация получения списка сайтов // ... } public function getAllPopularQueries($params = []) { $hosts = $this->getHosts(); $all_queries = []; foreach ($hosts as $host) { if ($host['verification_state'] !== 'VERIFIED') { continue; } $host_queries = $this->getPopularQueries($host['host_id'], $params); $all_queries[$host['name']] = $host_queries; } return $all_queries; } // Остальные методы класса... } // Использование try { $webmaster_api = new YandexWebmasterAPI($token); $all_queries = $webmaster_api->getAllPopularQueries([ 'order_by' => 'TOTAL_SHOWS', 'limit' => 100 ]); // Сохранение или обработка результатов file_put_contents('popular_queries.json', json_encode($all_queries, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); } catch (Exception $e) { echo "Ошибка: " . $e->getMessage(); }