2017-07-26 25 views
0

我想登錄到一個網站(遠程)可以說example.com/login和example.com/login使用請求令牌登錄,所以我得到請求令牌從像這樣的網址如下如何使用令牌登錄而不刷新捲曲

// code for getting token cookies etc 

    $url = 'http://example.com/login/'; 

    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 

    $doc = curl_exec($ch); 
    curl_close($ch); 

// extract __RequestVerificationToken input field 
    preg_match('#<input name="__RequestVerificationToken" type="hidden" value="(.*?)"#is', $doc, $match); 


    $token = $match[1]; 

// code for redirect to dashboard 

$postinfo = "Email=".$username."&Password=".$password."&__RequestVerificationToken=".$token; 
// var_dump($token); //debug info 
$useragent="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; 



curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 

$html = curl_exec($ch); 
echo $html; 

if (curl_errno($ch)) print curl_error($ch); 
    curl_close($ch); 

因此,即時得到令牌,但試圖與未來捲曲請求登錄時,顯然是$令牌不斷變化,由於刷新,所以我想知道我可以登錄網址example.com /使用相同的curl腳本登錄,以便$ token保持相同?

TIA!

+1

,網頁上會得到一個令牌是部分登錄表單,然後在頁面上登錄登錄表單以獲取會話cookie。這些cookie應該工作到會話超時。在Chrome中使用F12,並選中該框以在導航之間保留網絡數據,以查看瀏覽器如何進行操作。 –

回答

1

首先,合適的dom解析器比正則表達式提取令牌更可靠,所以請使用它。

$token = (new DOMXPath(@DOMDocument::loadHTML($dom)))->query("//input[@name='__RequestVerificationToken']")->item(0)->getAttribute("value"); 

現在,標記DEFINITELY會針對每個新的Cookie會話進行更改。和POSSIBLY更改爲每個失敗的登錄嘗試,POSSIBLY更改爲每個仍然沒有登錄頁面刷新。

現在,當您第一次獲取令牌時,您還會獲得一個cookie會話ID。要「使用正確的標記登錄」,您必須將該同一個會話cookie標識與登錄請求一起發送。最簡單的方法是讓curl自動處理cookie,CURLOPT_COOKIEFILE(ps,你不需要一個專用的cookies文件,只需設置一個emptystring,curl會幫你處理cookies) - curl自動發送會話cookie與下一個登錄請求。

和普羅蒂普:每當你正在調試卷曲的代碼,使CURLOPT_VERBOSE,它給了很多有用的信息(如顯示你所有收到的餅乾)

+0

dom解析器沒有爲我工作不知道爲什麼,但那CURLOPT_VERBOSE有一些非常有用的信息,也只是爲了讓更新我能夠登錄,在遠程站點只需要重定向到那個登錄後的遠程站點,會通過curl來完成吧?! 謝謝! –

+0

好吧,如果它是一個HTTP頭'Location:'重定向,只需使用'CURLOPT_FOLLOWLOCATION',curl會自動跟隨重定向。但如果它是html/javascript重定向,則必須使用curl手動重定向。 – hanshenrik

+0

@AnasAhmedKhanNiazi最有可能的是,dom解析器沒有工作,因爲我寫了'loadHTML($ dom)' - 這是一個錯字,我_SHOULD_寫了'loadHTML($ doc)'(其中$ doc是html) - 或者你沒有安裝php-xml擴展 – hanshenrik