Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как правильно отправить POST запрос ?


Автор: Sice 9.10.2023, 11:56
Добрый день. Пытаюсь отправить POST запрос на другой сайт, через cURL. Адрес https://promokod.pikabu.ru/coupon/5ka/Lty7boqhMLLy хочу получить ответ в котором есть json, оттуда вытащить ключ promocode.

Предполагаю, что требуется для начала получить куки. Захожу на страницу и получаю куки, пытаюсь отправить POST, но в ответ получаю ошибку { "message": "CSRF token mismatch." }.

Делаю так:
Код

<?php
// Инициализация cURL-сессии для GET-запроса страницы и извлечения CSRF-токена
$ch = curl_init();
 
// Установка параметров cURL-сессии для GET-запроса
curl_setopt($ch, CURLOPT_URL, 'https://promokod.pikabu.ru/shops/5ka');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
 
// Выполнение GET-запроса
$response = curl_exec($ch);
 
// Закрытие cURL-сессии
curl_close($ch);
 
// Парсинг страницы для извлечения CSRF-токена
preg_match('/<meta name="csrf-token" content="(.+?)">/', $response, $matches);
if (isset($matches[1])) {
    $csrf_token = $matches[1];
} else {
    die("CSRF-токен не найден");
}
 
// Заголовки для POST-запроса
$headers = [
    "Accept: application/json, text/plain, */*",
    "Accept-Encoding: gzip, deflate, br",
    "Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7",
    "Connection: keep-alive",
    "Content-Length: 2",
    "Content-Type: application/json;charset=UTF-8",
    "Cookie: pcid=4yDnaZt3zv2; ...",
    "DNT: 1",
    "Host: promokod.pikabu.ru",
    "Origin: https://promokod.pikabu.ru",
    "Referer: https://promokod.pikabu.ru/shops/5ka",
    "Sec-Fetch-Dest: empty",
    "Sec-Fetch-Mode: cors",
    "Sec-Fetch-Site: same-origin",
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
    "X-Requested-With: XMLHttpRequest",
    "X-XSRF-TOKEN: " . $csrf_token
];
 
// Инициализация cURL-сессии для POST-запроса
$ch = curl_init();
 
// Установка параметров cURL-сессии для POST-запроса
curl_setopt($ch, CURLOPT_URL, 'https://promokod.pikabu.ru/coupon/5ka/Lty7boqhMLLy');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([])); // Данные запроса (пустой JSON в данном случае)
 
// Выполнение POST-запроса
$response = curl_exec($ch);
 
// Закрытие cURL-сессии
curl_close($ch);
 
// Обработка ответа от сервера
echo $response;
?>

Заголовки запроса, которые посылает браузер:
https://habrastorage.org/webt/65/1f/97/651f9784333eb781392808.png

В итоге я получаю ошибку 419 Page Expired.
https://habrastorage.org/webt/... 477059.png

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)