- PVSM.RU - https://www.pvsm.ru -
Каждый, кто отслеживает изменения отношения Яндекса к его сайту, знает о таком полезном сервисе Яндекса, как Яндекс.Вебмастер [1], но не многие знают, что сейчас появилась возможность автоматизировать этот процесс при помощи взаимодействия с API.
Т.к. я занимаюсь и разработкой и последующим продвижением сайтов, а продвигаемых сайтов довольно много, я сразу же уцепился за возможность автоматизировать процесс получения статистики с Яндекс.Вебмастера.
Во-первых, мы получаем все данные, даже если забыли это сделать или на это не было времени, ежедневно, ежечасно или еще чаще.
Во-вторых, работая через API, мы можем создать свой интерфейс просмотра данных, сделав его более удобным для себя.
Хотя документация [2] по данному API на Яндексе существует, и даже снабжена примерами, лично я не смог «с разбегу» разобраться, что к чему. Поэтому, если вам также интересна эта тема, прошу под кат.
Начать свое знакомство с API Яндекс.Вебмастер нужно с регистрации [3] на Яндексе. Когда мы уже авторизованы, мы можем зарегистрировать свое «Приложение». В дальнейшем оно нам потребуется, чтобы получать токены пользователей, сайты которых мы хотим мониторить. Зарегистрировать новое приложение можно здесь [4].
Немного про регистрацию.
Если вы не ставили галочку на втором пункте, то ваше приложение зарегистрировано и готово к использованию.
Список ваших приложений доступен здесь [6].
Зайдя в только что созданное, мы получаем «id приложения» и «пароль приложения», которые нам потребуются.
Если вы решили сразу получить доступ к ссылкам, т.е. отметили и второй пункт, вам нужно будет сделать следующее:
Скачать вот этот документ [7], распечатать его, заполнить, отсканировать и выслать на 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>*/
Статусы и расшифровки ошибок смотреть здесь [8].
Также можно получать данные по внешним ссылкам на сайт, но и они максимально доступны в период «за неделю».
$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 что-нибудь изменится, вы всегда сможете обновить эти ссылки.
Надеюсь, что эта информация была для вас интересной и полезной!
Автоматизируйте свою работу. Чем меньше мы заняты волокитой, тем больше у нас времени на творчество. И наших близких!
Автор: Bigbad
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/19408
Ссылки в тексте:
[1] Яндекс.Вебмастер: http://webmaster.yandex.ru/
[2] документация: http://api.yandex.ru/webmaster/doc/dg/concepts/About.xml
[3] регистрации: http://passport.yandex.ru/
[4] здесь: http://oauth.yandex.ru/client/new
[5] domen.ru/token/: http://domen.ru/token/
[6] здесь: http://oauth.yandex.ru/client/my
[7] этот документ: http://webmaster.yandex.ru/docs/uvedomlenie.pdf
[8] смотреть здесь: http://api.yandex.ru/webmaster/doc/dg/reference/errors.xml
[9] Источник: http://habrahabr.ru/post/157753/
Нажмите здесь для печати.