2017-07-07 63 views
-1

我试图用卷曲访问此网址在PHP中: https://www.maxityre.fr/search?matchcode=2055516&t=V&l=205&mid=&bquery=&h=55&d=16&seasonAll=on&from=认证,卷曲PHP

但是,由于网站需要验证,我重定向到: https://www.maxityre.fr/

这里是我的尝试到目前为止:

$username='myusername'; 
$password='mypassword'; 
$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, 'https://www.maxityre.fr/search?matchcode=2055516&t=V&l=205&mid=&bquery=&h=55&d=16&seasonAll=on&from='); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //status code is 200 thanks to this, otherwise 302 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 

但它不工作,我重定向到https://www.maxityre.fr/(我想呼应的内容和我得到的内容)。 我做错了吗?

回答

0

是的,你做错了很多事情,其中​​最重要的是,你认为他们使用的是本地支持libcurl的登录方法之一,他们不是。他们正在使用自定义登录方案(如今天的大多数网站),并且这是如何实现的:

首先向登录页面发出GET请求。现在你得到一个会话cookie,你必须提供所有进一步的请求(使用CURLOPT_COOKIESESSION自动为你制作libcurl句柄 - 这绝对是最简单的方法),另外,你得到一个名为callback的标签,这个回调可能包括一个csrf令牌和一些额外的信息 - 但有一个奇怪的扭曲,有时候它的空,有时不,不知道为什么 - 无论如何,如果你在你的下一个POST登录请求中没有提供正确的callback变量,服务器可能会拒绝登录你,所以你必须从HTML中解析出来。现在您已准备好登录,发出POST请求,使用您在第一个GET请求中收到的Cookie,以及您从POST数据中的HTML中提取的callback以及变量action =>loginlogin =>[email protected]password =>your password here,并且POST请求正文必须以application/x-www-form-urlencoded格式编码(最简单的编码方式是使用http_build_query函数)。现在您应该已经登录。并且要继续获取登录的html,则必须发送相同的cookie以及所有其他请求,此cookie与您登录的会话绑定。在没有这个cookie的情况下发送请求将等同于在新的Web浏览器中打开该页面,并注意到您没有在新浏览器中登录。

这里与hhb_curl示例实现从https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php(约curl_功能的简便包装)

<?php 
declare(strict_types = 1); 
require_once ('hhb_.inc.php'); 
const USERNAME = '???'; 
const PASSWORD = '???'; 
$hc = new hhb_curl ('https://www.maxityre.fr/', true); 
$html = $hc->exec()->getResponseBody(); 
$csrf_token = (new DOMXPath (@DOMDocument::loadHTML ($html)))->query ('//input[@name=\'callback\']')->item (0)->getAttribute ("value"); 
$html = $hc->setopt_array (array (
     CURLOPT_POST => true, 
     CURLOPT_URL => 'https://www.maxityre.fr/', 
     CURLOPT_POSTFIELDS => http_build_query (array (
       'action' => 'login', 
       'callback' => $csrf_token, 
       'login' => USERNAME, 
       'password' => PASSWORD 
     )) 
))->exec()->getResponseBody(); 

if (false !== stripos ($html, 'Erreur d\'identification')) { 
    throw new Exception ('failed to login! (maybe wrong username/password?)'); 
} 
echo "logged in!"; 

现在你可能会想,我怎么会明白这一点?好吧,我使用Chrome开发者工具记录了日志 - (如果你打开Chrome并按下Ctrl + Alt + I,“网络标签” - 然后我简单地使用php复制该登录过程)