我使用的網站在訪問它時存儲兩個Cookie(ASP.NET_SessionID
和__RequestVerificationToken_XXXXXXXXX
)。帶指定URL的cURL起作用,preg_match URL失敗
該頁面由一個div鏈接到一個pdf和一個帶有「pdf查看器」源的iframe。
我想用cURL檢索這兩個cookie,然後下載pdf。我發現我必須在cURL中設置幾個選項。但是,我仍然無法下載PDF。
我的設置是現在:
- 點擊主頁,(一)保存
ASP.NET_SessionID
餅乾,(B)找到了iframe的 「PDF閱讀器」 的網址,以及(c)找到PDF下載URL - 擊中 「PDF閱讀器」 URL並保存
__RequestVerificationToken_XXXXXXXXX
餅乾 - 創建從步驟1的餅乾頭和2
- 使用捲曲,PDF格式下載地址,併發送cookie頭下載文件
但是,我的文件結果只是一個登錄頁面。
第一卷曲:
$agent= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0';
$report_url = "[my_main_url_here]";
$ch1 = curl_init($report_url);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch1, CURLOPT_HEADER, true);
curl_setopt($ch1, CURLOPT_SSLVERSION, 4);
curl_setopt($ch1, CURLOPT_USERAGENT, $agent);
curl_setopt($ch1, CURLOPT_SSL_CIPHER_LIST, 'AES128-SHA:RC2-CBC-MD5');
curl_setopt($ch1, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch1, CURLOPT_HEADER, 1);
curl_setopt($ch1, CURLOPT_VERBOSE, true);
curl_setopt($ch1, CURLOPT_NOBODY, false);
$output1 = curl_exec($ch1);
curl_close($ch1);
我用preg_match
找到PDF下載鏈接:
preg_match("/\/ReportID=.{30}/", $output1, $pdf_link);
$pdf_viewer_full = "https://gate.aon.com" . $pdf_link[0];
然後我打了PDF瀏覽器URL獲得第二個Cookie:
$ch2 = curl_init($viewer_url_full);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch2, CURLOPT_HEADER, true);
curl_setopt($ch2, CURLOPT_SSLVERSION, 4);
curl_setopt($ch2, CURLOPT_USERAGENT, $agent);
curl_setopt($ch2, CURLOPT_SSL_CIPHER_LIST, 'AES128-SHA:RC2-CBC-MD5');
curl_setopt($ch2, CURLOPT_HEADER, 1);
curl_setopt($ch2, CURLOPT_VERBOSE, true);
curl_setopt($ch2, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch2, CURLOPT_NOBODY, false);
$output2 = curl_exec($ch2);
curl_close($ch2);
然後我從這兩個標頭中取出餅乾:
preg_match("/ASP.NET_SessionId=......................../", $output1, $cookie1);
preg_match("/__RequestVerificationToken_.{145}/", $output2, $cookie2);
$cookies = 'Cookie: ' . $cookie1[0] . '; ' . $cookie2[0];
,然後嘗試下載文件:
$headers = array ($cookies);
$file = fopen ('Report.pdf', 'w+');
$ch3 = curl_init($pdf_link_full);
curl_setopt($ch3, CURLOPT_SSL_CIPHER_LIST, 'AES128-SHA:RC2-CBC-MD5');
curl_setopt($ch3, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch3, CURLOPT_FILE, $file);
curl_setopt($ch3, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch3, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch3, CURLOPT_SSLVERSION, 4);
curl_setopt($ch3, CURLOPT_USERAGENT, $agent);
curl_setopt($ch3, CURLOPT_COOKIEFILE, "cookie.txt");
$output3 = curl_exec($ch3);
curl_close($ch3);
編輯:如果我手動設置$pdf_link_full
,它的工作原理。但是,如果我找到preg_match
(如上所述),則失敗。
但是,如果我打印$pdf_link_full
和$pdf_link_full_2
,它們顯示爲完全相同。我是否缺少編碼或其他東西?謝謝!
顯示您的代碼,以便我們可以告訴您如何修復cookie選項。 – Barmar
如果您使用'CURLOPT_COOKIEFILE'和'CURLTOPT_COOKIEJAR',cURL應該自動處理接收和發送cookie。 – Barmar
查看http://stackoverflow.com/questions/23745468/curl-php-setting-cookies-properly/23747787#23747787 – Barmar