2015-04-17 120 views
2

我想向需要登錄的網頁發出請求。 我成功地把餅乾與SESSID並將其寫入具有捲曲文件:帶cURL和cookie的PHP post請求

$username = 'xxx'; 
$password = 'xxxxxxx'; 
$url = 'http://example.com'; 
$cookie="cookie.txt"; 
$postdata = "username=$username&userpass=$password&autologin=1&userlogin=Login"; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch); 

curl_close($ch); 

在此之後我想打一個POST請求到現場與餅乾所以它認出了我作爲登錄現在使用API​​返回JSON信息,如果你這樣做的話: site.com/API/command.get(x) - 只是一個例子。所以如果你在瀏覽器中打開它,它將返回JSON數據。

任何人都可以幫助我的方式,如何做到這一點?我是新來捲曲。

無論我嘗試什麼,我都會重定向到登錄頁面。 試圖通過curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);,沒有成功。

+0

發佈「cookie.txt」中的內容 – Machavity

+0

只需將SESSID放在Cookie中並不意味着您已經登錄。它僅表示服務器可以將您識別爲來自SESSID的客戶端。你也必須登錄。 –

+0

嗨,在文件中有這樣的信息:#Netscape HTTP Cookie文件 #http://curl.haxx.se/rfc/cookie_spec.html #此文件是由libcurl!編輯需要您自擔風險。 site.com \t \t FALSE/\t \t FALSE 1429265797 \t ZBW_SESSID –

回答

1

爲您提示謝謝你們。 我如何得到它的工作是與此代碼(其實我用了錯誤的數據後):

$username = 'xxx'; 
$password = 'xxxx'; 
$url = 'http://example.com'; //request to the page i want the content from 
$cookie="cookie.txt"; 

$url1 = "http://example.com/command.."; 

//login form action url 
$postinfo = "act=login&login=$username&pass=$password"; 

$cookie_file_path = "cookie.txt"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_NOBODY, false); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 
//set the cookie the site has for certain features, this is optional 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 
curl_setopt($ch, CURLOPT_USERAGENT, 
    "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo); 

$result = curl_exec($ch); 
//var_dump($result); 

//page with the content I want to grab 
curl_setopt($ch, CURLOPT_URL, $url1); 
//do stuff with the info with DomDocument() etc 
$html = curl_exec($ch); 
var_dump($html); 
curl_close($ch); 

我在這裏(計算器)得到這個代碼的某個地方。感謝發佈它的人!不記得確切的名字。這就像一個魅力!

0

也許你會試試guzzle?我寫了一些遊戲引擎的代理,並且我得到了類似的Cookie問題。

重要:我沒有找到簡單的方法來處理鍵值風格的cookie。所以,就我而言,它的決定更接近黑客而不是解決方案。我粘的cookie字符串:

foreach ($request->cookies as $key => $cookie) { 
    $cookie_str .= $key .'='.$cookie . '; 
} 

而且我的解決辦法是這樣的:

$client = new GuzzleHttp\Client([ 
    'headers' => [ 
     'Cookie' => $cookie_str 
    ] 
]); 

$reqv = $client -> createRequest('POST', 'some_url'); 
$resp = $client -> send($reqv); 
+0

我希望你真的得到正確的Cookies了:) –

1

我發現捲曲的餅乾罐有問題的,所以我寫了我自己的程序。還有一些時候我需要添加從頁面中刪除的cookies。
對於此CURLOPT_HEADER必須爲真。

curl_setopt($ch, CURLOPT_HEADER, true); 

    $data = curl_exec($ch); 
    $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
    $requestHeader= substr($data,0,$skip); 
    $data = substr($data,$skip); 
    $e = 0; 
    while(true){ 
    $s = strpos($requestHeader,'Set-Cookie: ',$e); 
    if (!$s){break;} 
    $s += 12; 
    $e = strpos($requestHeader,';',$s); 
    $cookie = substr($requestHeader,$s,$e-$s) ; 
    $s = strpos($cookie,'='); 
    $key = substr($cookie,0,$s); 
    $value = substr($cookie,$s); 
    $cookies[$key] = $value; 
    } 

然後使用$餅乾[]:

$cookie = ''; 
$show = ''; 
$delim = ''; 
foreach ($cookies as $k => $v){ 
    $cookie .= "$delim$k$v"; 
    $delim = '; '; 
} 

然後使用$餅乾:

curl_setopt($ch, CURLOPT_COOKIE, $cookie); 

遇到麻煩時,我經常設置FOLLOWLOCATION爲false:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 

如果存在重定向,您可以看到發生了什麼,並且需要獲取在重定向URL的響應頭中設置的Cookie,則FOLLOWLOCATION必須設置爲false。

當curl URL將您帶到重定向curl_getinfo時,將獲得重定向位置URL。

$status = intval(curl_getinfo($ch,CURLINFO_HTTP_CODE)); 
if ($status > 299 && $status < 400){ 
    $url= curl_getinfo($ch,CURLINFO_REDIRECT_URL); 
} 
// update cookies, do not clear `cookies()`; 

當遇到困難我使用這些選項可以同時獲得響應和響應頭。響應標題將返回curl_exec()數據。請求頭將是curl_getinfo()

curl_setopt($ch, CURLOPT_VERBOSE, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $request); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 


$data = curl_exec($ch); 
if (curl_errno($ch)){ 
    $data .= 'Retreive Base Page Error: ' . curl_error($ch); 
} 
else { 
    $info = rawurldecode(var_export(curl_getinfo($ch),true)); 
    $data = curl_exec($ch); 
    $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
    $requestHeader= substr($data,0,$skip); 
    $data = substr($data,$skip); 
    $filename = parse_url($url, PHP_URL_HOST); 
    $filename .= parse_url($url, PHP_URL_PATH) . '.txt'; 
    $fp = fopen($filename,'w'); 
    fwrite($fp,$info\n$data"); 
    fclose($fp); 

    $data = substr($data,$skip); 
} 

兩個頭和HTML被存儲在文件中的回報。然後,您可以查看HTTP頭,HTML和JavaScript。有時cookie由document.cookie設置,或者用window.location重定向頁面,或者用JS單擊HTML表單的提交按鈕。在這些情況下,可能需要刮取cookie和/或從curl數據重定向位置。


然後我使用FireFox Inspector或Chrome開發工具。

我去網絡選項卡

在Firefox中,我去設定,並開啓「啓用持久性日誌」
在Chrome中我點擊「保存日誌」在網絡選項卡

然後我使用瀏覽器去任何我想要去捲曲的地方。

現在我可以看到每個請求和響應,包括重定向並將它們與保存標題進行比較。


當你需要的頭看起來就像保存瀏覽器標題:

創建一個數組把請求頭鍵值
填寫申請陣列,使正是在請求上傳的標題。
例:

$request = array(); 
$request[] = "Host: www.example.com"; 
$request[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
$request[] = "User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0"; 
$request[] = "Accept-Language: en-US,en;q=0.5"; 
$request[] = "Connection: keep-alive"; 
$request[] = "Cache-Control: no-cache"; 
$request[] = "Pragma: no-cache"; 

添加捲曲:

curl_setopt($ch, CURLOPT_HTTPHEADER, $request); 

很多時候,它是非常容易使用的移動版本。許多時候桌面版本頁面都需要JavaScript,而手機版本則不需要。我使用FireFox和用戶代理切換器,使用舊的Motorola用戶代理來檢索標題和HTML。然後,我使用相同的用戶代理捲曲的HTTPHEADER

request[] = 'User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0