2017-07-26 57 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