Вытащить из яндекс список популярных страниц.

Была задача, составить список популярный страниц на сайте и вывести их как рекомендованные для пользователя.

На сайте стоит яндекс метрика, а яндекс через api предлагает получить список популярных страниц.

 

Написал две функции, которые справляются с поставленной задачей.

 

 

// отправляем запрос курлом
function getTokenYandex2($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);
}


function getInfoYandex($token){


    $startTime = strtotime(date('Y-m-d')." -1 month");
    $startTime=date("Ymd",$startTime);

    $ch = curl_init( 'http://api-metrika.yandex.ru/stat/content/popular?id=____ID___5&per_page=500&date1='.$startTime.'&date2='.date('Ymd', time()));

    // получать заголовки
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    // если ведется проверка HTTP User-agent, то передаем один из возможных допустимых вариантов:
    curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');
    // авторизация в яндекс по токену
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth '.$token, 'Accept: application/x-yametrika+json', 'Content-Type: application/x-yametrika+json'));
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10 );
    curl_setopt ($ch, CURLOPT_TIMEOUT, 10 );
    // возвращать результат работы
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    // не проверять SSL сертификат
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    // не проверять Host SSL сертификата
    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    // следовать редиректу
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
    // выполнить запрос
    curl_exec ($ch);
    // получить результат работы
    $result = curl_multi_getcontent ($ch);

    return json_decode($result);

}


первая функция, getTokenYandex2 для получения токена, у вас должна быть учетка в яндекс метрике.
вторая функция getInfoYandex возвращает массив из списка популярных страниц.

 

Все это вызывается вот так:

 

 

// вызываем функцию получения токена
$result=getTokenYandex2("https://oauth.yandex.ru/token",
    array(
        'grant_type'=> 'password', // тип авторизации
        'username'=> '_____ВАШ__ЛОГИН________',
        'password'=>'______ВАШ_ПАРОЛЬ_____________',
        'client_id'=>'_____КЛИЕНТ_ID__ПОЛУЧАЕМ_В_ЯНДЕКС_API___________',
        'client_secret'=>'______ПОЛУЧАЕМ_В_ЯНДЕКС_API___________',
    ),
    array('Content-type: application/x-www-form-urlencoded','Connection: close')
);



$token=json_decode($result['response']);
// спрашиваем у яндекса, какие страницы популярны
$listPageYandex=GetInfoYandex($token->access_token);

в итоге у нас массив из популярных страниц, дальше находил эти страницы в bitrix и менял им вес.

PS. Список популярных страниц запрашивается за последний месяц.

 

 

PPS.

В начале я не понял, как получить токен автоматом. Везде на яндекс было написано, что пользователь вроде сам попадает на страницу авторизации яндекса, и там авторизуется, а тебе кэлбеком возвращается токен.

Замутил даже на сокете авторизацию :)

 

 

$sock=fsockopen('ssl://oauth.yandex.ru', 443);	// curl замена
$fields="grant_type=password&username=LOGIN&password=PASSWORD&client_id=400000000000000000000000000000&client_secret=4000000000000000000003";
$msg="POST /token HTTP/1.1\r\nHost: oauth.yandex.ru\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nContent-Length: ".(strlen($fields))."\r\n\r\n".$fields."\r\n\r\n\r\n";
fwrite($sock, $msg);
$resp='';
while (!feof($sock)) {
    $resp.=fgets($sock, 128);
};
fclose($sock);
$arr=Array();
preg_match_all("/{.*?}/", $resp, $arr);
$json=json_decode($arr[0][0]);
var_dump($json);

Это в принципе работает, но курлом как то правильнее что-ли.
Тут кстати есть подводные камни, сервер яндекс все никак не хотел закрывать соединения, пока не добавил Connection: close.