我正在尝试登录网站(远程)让我们说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);
所以,即时获取令牌但是当尝试使用下一个curl请求登录时,显然$ token因刷新而不断变化,所以我想知道如何使用相同的curl脚本登录url example.com/login所以$令牌保持不变?!
TIA!
答案 0 :(得分:1)
首先,正确的dom解析器比正则表达式提取令牌更可靠,所以使用它。
$token = (new DOMXPath(@DOMDocument::loadHTML($dom)))->query("//input[@name='__RequestVerificationToken']")->item(0)->getAttribute("value");
现在,令牌DEFINITELY会针对每个新的Cookie会话进行更改。每次失败的登录尝试都会发生可能的更改,并且每次仍然没有登录页面刷新时可能会发生更改。
现在,当您第一次获得令牌时,您还会获得一个cookie会话ID。要“使用正确的令牌登录”,您必须使用登录请求发送相同的会话cookie ID。最简单的方法是让curl自动处理cookie,使用CURLOPT_COOKIEFILE
(ps,你不需要专门的cookie文件,只需设置一个emptystring和curl将为你处理cookie ) - 启用后,curl会自动发送会话cookie并显示下一个登录请求。
和protip:每当你调试curl代码时,启用CURLOPT_VERBOSE,它会提供很多有用的信息(比如显示你收到的所有cookie)