2014-01-23 20 views
2

我試圖通過curl登錄,登錄後使用生成的cookie發出第二個請求。但它不起作用,我沒有登錄。我如何保存cookie並重用它?通過curl登錄並重復使用cookie以獲取第二個請求

這裏是我的代碼:

<?php 

// Define the URL and the data you want to send 
$loginUrl = 'https://domain.tld/login.php'; 
$parseUrl = 'https://domain.tld/start.php?page=user'; 
$loginVars = array(
    'username' => 'user', 
    'password' => 'pass' 
); 

// Now we try to login at the page 
$login = curl_init(); 

curl_setopt($login, CURLOPT_URL, $loginUrl); 
curl_setopt($login, CURLOPT_POST, 1); 
curl_setopt($login, CURLOPT_POSTFIELDS, $loginVars); 
curl_setopt($login, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($login, CURLOPT_HEADER, 1); 
curl_setopt($login, CURLOPT_RETURNTRANSFER, 1); 

$loginResponse = curl_exec($login); 

preg_match_all('|Set-Cookie: (.*);|U', $loginResponse, $matches); 
$cookies = implode('; ', $matches[1]); 

// No we download another page while reusing the cookie 

$parse = curl_init(); 

curl_setopt($parse, CURLOPT_URL, $parseUrl); 
curl_setopt($parse, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($parse, CURLOPT_HEADER, 1); 
curl_setopt($parse, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($parse, CURLOPT_COOKIE, $cookies); 

$parseResponse = curl_exec($parse); 

// Create a DOMDocument for parsing the HTML 
$dom = new DOMDocument(); 
libxml_use_internal_errors(true); 
$dom->loadHTML($parseResponse); 

// Find the element with an ID of 'username' 
$data = $dom->getElementById("username"); 
echo $data->nodeValue; 

curl_close($login); 
curl_close($parse); 

?> 

我怎樣才能得到這個工作?

回答

1

對於您的兩個捲曲請求($parse$login),請使用以下curl選項進行設置,並從txt文件獲取cookie。

$__COOKIE = "c:/var/temp/cookie.txt"; 
curl_setopt($ch, CURLOPT_COOKIEJAR, $__COOKIE); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $__COOKIE); 

順便說一下,我假設您的登錄請求是正確的。

+0

我建議使用[tempnam](http://us1.php.net/tempnam)來獲取會話的新tmp文件。 – Xeoncross

4

這應該做的工作:

<?php 

//define the cookie file location, make sure cookie.txt has write permissions 
$cookiefile = "/your/path/to/cookie.txt"; 


// Define the URL and the data you want to send 
$loginUrl = 'https://domain.tld/login.php'; 
$parseUrl = 'https://domain.tld/start.php?page=user'; 
$loginVars = array(
    'username' => 'user', 
    'password' => 'pass' 
); 

// Now we try to login at the page 
$login = curl_init(); 

curl_setopt($login, CURLOPT_URL, $loginUrl); 
curl_setopt($login, CURLOPT_POST, 1); 
curl_setopt($login, CURLOPT_POSTFIELDS, http_build_query($loginVars)); 
curl_setopt($login, CURLOPT_COOKIEJAR, $cookiefile); 
curl_setopt($login, CURLOPT_COOKIEFILE, $cookiefile); 
curl_setopt($login, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($login, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($login, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($login, CURLOPT_HEADER, 1); 
curl_setopt($login, CURLOPT_RETURNTRANSFER, 1); 
curl_exec($login); 
curl_close($login); 

// No we download another page while reusing the cookie 

$parse = curl_init(); 

curl_setopt($parse, CURLOPT_URL, $parseUrl); 
curl_setopt($parse, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($parse, CURLOPT_HEADER, 1); 
curl_setopt($parse, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($parse, CURLOPT_COOKIEJAR, $cookiefile); 
curl_setopt($parse, CURLOPT_COOKIEFILE, $cookiefile); 
curl_setopt($parse, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($parse, CURLOPT_SSL_VERIFYHOST, false); 
$parseResponse = curl_exec($parse); 
curl_close($parse); 

// Create a DOMDocument for parsing the HTML 
$dom = new DOMDocument(); 
libxml_use_internal_errors(true); 
$dom->loadHTML($parseResponse); 

// Find the element with an ID of 'username' 
$data = $dom->getElementById("username"); 
echo $data->nodeValue; 

?> 

注:

CURLOPT_COOKIEFILE包含cookie數據的文件的名稱。 cookie文件可以是Netscape格式,也可以是簡單的HTTP風格的頭文件轉儲到文件中。如果該名稱是一個空字符串,則不會加載cookie,但cookie處理仍處於啓用狀態。

CURLOPT_COOKIEJAR將句柄關閉時保存所有內部cookie的文件的名稱,例如,在調用curl_close之後。

CURLOPT_SSL_VERIFYPEER FALSE停止cURL驗證對等方的證書。可以使用CURLOPT_CAINFO選項指定要驗證的替代證書,也可以使用CURLOPT_CAPATH選項指定證書目錄。

CURLOPT_SSL_VERIFYHOST 1檢查SSL對等證書中是否存在公共名稱。 2檢查是否存在通用名稱,並驗證它是否與提供的主機名相匹配。在生產環境中,此選項的值應保持爲2(默認值)。

+0

您好圖加,非常感謝您的解決方案。我想你在第41行和第42行有一個錯誤。它不是$ login,而是$ parse,對吧?但腳本不起作用。 : - /它說「 注意:嘗試在第53行的/Applications/MAMP/htdocs/scripts/test.php中獲取非對象的屬性」這意味着,curl不在解析URL上,因爲這個div是僅在此頁面上。有沒有一種方法來調試它知道發生了什麼以及哪個URL curl試圖解析? POST表單使用POST/REDIRECT/GET邏輯。這可能是問題嗎? – emjay

+0

@emjay是的,這是一個錯誤,我已經更新了答案,現在應該順利運行,現在就試試。 –

+0

不,它不工作 - 。它說:「注意:嘗試在53行上的/Applications/MAMP/htdocs/scripts/test.php中獲取非對象的屬性」這意味着,curl不在解析URL上,因爲這個div只在這個頁面上。有沒有一種方法來調試它知道發生了什麼以及哪個URL curl試圖解析? POST表單使用POST/REDIRECT/GET邏輯。這可能是問題嗎? – emjay