2015-07-01 20 views
0

我使用的網站在訪問它時存儲兩個Cookie(ASP.NET_SessionID__RequestVerificationToken_XXXXXXXXX)。帶指定URL的cURL起作用,preg_match URL失敗

該頁面由一個div鏈接到一個pdf和一個帶有「pdf查看器」源的iframe。

我想用cURL檢索這兩個cookie,然後下載pdf。我發現我必須在cURL中設置幾個選項。但是,我仍然無法下載PDF。

我的設置是現在:

  1. 點擊主頁,(一)保存ASP.NET_SessionID餅乾,(B)找到了iframe的 「PDF閱讀器」 的網址,以及(c)找到PDF下載URL
  2. 擊中 「PDF閱讀器」 URL並保存__RequestVerificationToken_XXXXXXXXX餅乾
  3. 創建從步驟1的餅乾頭和2
  4. 使用捲曲,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,它們顯示爲完全相同。我是否缺少編碼或其他東西?謝謝!

+1

顯示您的代碼,以便我們可以告訴您如何修復cookie選項。 – Barmar

+0

如果您使用'CURLOPT_COOKIEFILE'和'CURLTOPT_COOKIEJAR',cURL應該自動處理接收和發送cookie。 – Barmar

+0

查看http://stackoverflow.com/questions/23745468/curl-php-setting-cookies-properly/23747787#23747787 – Barmar

回答

0

問題出在我的preg_match。它返回的網址爲&,當我手動設置時,我只使用&符號(&)。

&代替&解決了問題。