После отправки формы я очищаю содержимое с веб-сайта. Проблема в том, что скрипт терпит неудачу, время от времени, скажем, 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 из-за настройки javascript этими куки?
Вопрос 3. Каков наилучший способ обработки файлов cookie, чтобы убедиться, что все необходимые файлы cookie отправляются на удаленный сервер?
Ваша помощь очень приветствуется!
Если файл 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 создается через javascrript, тогда вам нужно проследить его, как его сгенерировать, а затем вы можете отправить его с помощью вышеуказанного метода (через http-заголовок).
utma utmc, utmz
видны, когда файлы cookie отправляются из Mozilla. Вы не должны больше беспокоиться об этом.
Наконец, то, как вы делаете, в порядке. Просто убедитесь, что вы используете абсолютный путь для имен файлов (например, /var/dir/cookie.txt
) вместо относительного.
Всегда включайте подробный режим работы с завихрением. Это поможет вам в отслеживании запросов. Также это сэкономит много вашего времени.
curl_setopt($ch, CURLOPT_VERBOSE, true);