Pull to refresh

Работа с API Яндекс.Вебмастер

Reading time 7 min
Views 41K
Каждый, кто отслеживает изменения отношения Яндекса к его сайту, знает о таком полезном сервисе Яндекса, как Яндекс.Вебмастер, но не многие знают, что сейчас появилась возможность автоматизировать этот процесс при помощи взаимодействия с API.

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

Хотя документация по данному API на Яндексе существует, и даже снабжена примерами, лично я не смог «с разбегу» разобраться, что к чему. Поэтому, если вам также интересна эта тема, прошу под кат.

Начать свое знакомство с API Яндекс.Вебмастер нужно с регистрации на Яндексе. Когда мы уже авторизованы, мы можем зарегистрировать свое «Приложение». В дальнейшем оно нам потребуется, чтобы получать токены пользователей, сайты которых мы хотим мониторить. Зарегистрировать новое приложение можно здесь.

Немного про регистрацию.

  • Название приложения — пишите, что захотите, но лучше, чтобы пользователь, если вы его будете перенаправлять для авторизации, понимал, что это приложение действительно ваше, т.к. авторизовываясь через него, он отдает доступ к некоторым сервисам Яндекса.
  • Описание. По большей части, как мне кажется, это пункт для модераторов Яндекса. Я написал, что данное приложение буду использовать для собственных нужд в бэкофисе различных сайтов.
  • Права. Т.к. авторизация для всех сервисов API Яндекс может быть единой, перечислены они все. Для наших нужд по работе с API Вебмастера нужны следующие: «Добавлять сайты в сервис Яндекс.Вебмастер и получать информацию о статусе индексирования» и " Получать информацию о внешних ссылках на сайт (требуется идентификация)". Как и написано, для второго пункта требуется идентификация. О том, что это такое, чуть позже. Если вы хотите просто потестить сервис, можете пока не включать эту функцию.
  • Ссылку на иконку и ссылку на приложения можно пропустить.
  • Callback URI. Здесь нужно вписать тот адрес, на который Яндекс будет перебрасывать пользователя после авторизации. Именно на этом адресе мы будем получать токен. Токен, кстати говоря, выдается на 180 дней. Так что часто получать его не придется.
    Допустим, что урл, с которого мы отправляем пользователя на авторизацию — domen.ru/token, тогда вписываем в данное поле именно эту ссылку, чтобы получать токен тамже, откуда мы отправили пользователя.


Если вы не ставили галочку на втором пункте, то ваше приложение зарегистрировано и готово к использованию.
Список ваших приложений доступен здесь.
Зайдя в только что созданное, мы получаем «id приложения» и «пароль приложения», которые нам потребуются.

Если вы решили сразу получить доступ к ссылкам, т.е. отметили и второй пункт, вам нужно будет сделать следующее:
Скачать вот этот документ, распечатать его, заполнить, отсканировать и выслать на webmaster-api@yandex-team.ru. У меня приложение прошло модерацию через 4-5 дней.

Приступаем к работе.

Приведу пример на PHP, т.к. у меня все работает именно на нем.

$client_id = "здесь вставляем Id приложения";
$client_secret = "здесь пароль приложения";

// Если мы еще не получили разрешения от пользователя, отправляем его на страницу для его получения
// В урл мы также можем вставить переменную state, которую можем использовать для собственных нужд, я не стал
if (!isset($_GET["code"])) {
	Header("Location: https://oauth.yandex.ru/authorize?response_type=code&client_id=".$client_id);
	die();
	}

// Если пользователь нажимает "Разрешить" на странице подтверждения, он приходит обратно к нам
// $_Get["code"] будет содержать код для получения токена. Код действителен в течении часа.
// Теперь у нас есть разрешение и его код, можем отправлять запрос на токен.

$result=postKeys("https://oauth.yandex.ru/token",
	array(
		'grant_type'=> 'authorization_code', // тип авторизации
		'code'=> $_GET["code"], // наш полученный код
		'client_id'=>$client_id,
		'client_secret'=>$client_secret
		),
	array('Content-type: application/x-www-form-urlencoded')
	);

// отправляем запрос курлом

function postKeys($url,$peremen,$headers) {
	$post_arr=array();
	foreach ($peremen as $key=>$value) {
		$post_arr[]=$key."=".$value;
		}
	$data=implode('&',$post_arr);
	
	$handle=curl_init();
	curl_setopt($handle, CURLOPT_URL, $url);
	curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($handle, CURLOPT_POST, true);
	curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
	$response=curl_exec($handle);
	$code=curl_getinfo($handle, CURLINFO_HTTP_CODE);
	return array("code"=>$code,"response"=>$response);
	}

// после получения ответа, проверяем на код 200, и если все хорошо, то у нас есть токен

if ($result["code"]==200) {
	$result["response"]=json_decode($result["response"],true);
	$token=$result["response"]["access_token"];
	echo $token;
	}else{
	echo "Какая-то фигня! Код: ".$result["code"];
	}

// Токен можно кинуть в базу, связав с пользователем, например, а за пару дней до конца токена напомнить, чтобы обновил



Итак, токен у нас есть. Теперь мы можем заняться получением информации о состоянии сайтов.
Я это покажу в несколько этапов, как-будто мы не имели доступа к какой-либо информации ранее.

$token="наш полученный токен";

// функция, для курления

function get_stat($url,$headers) {
	$handle=curl_init();
	curl_setopt($handle, CURLOPT_URL, $url);
	curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
	$response=curl_exec($handle);
	$code=curl_getinfo($handle, CURLINFO_HTTP_CODE);
	return array("code"=>$code,"response"=>$response);
	}

// при получении результатов, вы можете отслеживать код ответа по $result["code"]

// первый запрос - получение id пользователя по Яндексу.
// В ответ нам придет ссылка типа https://webmaster.yandex.ru/api/123456789, 123456789 - id пользователя
// Можете сохранить себе как сразу ссылку, так и id юзера отдельно

$result=get_stat('https://webmaster.yandex.ru/api/me',array('Authorization: OAuth '.$token));
$user_id=str_replace('https://webmaster.yandex.ru/api/','',$result["response"]);

// далее мы можем запросить сервисный документ, но в чем его смысл я так и не понял.
// возвращается ссылка вида: href="https://webmaster.yandex.ru/api/123456789/hosts, 123456789 - id пользователя
// поэтому получать его не будем, сразу запросим список сайтов

$result=get_stat('https://webmaster.yandex.ru/api/'.$user_id.'/hosts',array('Authorization: OAuth '.$token));
$xml=new SimpleXMLElement($result["response"]);
$hosts_xml=$xml->xpath("host");
$hosts=array();
foreach($hosts_xml as $host) {
	$hosts[(string)$host->name]=
		array(
			"name"=>(string)$host->name,
			"verification_state"=>(string)$host->verification->attributes()->state,
			"crawling_state"=>(string)$host->crawling->attributes()->state,
			"virused"=>(string)$host->virused,
			"last-access"=>(string)$host->{'last-access'},
			"tcy"=>(string)$host->tcy,
			"url-count"=>(string)$host->{'url-count'},
			"index-count"=>(string)$host->{'index-count'},
			"href"=>(string)$host->attributes()->href
			);
	}
unset($hosts_xml);
unset($xml);

/* в результате у нас имеется двумерный массив со всеми сайтами и частью их характеристик
ссылку для доступа к сайту также можно хранить целиком, для удобства в будущем
Array (
	[domen] => Array ( 
		[name] => domen - доменное имя
		[verification_state] => VERIFIED - статус подтверждения прав на управление доменом
		[crawling_state] => INDEXED - статус индексирования
		[virused] => false - наличие обнаруженных вирусов на сайте
		[last-access] => 2012-11-06T22:54:10 - последний доступ робота к сайту
		[tcy] => 150 - ТИЦ
		[url-count] => 7458 - количество забранных урлов
		[index-count] => 6131 - количество урлов в индексе
		[href] => https://webmaster.yandex.ru/api/id пользователя/hosts/id сайта - ссылка для доступа к статистике сайта
		)
	)
*/
// пробуем запросить полную статистику по сайту
// в ответе придет xml, которая уже содержит информацию, полученную до этого, так что берем только то, чего у нас нет

$site_href="https://webmaster.yandex.ru/api/654321/hosts/123456"; // 654321 - user_id, 123456 - site_id
$result=get_stat($site_href."/stats",array('Authorization: OAuth '.$token));
$xml=new SimpleXMLElement($result["response"]);
$errors=(string)$xml->{'url-errors'}; // количество страниц с ошибками
$internal-links=(string)$xml->{'internal-links-count'}; // количество внутренних ссылок
$links=(string)$xml->{'links-count'}; // количество внешних входящих ссылок
unset($xml);


Также, мы можем получить информацию по проиндексированным и исключенным страницам, получив урлы, но, к сожалению, данные отдаются только «за прошедшую неделю», а это, можно сказать, отсутствие данных.
Получить эти данные вы сможете по запросам:

$result=curlGet($site_href."/indexed",array('Authorization: OAuth '.$token));
/*
Ответ формата:
<host>
  <index-count>238</index-count>
  <last-week-index-urls>
    <url>http://example.com/page1.html</url>
    <url>http://example.com/page2.html</url>
  </last-week-index-urls>
</host>
*/
$result=curlGet($site_href."/excluded",array('Authorization: OAuth '.$token));
/*
Ответ формата:
<host>
  <url-errors count="12">
    <url-errors-with-code code=”404”>
      <count>12</count>
      <severity>ERROR</severity>
    </url-errors-with-code>
  </url-errors>
</host>*/

Статусы и расшифровки ошибок смотреть здесь.

Также можно получать данные по внешним ссылкам на сайт, но и они максимально доступны в период «за неделю».

$result=curlGet($site_href."/links",array('Authorization: OAuth '.$token));
/*
Ответ формата:
<host>
  <links-count>1436</links-count>
  <last-week-links>
    <url>http://example1.com/page1.html</url>
    <url>http://example2.com/page2.html</url>
  </last-week-links>
</host>*/


Еще Яндекс отдает данные «о популярных запросах», но практика показывает, что по позициям там расхождение очень часто с действительным положением, и данные устаревшие. Так что я не стал даже заморачиваться на этот счет.

Самое главное, что я делаю — собираю раз в 12 часов статистику по всем своим сайтам. Все данные хранятся в базе, а следовательно я имею возможность не только видеть текущее положение дел, но и проводить анализ изменений.

И еще, чтобы не получать каждый раз все данные по сайту заново, лучше хранить ссылки на них в базе. Я имею ввиду $site_url. Если вдруг в API что-нибудь изменится, вы всегда сможете обновить эти ссылки.

Надеюсь, что эта информация была для вас интересной и полезной!
Автоматизируйте свою работу. Чем меньше мы заняты волокитой, тем больше у нас времени на творчество. И наших близких!
Tags:
Hubs:
+6
Comments 8
Comments Comments 8

Articles