Answer the question
In order to leave comments, you need to log in
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"];
}
// Токен можно кинуть в базу, связав с пользователем, например, а за пару дней до конца токена напомнить, чтобы обновил
<?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] =>
)
Answer the question
In order to leave comments, you need to log in
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'];
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question