Задать вопрос
supervaleha
@supervaleha
Web-development

Как получить статистику Яндекс.Директ по API?

Привет. Провозился долго, но так и не получилось решить один вопрос.

Задача стоит в получении статистики с Яндекс.Директ. Использую API (https://tech.yandex.ru/direct/doc/dg-v4/examples/p...

Пытаюсь подключаться по token, который успешно получил, используя вот этот код:
<?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"];
	}

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

* - пример взят с habr.

Отлично, токен получен - осталось отправить запрос с указанием нужного мне метода:

<?php
error_reporting( E_ALL ) ;
$token='token с предыдущего примера';


function getBallance() {
   
    $method = 'GetSummaryStat';
    $params = array(
    	'CampaignIDS'	=>	array( (int)ID_КОМПАНИИ ),
    	'StartDate'		=>	'2016-01-01',
    	'EndDate'		=>	'2016-02-01',
	);
   
    function utf8($struct) {
        foreach ($struct as $key => $value) {
            if (is_array($value)) {
                $struct[$key] = utf8($value);
            }
            elseif (is_string($value)) {
                $struct[$key] = utf8_encode($value);
            }
        }
        return $struct;
    }
 
    $request = array(
        'token'=> $token,
        'method'=> $method,
        'param'=> utf8($params),
        'locale'=> 'ru',
    );
   
    $request = json_encode($request);
   
    $opts = array(
        'http'=>array(
            'method'=>"POST",
            'content'=>$request,
        )
    );
   
    $context = stream_context_create($opts);
   
    $result = file_get_contents('https://api.direct.yandex.ru/v4/json/', 0, $context);
   
    $json = json_decode($result,true);
 
    return $json;
}

echo '<pre>';
print_r( getBallance() );
echo '</pre>';


В итоге получаю:
Array
(
    [error_str] => Authorization error
    [error_code] => 53
    [error_detail] => 
)


Подскажите, куда копать, в чем может быть проблема?
  • Вопрос задан
  • 3970 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
novomir
@novomir
Landing Page, CRM, Support
Спасибо за первую часть с токеном, на вторую потратил два дня, но в итоге разобрался как посылать запросы, вот простейший пример для получения списка компаний. Для тех, кто также ищет, ловите подарок:

$request = array(
    'method' => 'get',
    'params' => [
        'SelectionCriteria' => [
            "Statuses" => ["ACCEPTED"]
        ],
        'FieldNames' => [
                "Id",
                "Name"
            ]
     ]);
$request = json_encode($request);
$opts = array(
    'http' => array(
        'method' => "GET",
        'header' => "Authorization: Bearer AQAAAAAXnbgDAxxxxxxxxx\n" .
                "Accept-Language: ru\n" .
                "Client-Login: login\n" .
                "Content-Type: application/json; charset=utf-8",
        'content' => $request,
    )
);
$context = stream_context_create($opts);
$result = file_get_contents('https://api-sandbox.direct.yandex.com/json/v5/campaigns', 0, $context);


$result = json_decode($result, TRUE);
$campaigns =  $result['result']['Campaigns'];


Про поля можно прочитать вот здесь: https://tech.yandex.ru/direct/doc/ref-v5/campaigns...
Важные моменты
- "Bearer" обязательно)
- в "header" обращаем внимание на переносы строк
- массив с параметрами должен быть 'params'
- логин тоже важно передавать в header

Скайп - novomir.lobanov
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы