2013-06-01 34 views
28

Tôi đang xóa một số nội dung từ một trang web sau khi gửi biểu mẫu. Vấn đề là các kịch bản là không tất cả bây giờ và sau đó, nói rằng 2 lần trong số 5 kịch bản không thành công. Tôi đang sử dụng php curl, COOKIEFILE và COOKIEJAR để xử lý cookie. Tuy nhiên khi tôi quan sát tiêu đề đã gửi của trình duyệt (khi truy cập trang web mục tiêu từ trình duyệt của tôi và sử dụng tiêu đề http trực tiếp) và tiêu đề được gửi bởi php và thấy có nhiều khác biệt.Tôi làm cách nào để gửi cookie bằng cách sử dụng PHP curl ngoài CURLOPT_COOKIEFILE?

Trình duyệt của tôi đã gửi nhiều biến cookie hơn php curl. Tôi nghĩ rằng sự khác biệt này có thể là do javascript là resposible để thiết lập hầu hết các tập tin cookie, tuy nhiên tôi không chắc chắn về điều này.

Tôi đang sử dụng mã dưới đây để làm cạo và tôi thấy các tiêu đề gửi của trình duyệt của tôi và của 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& 

Tôi muốn sử dụng:

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

và :

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

nơi:

$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'; 

Một số thông số trong cookie ở trên tôi có thể xóa nội dung của trang web, nhưng không phải tất cả. Một số người trong số họ tôi có thể đọc từ $ ckfile, nhưng tôi không biết làm thế nào để làm điều đó. Đặc biệt là utma utmc, utmz, utmcsr, utmccn, utmcmd Tôi không thể nhận được từ bất cứ đâu, tôi nghĩ chúng được tạo bởi javascript.

Câu hỏi 1: Tôi có làm gì sai với việc xử lý cookie trong mã hiện tại vì rất ít biến cookie được gửi bởi php curl và nhiều hơn nữa bởi trình duyệt không? Hơn nữa: các khác biệt giữa các tiêu đề được gửi bởi trình duyệt và php curl có phải là một vấn đề để trả về đúng nội dung không?

Câu hỏi 2: Biến số cookie bị thiếu do cài đặt javascript các cookie đó?

Câu hỏi 3: Cách tốt nhất để xử lý cookie để đảm bảo rằng tất cả cookie được yêu cầu sẽ được gửi đến máy chủ từ xa là gì?

Trợ giúp của bạn rất được hoan nghênh!

+0

Bạn đã nhận được bất cứ nơi nào với điều này? Tôi đang gặp vấn đề tương tự - tự hỏi tại sao trình duyệt gửi 3 cookie và curl chỉ gửi 1, mặc dù tệp cookie chứa tất cả 3. – David

+0

Hmmm ... có vẻ như là một vấn đề mà tôi đang gặp phải backpage.com. – TARKUS

Trả lời

54

Nếu cookie được tạo từ tập lệnh, bạn có thể gửi cookie theo cách thủ công cùng với cookie từ tệp (sử dụng tùy chọn tệp cookie). Ví dụ:

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

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

Trong trường hợp này, curl sẽ gửi cookie đã xác định của bạn cùng với cookie từ tệp.

Nếu cookie được tạo thông qua javascrript, thì bạn phải theo dõi nó ra cách tạo ra và sau đó bạn có thể gửi nó bằng phương pháp trên (thông qua http-header).

Các utma utmc, utmz được xem khi cookie được gửi từ Mozilla. Bạn không nên đặt cược lo lắng về những điều này nữa.

Cuối cùng, cách bạn đang làm là ổn.Chỉ cần đảm bảo bạn đang sử dụng đường dẫn tuyệt đối cho tên tệp (ví dụ: /var/dir/cookie.txt) thay vì đường dẫn tương đối.

Luôn bật chế độ tiết khi làm việc với curl. Nó sẽ giúp bạn rất nhiều trên truy tìm các yêu cầu. Ngoài ra nó sẽ tiết kiệm rất nhiều thời gian của bạn.

curl_setopt($ch, CURLOPT_VERBOSE, true); 
+0

Tệp cookie đã lưu có bao gồm cookie test = không? Nếu không, thì làm thế nào tôi sẽ nhận được cURL để lưu các cookie từ yêu cầu tiêu đề tùy chỉnh? – brant

+0

@bộ tệp cookie chỉ viết dựa trên tiêu đề phản hồi «Set-cookie' từ máy chủ. Nếu máy chủ không trả lại cookie đó với tiêu đề đó thì nó sẽ bị bỏ qua. –

+3

Thứ tự cuộc gọi curl_setopt là rất quan trọng. đặt * CURLOPT_POST * ** sau ** * CURLOPT_POSTFIELDS * và bạn bị mất trong một khó khăn để tìm lỗi ... Tương tự, thứ tự trong giải pháp trên là quan trọng để giữ. Trao đổi nó và bạn ghi đè mọi thứ trong tệp cookie chỉ bằng "test = cookie" – rahmanisback

0

Tôi nghĩ cookie duy nhất bạn cần là JSESSIONID = xxx ..

Cũng KHÔNG BAO GIỜ chia sẻ các tập tin cookie của bạn, becasuse ai đó có thể truy cập dữ liệu cá nhân của bạn theo cách đó. Đặc biệt khi cookie là phiên. Các cookie này sẽ ngừng hoạt động khi bạn đăng xuất trang web.

Các vấn đề liên quan