Задать вопрос
drekon
@drekon
web-developer

Как выгрузить csv в яндекс аудиторию через API?

Добрый день! Стоит задача на php создать сегмент в яндекс аудитории. В апи яндекса описана вот такая инструкиция https://yandex.ru/dev/audience/doc/segments/upload...

Делаю отправку файла через библиотеку https://github.com/mervick/curl-helper
$output = CurlHelper::factory(self::API . "management/segments/upload_csv_file")
            ->setHeaders([
                'Content-type'  => CurlHelper::MIME_FORM_DATA,
                'Authorization' => 'OAuth ' . $this->OAuthToken,
            ])
            ->putFileRaw(basename($file), file_get_contents($file), basename($file), 'application/octet-stream')
            ->exec();


Возвращает ошибку "error_type":"invalid_uploading","message":"Некорректный формат multipart запроса."

Файл более 1000 строк, содержит столбцы external_id,phone,email разделённые запятой.

Может кто сталкивался, что посоветуете?
  • Вопрос задан
  • 402 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
drekon
@drekon Автор вопроса
web-developer
Помог отказ от использования библиотеки и использование следующего кода
class Curl
{

    /**
     * Отправить файл
     * @param string $url
     * @param string $pathToFile
     * @param string $type
     * @param array  $headers
     * @return false|string
     */
    public static function sendFile(string $url, string $pathToFile, string $type = 'text/plain', array $headers = [])
    {
        $boundary = uniqid();
        $filename = basename($pathToFile);

        $calls = join(PHP_EOL, explode("\n", file_get_contents($pathToFile)));

        $data = "--------------------------{$boundary}\x0D\x0A";
        $data .= "Content-Disposition: form-data; name=\"file\"; filename=\"{$filename}\"\x0D\x0A";
        $data .= "Content-Type: {$type}\x0D\x0A\x0D\x0A";
        $data .= $calls . "\x0A\x0D\x0A";
        $data .= "--------------------------{$boundary}--";

        $headers['Content-Type'] = "multipart/form-data; boundary=------------------------{$boundary}";
        $headers['Content-Length'] = strlen($data);

        $resHeaders = [];
        foreach ($headers as $key=>$head) {
            $resHeaders[] = $key . ': ' . $head;
        }

        return self::request($url, $data, $resHeaders);
    }

    /**
     * Запрос
     * @param string $url
     * @param string $data
     * @param array  $headers
     * @param string $method
     * @return false|string
     */
    public static function request(string $url, string $data, array $headers, string $method = 'POST')
    {
        $opt = [
            'http' => [
                'method'  => $method,
                'content' => $data,
                'header'  => join(PHP_EOL, $headers),
            ],
        ];

        $context = stream_context_create($opt);

        return file_get_contents($url, false, $context);
    }

}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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