Задать вопрос

Как отправить в API Яндекс.Метрику данные о звонках?

На основе документации https://tech.yandex.ru/metrika/doc/api2/management... пытаюсь загрузить в яндекс метрику данные из примера:

UserId,DateTime,Price,Currency,PhoneNumber,TalkDuration,HoldDuration,CallMissed,Tag,FirstTimeCaller,URL,CallTrackerURL
133591247640966458,1481714026,678.90,RUB,+71234567890,136,17,0,,1,https://test.com/,https://test.com/
579124169844706072,1481718066,123.45,RUB,+70987654321,17,23,0,,2,https://test.com/,https://test.com/

Делаю вот так с помощью cURL:

$token  = "AAAAAAAAA";
    $counter_id = "XXXXXXXXXXXX";

    $url = 'https://api-metrika.yandex.ru/management/v1/counter/' . $counter_id . '/offline_conversions/upload_calls?client_id_type=USER_ID&oauth_token=' . $token;

    $file = "csv.csv";

    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: text/csv']);

    $cfile = new CurlFile($file,  'text/csv');
    $data = array('data-binary' => $cfile);

    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $curl_response = curl_exec($curl);

    curl_close($curl);
    
    return $curl_response;


В тексте документации сказано: Данные передаются как multipart/form-data, в формате CSV, в первой строке необходимо передать названия колонок.". Но как передать сначала первую строку с названиями колонок? Где я думаю не правильно?)
  • Вопрос задан
  • 1723 просмотра
Подписаться 1 Средний 2 комментария
Решения вопроса 1
@marxxt
понравился ответ - поставь ✔
А, вы вынесли в отдельный вопрос)

Вобщем, StaticCall,UserId - обязательные колонки

Заголовки
Content-Type: multipart/form-data; boundary=------------------------boundary
Content-Length: 12345


Тело
--------------------------boundary\r\n
Content-Disposition: form-data; name="file"; filename="file.csv"\r\n
Content-Type: text/csv\r\n\r\n
ДАННЫЕ\r\n\r
--------------------------boundary--


Пример(для curl все тоже самое)
function request($url, $data, $headers){
  $opt = array(
    'http' => array(
      'method' => 'POST',
      'content' => $data,
      'header' => $headers
    )
  );

  $context = stream_context_create($opt);

  $response = @file_get_contents($url, FALSE, $context);
  
  return $response;
  
}

$oauth_token='xxx';
$boundary = "7zDUQOAIAE9hEWoV";
$filename = 'data.csv';

$calls = "StaticCall,UserId,DateTime,Price,Currency,PhoneNumber,TalkDuration,HoldDuration,CallMissed,Tag,FirstTimeCaller,URL,CallTrackerURL".PHP_EOL;
$calls .= "1,133591247640966458,1481714026,678.90,RUB,+71234567890,136,17,0,,1,https://test.com/,https://test.com/".PHP_EOL;
$calls .= "1,579124169844706072,1481718066,123.45,RUB,+70987654321,17,23,0,,2,https://test.com/,https://test.com/".PHP_EOL;
$calls .= "1,148059425477661429,1481718126,678.90,RUB,+71234509876,72,11,0,,0,https://test.com/,https://test.com/";

$data = "--------------------------$boundary\x0D\x0A";
$data .= "Content-Disposition: form-data; name=\"file\"; filename=\"$filename\"\x0D\x0A";
$data .= "Content-Type: text/csv\x0D\x0A\x0D\x0A";
$data .= $calls . "\x0A\x0D\x0A";
$data .= "--------------------------$boundary--";


$headers = array();
$headers[] = "Content-Type: multipart/form-data; boundary=------------------------$boundary";
$headers[] = 'Content-Length: '.strlen($data);
$headers = implode(PHP_EOL, $headers);

$url = "https://api-metrika.yandex.ru/management/v1/counter/39764535/offline_conversions/upload_calls?client_id_type=USER_ID&oauth_token=$oauth_token";

$result = request($url, $data, $headers);

var_dump($result);


Для curl типа того
CURLOPT_POSTFIELDS => $data
CURLOPT_HTTPHEADER => array(
    "Content-Type: multipart/form-data; boundary=------------------------$boundary",
    "Content-Length: " . strlen($data)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
21 дек. 2024, в 06:04
15000 руб./за проект
21 дек. 2024, в 01:12
1000 руб./за проект
20 дек. 2024, в 22:55
1500 руб./за проект