PHP

Получаем список популярных поисковых запросов из Яндекс.Вебмастер через PHP API

Практическое руководство по использованию API Яндекс.Вебрастера на PHP для получения ТОП популярных поисковых запросов по вашим сайтам. Примеры кода, авторизация OAuth, обработка ответов.

sqlka.ruОпубликовано: Чтение: 9 мин.
Получаем список популярных поисковых запросов из Яндекс.Вебмастер через PHP API

Яндекс.Вебмастер — это бесплатный сервис для владельцев сайтов, который предоставляет ценнейшую информацию о видимости ресурса в поисковой системе Яндекс. Одной из ключевых возможностей сервиса является доступ к данным о поисковых запросах, по которым пользователи находят ваш сайт. Для разработчиков и SEO-специалистов особенно ценна возможность автоматизировать получение этой информации через API Яндекс.Вебмастер, что позволяет интегрировать данные непосредственно в свои приложения и системы мониторинга.

В этой статье мы рассмотрим, как с помощью PHP получить список популярных поисковых запросов для всех сайтов, добавленных в ваш аккаунт Яндекс.Вебмастер. Это особенно полезно для создания собственных дашбордов, автоматизации SEO-отчетов и интеграции поисковой аналитики в панели управления хостингом или CMS.

Предварительные требования

Перед началом работы необходимо:

  1. Зарегистрировать приложение на oauth.yandex.ru

    • Указать название и описание приложения

    • Выдать права: «Добавлять сайты в сервис Яндекс.Вебмастер и получать информацию о статусе индексирования»

    • Указать Callback URI

  • Получить ID приложения и пароль, которые будут использоваться для OAuth-авторизации

  • Убедиться, что сайты подтверждены в Яндекс.Вебмастер, так как API возвращает данные только для верифицированных сайтов

Получение OAuth-токена

Для работы с API необходимо получить токен доступа. Процесс авторизации состоит из нескольких этапов:

php
$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
<?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();
}

Хотите освоить SQL для работы с данными?

В SQLka можно изучать SQL последовательно или готовиться к собеседованиям. Запросы выполняются прямо в браузере — устанавливать базу данных не нужно.

sqlka.ru

support@sqlka.ru

Дальше по теме

← Все статьи