簡體   English   中英

PHP curl 使用密碼和用戶名以及隱藏令牌登錄到 url

[英]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);

正在向服務器發送表單數據:

https://stackoverflow.com/a/53758840/4323201

所以你需要看起來類似於這樣的代碼:

$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,就不知道它是如何生成的。

另請參閱: https://stackoverflow.com/a/46872809/4323201

這里有很多問題,從哪里開始..

首先,這行不通:

$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);
  • 您要在此處提取的 verificationToken 與 file_get_contents() 收到的 cookie session 相關聯,並且 file_get_contents 不與 curl 共享 cookies(實際上 file_get_contents 根本沒有 cookie 支持,實際上,但不是字面意思,詳細說明會go 在這里偏離軌道..)

所以你必須用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM