Подтвердить что ты не робот

Как отправить cookie с помощью PHP curl в дополнение к CURLOPT_COOKIEFILE?

Я читаю содержимое с веб-сайта после отправки формы. Проблема в том, что script терпит неудачу, время от времени, скажем, 2 раза из 5, сбой script. Я использую 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 из-за того, что javascript устанавливает эти файлы cookie?

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

Ваша помощь очень приветствуется!

4b9b3361

Ответ 1

Если файл cookie создан из script, вы можете отправить 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);