[英]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.