V
V
Valery2016-02-05 14:14:34
API
Valery, 2016-02-05 14:14:34

How to get Yandex.Direct statistics via API?

Hello. It took a long time, but it did not work out to solve one issue.
The task is to get statistics from Yandex.Direct. I use the API ( https://tech.yandex.ru/direct/doc/dg-v4/examples/p...
I'm trying to connect using a token that I successfully received using this code:

<?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"];
  }

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

* - example taken from habr .
Great, the token has been received - it remains to send a request indicating the method I need:
<?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>';

As a result I get:
Array
(
    [error_str] => Authorization error
    [error_code] => 53
    [error_detail] => 
)

Tell me where to dig, what could be the problem?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
N
Novomir Lobanov, 2016-12-01
@novomir

Thanks for the first part with the token, I spent two days on the second, but in the end I figured out how to send requests, here is the simplest example for getting a list of companies. For those who are also looking, catch a gift:

$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'];

You can read about the fields here: https://tech.yandex.ru/direct/doc/ref-v5/campaigns...
Important points
- "Bearer" is required)
- in the "header" pay attention to line breaks
- an array with the parameters should be 'params'
- it is also important to pass the login in the
Skype header - novomir.lobanov

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question