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

Как правильно получить данные с открытого API Едадил?

Добрый день. Пытаюсь получить данные промокодов из https://edadeal.ru/coupons
Вижу, что в запросах есть авторизация, копирую куки и заголовки, которые получил от браузера, делаю несколько запросов.
Сначала на получите uid купона, потом на запрос к этому uid, после на получение самого промокода, выглядит так:
$unix_time = round(microtime(true) * 1000);
$unix_time_short = substr($unix_time, 0, -3);

$url = "https://teleport.edadeal.ru/wallet/v2/campaigns";

$ch = curl_init($url);

$headers = [
    "Accept: application/json",
    "Accept-Encoding: gzip, deflate, br",
    "Accept-Language: ru",
    "Connection: keep-alive",
    "Content-Type: application/json",
    "Cookie: edadeal_auth=\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJkdWlkIjoiNWYxNTI1YTQtZjI0Ni00ODg2LWIxMzgtZmUzYjNkYTA4NjVjIiwiYXVkIjoidXNyIiwiZXhwIjoxNzI3Mzc5NjMyLCJqdGkiOiI1MWY4MDFmZS1hNzdjLTRiYTMtYWMxOS1iZTllMmJiMTFmYWMiLCJpYXQiOjE2OTU5MzAwMzIsImlzcyI6Imh0dHBzOi8vdXNyLmVkYWRlYWwucnUiLCJuYmYiOjE2OTU5MzAwMzIsInN1YiI6Imh0dHBzOi8vdXNyLmVkYWRlYWwucnUifQ.MmgCL-oYHOeiGT0e3EWDIxK5PxY1nS_wg_19cpBgvpsn_nMlEwmAjUdk_YNHW1mkgEJyAR_qXsX2ktqpzTxXLFgoIMVqX5Agy86hGxEZPE-yT8CH8BhlceFhlVKK5inTc2hdr7pUJIW7Xy6rGzOqQpuXM5MdqO-1gmVg2XWfFfc\"",
    "edid=\"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJkdWlkIjoiNWYxNTI1YTRmMjQ2NDg4NmIxMzhmZTNiM2RhMDg2NWMiLCJ2cnQiOjEsImV4cCI6MTk5NzcyNTIyNywibmJmIjoxNjk1OTMwMDA3fQ.zFgc7NaFdW_dU8bGRHHv48UMgWNi9p75MA-jjDi90ENzvjQuCsRlB5jOLwE_e9OxcwfLibH9waA4J-JOTHYlGFKgDGXnb2-w_9MSE7Sqo8iJExBxRuylhj4L4P8d-8xiG8IiyI0tP00ZsfNPYW8yZ_09dZET47XnX3beBAFxXDw\"",
    "i=\"6xchFu1B3MkcliUfYMhZGAV9YVP+PrJxvcwBCVbOvf3a/hLsjjmphVAJKMOIJop3myz4AtnzDjyIxSmAHn9V7WQHL3A=\"",
    "mda2_beacon=\"$unix_time\"",
    "sessar=\"1.1182.CiADNPm1WoeEFUve75ydQwDnFUp4iX5DAP1hIMxK38QOwg.I5Fbj2iEj7VysHpwQ5ADryqrctWQBT0L4wqTmH2SKo0\"",
    "Session_id=\"noauth:$unix_time_short\"",
    "sso_status=\"sso.passport.yandex.ru:synchronized_no_beacon\"",
    "yandex_login=\"\"",
    "yandexuid=\"154937764".$unix_time_short."\"",
    "ys=\"c_chck.754076172\"",
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0",
    "Host: teleport.edadeal.ru",
    "Origin: https://edadeal.ru",
    "Referer: https://edadeal.ru/",
    "x-app-id: edadeal",
    "x-app-version: 1.56.0",
    "x-locality-geoid: 213",
    "x-os-version: 1.0.0",
    "x-platform: desktop",
    "x-position-latitude: 55.755863",
    "x-position-longitude: 37.6177"    
];

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);

curl_close($ch);

// Выводим результат
if ($response === false) {
    echo "Ошибка при выполнении запроса: " . curl_error($ch);
} else {
    $responseData = json_decode($response, true);
    if ($responseData === null or count($responseData['campaigns']) <= 10) {
        echo "Ошибка при разборе JSON-ответа или пустой ответ, нет данных в campaigns.";
    } else {
        echo "<pre>";

        // Цикл для выполнения запросов
        for ($x = 0; $x < 1; $x++) {
            $slug = $responseData['campaigns'][$x]['slug'];
            $secondUrl = "https://teleport.edadeal.ru/wallet/v2/campaigns/{$slug}?seo=1";
        
            $ch = curl_init($secondUrl);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        
            $get_kupon = json_decode(curl_exec($ch), true);
            curl_close($ch);
            
            $thirdUrl = "https://teleport.edadeal.ru/wallet/v2/campaigns/{$slug}/code";
            
            $ch = curl_init($thirdUrl);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            // curl_setopt($ch, CURLOPT_POST, true);
            // curl_setopt($ch, CURLOPT_POSTFIELDS, '');
            
            $get_promocode = json_decode(curl_exec($ch), true);
            curl_close($ch);
            
            print_r($get_promocode);

            if (!isset($get_promocode['items']) and !isset($get_promocode['items'][0]['params']['value'])) {
                continue;
            }

            $brand_name = mb_convert_case($get_kupon['partner']['name'], MB_CASE_TITLE, "UTF-8");
            $logo_img = $get_kupon['partner']['imageUrl'];
            $category = $get_kupon['partner']['type'];
            $title = $get_kupon['title'];
            $start_promo = date("d.m.Y", $get_kupon['dateStart'] / 1000);
            $end_promo = date("d.m.Y", $get_kupon['dateEnd'] / 1000);
            $seo_title = transliterate($title);
            $seo_brand = transliterate($brand_name);
            $promocode = $get_promocode['items'][0]['params']['value'];
            
            echo "
            Бренд: ".$brand_name."
            Лого: ".$logo_img."
            Категория: ".$category."
            Название купона: ".$title."
            Начало промо: ".$start_promo."
            Конец промо: ".$end_promo."
            Промокод: ".$promocode."
            ";
            
            echo "
            Seo Title: ".$seo_title."
            Brand Title: ".$seo_brand."
            ";
        }
    }
}

Запрос на получение промокда (нажатие на кнопку "Показать промокод") идёт методом POST без параметров и выглядит так:
6516cd5fd3b28103968732.png
6516cd6be0abf415550518.png
Отправляя POST запрос с $headers которые выше, я получаю пустоту или ошибку 401, когда как. Не пойму почему. Подскажите пожалуйста, как правильно передавать данные, чтобы получить положительный ответ от сервера

Если зайти с браузера и запросить промокод через браузера, а потом отправить запрос (на скрине) методом GET сюда https://teleport.edadeal.ru/wallet/v2/campaigns/sk... то я получаю JSON вместе с промокодом, если я до этого не запрашивал с браузера промокод, то после отправки GET запроса я получаю положительный ответ от сервера, но там не будет данных о промокоде.
  • Вопрос задан
  • 420 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Это не открытое api, а внутренее (aka приватное).
Технически использование его сродни парсингу сайта, с чем владельцы сайта как правило борятся.
Соотв-но ваше "когда-как" может быть просто следствие работы антиспам системы.

В остальном все советы и принципы такие же как при написании любого парсера
1. Правильно повторяем все запросы к сайту, не теряя по пути загловки, куки, поля с данными, параметры запросов
2. Ставим разумную задержку между запросами sleep/usleep
3. Используем прокси при необходимости
Ответ написан
Ваш ответ на вопрос

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

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