@siroper

Как передать cookie в curl на php страницу с json ответом?

Имеется сайт с определенными данными, который в личном кабинете пользователя выводятся в модальном окне (ajax). В личный кабинет соответственно попадаем после авторизации. В js скриптах я нашел путь к PHP файлу, с которого выводятся данные через ajax.

Теперь я первым делом curl прохожу авторизацию (успешно):
function send_post_get_cookie($URL='', $PostData=Array(), $cookie='')
  {
    if (strlen($URL)<=0) return false;
    $ua = 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 MRA 5.7 (build 03796) Firefox/3.6.13';
    $ch = curl_init($URL);
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1); 
    curl_setopt($ch, CURLOPT_USERAGENT, $ua);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $PostData);
    if (strlen($cookie)>0)
      curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    $result = curl_exec($ch);
    curl_close($ch);
    
    $lines = explode("\n", $result);
    
    for ($i=0, $cnt=count($lines); $i<$cnt; $i++) 
      if (strpos($lines[$i], 'Set-Cookie:') !== FALSE)
        $cookie .= substr($lines[$i], strpos($lines[$i], 'Set-Cookie:')+strlen('Set-Cookie:')); 
    return $cookie;
  }


Далее пытаюсь curl + post отправить сессию и post данные на этот самый PHP файл (например https://site.ru/js/dannye.php) но как не стараюсь - пишет что сессия устарела или-же 400 bad request...

function open($URL='', $cook='')
{
    $ua = 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 MRA 5.7 (build 03796) Firefox/3.6.13';
    $ch = curl_init($URL);
    curl_setopt($ch, CURLOPT_USERAGENT, $ua);
    curl_setopt($ch, CURLOPT_COOKIE, $cook);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, array(
        'page'=>'1'
    ));
    $answer = curl_exec($ch);
    curl_close ($ch);
    return $answer;
}


Запускаю все это дело таким образом:
$cookie = send_post_get_cookie('https://site.ru/login.php', array(
		'user'=>'test@test.ru',
		'password'=>'12345'
	));
	
	open('https://site.ru/js/dannye.php',$cookie);


Но постоянно пишет что сессия истекла, как только не пробовал. В чем моя ошибка?

Request Headers из браузера
:::::::::::::::::::::LOGIN
Request Headers:

POST /login.php HTTP/1.1
Host: sitename.ru
Connection: keep-alive
Content-Length: 72
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: https://sitename.ru
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 OPR/70.0.3728.106
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://sitename.ru/login.php
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: PHPSESSID=i99n3d2s6v1oibcsdp4vpa9rs2; skin=1



:::::::::::::::::::::MODAL
Request Headers:

Accept: */*
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: 81
Content-Type: application/x-www-form-urlencoded
Cookie: skin=1; PHPSESSID=i99n3d2s6v1oibcsdp4vpa9rs2; skin=1
Host: sitename.ru
Method: POST /js/dannye.php HTTP/1.1
Origin: https://sitename.ru
Referer: https://sitename.ru/main.php
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/84.0.4147.105 Safari/537.36 OPR/70.0.3728.106
  • Вопрос задан
  • 3691 просмотр
Решения вопроса 1
kocherman
@kocherman
Зачем вы анализируете куки самостоятельно?

Когда вы делаете запрос и хотите чтобы curl сохранил куки, вы ставите вот это:
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');
Когда вы делаете запрос и хотите чтобы curl передал серверу эти сохраненные куки, вы пишете вот это:
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt');

Их можно использовать вместе.

То есть первый запрос делается с
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');

А все последующие начиная со второго запроса
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt');

Тогда curl будет читать и записывать в один и тот же файл
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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