Как я могу отправлять файлы cookie с помощью PHP curl в дополнение к ФАЙЛУ cookie CURLOPT?


Я удаляю некоторый контент с веб-сайта после отправки формы. Проблема в том, что сценарий время от времени выходит из строя, скажем, в 2 случаях из 5 сценарий выходит из строя. Я использую php curl, COOKIEFILE и COOKIEJAR для обработки файлов cookie. Однако, когда я наблюдал за отправленными заголовками моего браузера (при посещении целевого веб-сайта из моего браузера и использовании живых заголовков http) и заголовками, отправленными php, и увидел, что есть много различий.

Мой браузер отправил намного больше файлов cookie переменные, чем php curl. Я думаю, что это различие может быть связано с тем, что javascript отвечает за установку большинства файлов cookie, однако я не уверен в этом.

Я использую приведенный ниже код для очистки и показываю отправленные заголовки моего браузера и php curl:

$ckfile = tempnam ("/tmp", 'cookiename');

$url = 'https://www.domain.com/firststep';
$poststring = 'variable1=4&variable2=5';
$ch = curl_init ($url);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststring);
$output = curl_exec ($ch);
curl_close($ch);



$url = 'https://www.domain.com/nextstep';
$poststring = 'variableB1=4&variableB2=5';
$ch = curl_init ($url);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststring);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$output = curl_exec ($ch);
$headers = curl_getinfo($ch, CURLINFO_HEADER_OUT);
curl_close($ch);

print_r($headers);

// Gives:
POST /d-cobs-web/doffers.html;jsessionid=7BC2A5277A4EB07D9A7237A707BE1366 HTTP/1.1
User-Agent: Mozilla
Host: domain.subdomain.nl
Accept: */*
Cookie: JSESSIONID=7BC2A5277A4EB07D9A7237A707BE1366; www-20480=MIFBNLFDFAAA
Content-Length: 187
Content-Type: application/x-www-form-urlencoded

// Where live http headers gives:
POST /d-cobs-web/doffers.html;jsessionid=7BC2A5277A4EB07D9A7237A707BE1366 HTTP/1.1
Host: domain.subdomain.nl
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: https://domain.subdomain.nl/dd/doffers.html?returnUrl=https%3A%2F%2Fttcc.subdomain.nl%2Fdd%2Fpreferences.html%3FValueChanged%3Dfalse&BEGBA=&departureDate=13-06-2013&extChangeTime=&pax2=0&bp=&pax1=1&pax4=0&bk=&pax3=0&shopId=&xtpage=&partner=NSINT&bc=&xt_pc=&ov=&departureTime=&comfortClass=2&destination=DEBHF&thalysTicketless=&beneUser=&debugDOffer=&logonId=&valueChanged=&iDomesticOrigin=&rp=&returnTime=&locale=nl_NL&vu=&thePassWeekend=false&returnDate=&xtsite=&pax=A&lc2=&lc1=&lc4=&lc3=&lc6=&lc5=&BECRA=&passType2=&custId=&lc9=&iDomesticDestination=&passType1=A&lc7=&lc8=&origin=NLASC&toporef=&pid=&passType4=&returnTimeType=1&passType3=&departureTimeType=1&socusId=&idr3=&xtn2=&loyaltyCard=&idr2=&idr1=&thePassBusiness=false&cid=14812
Content-Length: 219
Cookie: subdomainPARTNER=NSINT; JSESSIONID=CB3FEB3AC72AD61A80BFED91D3FD96CA; www-20480=MHFBNLFDFAAA; campaignPos=5; www-47873=MGFBNLFDFAAA; __utma=1.993399624.1370027094.1370040145.1370082133.5; __utmc=1; __utmz=1.1370027094.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); BCSessionID=5dc05787-c2c8-43e1-9abe-93989970b087; BCPermissionLevel=PERSONAL; __utmb=1.1.10.1370082133
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
AJAXREQUEST=_viewRoot&doffersForm=doffersForm&doffersForm%3AvalueChanged=&doffersForm%3ArequestValid=true&javax.faces.ViewState=j_id3&doffersForm%3Aj_id937=doffersForm%3Aj_id937&valueChanged=false&AJAX%3AEVENTS_COUNT=1&

Я хотел бы использовать:

$headers   = array();
$headers[] = 'Cookie: ' . $cookie;

И:

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

Где:

$cookie = 'subdomainPARTNER=NSINT; JSESSIONID=CB3FEB3AC72AD61A80BFED91D3FD96CA; www-20480=MHFBNLFDFAAA; campaignPos=5; www-47873=MGFBNLFDFAAA; __utma=1.993399624.1370027094.1370040145.1370082133.5; __utmc=1; __utmz=1.1370027094.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); BCSessionID=5dc05787-c2c8-43e1-9abe-93989970b087; BCPermissionLevel=PERSONAL; __utmb=1.1.10.1370082133';

Некоторые параметры в приведенном выше файле cookie я мог бы извлечь из содержимого веб-сайта, но не все. Некоторые из них я мог бы прочитать из файла $ckfile, но я не знаю, как это сделать. Особенно utma utmc, utmz, utmcsr, utmccn, utmcmd, которые я не могу получить ниоткуда, я думаю, что они генерируются javascript.

Вопрос 1: Я делаю что-то не так с обработкой файлов cookie в текущем коде, так как очень мало переменных файлов cookie отправляется php curl и намного больше браузером? Далее: могут ли другие различия между отправленными заголовками браузером и php curl быть проблема с возвратом правильного контента?

Вопрос 2: Являются ли отсутствующие переменные cookie-файлов из-за настройки этих файлов cookie на javascript?

Вопрос 3: Как лучше всего обрабатывать файлы cookie, чтобы убедиться, что все необходимые файлы cookie отправляются на удаленный сервер?

Мы очень рады вашей помощи!

Author: BastiaanWW, 2013-06-01

3 answers

Если файл cookie сгенерирован из сценария, то вы можете отправить файл cookie вручную вместе с файлом cookie из файла (используя опцию cookie-файл). Например:

# sending manually set cookie
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Cookie: test=cookie"));

# sending cookies from file
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);

В этом случае curl отправит определенный вами файл cookie вместе с файлами cookie из файла.

Если файл cookie сгенерирован с помощью javascrript, то вам нужно отследить, как он был сгенерирован, а затем вы можете отправить его с помощью описанного выше метода (через http-заголовок).

utma utmc, utmz отображаются при отправке файлов cookie из Mozilla. Тебе больше не стоит беспокоиться об этих вещах.

Наконец, то, как вы это делаете, в порядке вещей. Просто убедитесь, что вы используете абсолютный путь для имен файлов (т. Е. /var/dir/cookie.txt) вместо относительного.

Всегда включайте подробный режим при работе с curl. Это очень поможет вам в отслеживании запросов. Также это сэкономит много вашего времени.

curl_setopt($ch, CURLOPT_VERBOSE, true);
 57
Author: Sabuj Hassan, 2014-03-07 21:31:15

Я думаю, что единственный файл cookie, который вам нужен, - это JSESSIONID=xxx..

Также НИКОГДА не делитесь своими файлами cookie, потому что кто-то может получить доступ к вашим личным данным таким образом. Особенно, когда файлы cookie являются сессионными. Эти файлы cookie перестанут работать, как только вы выйдете с сайта.

 0
Author: Atanas Atanasov, 2018-01-14 14:22:23

Попробуйте использовать код ниже,

$cookieFile = "cookies.txt";
if(!file_exists($cookieFile)) {
    $fh = fopen($cookieFile, "w");
    fwrite($fh, "");
    fclose($fh);
}


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiCall);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // Cookie aware
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // Cookie aware
curl_setopt($ch, CURLOPT_VERBOSE, true);
if(!curl_exec($ch)){
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch));
}
else{
    $response = curl_exec($ch); 
}
curl_close($ch);
$result = json_decode($response, true);

echo '<pre>';
var_dump($result);
echo'</pre>';

Я надеюсь, что это поможет вам.

С наилучшими пожеланиями, Дасита.

 0
Author: Dasitha Abeysinghe, 2018-09-17 22:28:14