[英]PHP curl login to url with password and username and hidden token
我在使用 curl登录网站时遇到问题,该网站有一个带令牌的隐藏输入字段。 现在我认为这是可能的,但我找不到解决方案。 有人知道我该如何解决吗?
$username = '2142019677';
$password = 'Vercautp1'; //no secrets here
$link = 'https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c';
$html = file_get_contents($link);
preg_match_all("'VerificationToken\" type=\"hidden\" value=\"(.*?)\"'si", $html, $match);
$hidden = $match[1][0];
preg_match_all("'action=\"/(.*?)\" method=\"post\"'si", $html, $match);
$url = $match[1][0];
$path = "/ctemp";
$postinfo = "Username=".$username."&Password=".$password.'__RequestVerificationToken='.$hidden;
$cookie_file_path = $path."/cookie.txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, 'https://www.autoscout24.be'.$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
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, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, "https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c");
$html = curl_exec($ch);
echo $html;
curl_close($ch);
正在向服务器发送表单数据:
所以你需要看起来类似于这样的代码:
$ch = curl_init ( 'https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c' );
curl_setopt_array ( $ch, array (
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array (
'__RequestVerificationToken` => 'Ikt8rjIySPHhjsx48MYwrHBDOjhEBdKDkGR6PIzkPHs9oDBfzO8M1O2ZEAlXt3ARCgJq-8UvjhUEMbAxZMffCOQTQ7AfTmxWK785T5TL18k1'
'Username' => '2142019677',
'Password' => 'Vercautp1',
'RememberMeCheckBox' => 'on',
'RememberMe' => true
)
) );
curl_exec ( $ch );
棘手的部分是生成__RequestVerificationToken
,它可能是用户名和密码的 hash,但如果不分析创建它的 JS,就不知道它是如何生成的。
这里有很多问题,从哪里开始..
首先,这行不通:
$link = 'https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c';
$html = file_get_contents($link);
preg_match_all("'VerificationToken\" type=\"hidden\" value=\"(.*?)\"'si", $html, $match);
所以你必须用curl来获取它,而curl在获取它时必须启用cookies。 您的正则表达式提取也应替换为 DOMDocument+DOMXPath 提取,但由于您不这样做,因此您必须运行通过 html_entity_decode() 提取的代码,例如,如果您的正则表达式提取a&b
那么令牌不是a&b
,它是a&b
html 编码的(所以你需要对其进行 html 解码)
还有你的$postinfo = "Username=".$username."&Password=".$password.'__RequestVerificationToken='.$hidden;
仅当您的用户名/密码中没有特殊字符时才有效,例如,如果您的密码是Password&999
,则必须将其作为Password%26999
发送 - 因为 & 需要进行 urlencoded,所以您需要像
$postinfo = "Username=".urlencode($username)."&Password=".urlencode($password).'&__RequestVerificationToken='.urlencode($hidden);
或者更好
$postinfo = http_build_query(array(
"Username" => $username,
"Password" => $password,
'__RequestVerificationToken' => $hidden
));
也不要将 CURLOPT_CUSTOMREQUEST 用于 POST,引用 libcurl 文档https://curl.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html :
许多人错误地使用此选项将整个请求替换为自己的请求,包括多个标头和 POST 内容。 虽然这在许多情况下可能有效,但它会导致 libcurl 发送无效请求,并且可能会严重混淆远程服务器。 使用 CURLOPT_POST 和 CURLOPT_POSTFIELDS 设置 POST 数据。
...最后一件,我看到你忘了在__RequestVerificationToken
前面放一个 & - http_build_query 也会为你做这件事
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.