我遇到过这样一个问题:
postdata中除了账号密码,还有个叫csrf的参数,而这个参数先要通过爬取login页面,才能获得。
第一步:
do{
if($i > 2)
break;
$i++;
$url = LOGIN_URL;
echo "$url \n";
$ch = curl_init($url);
$curl_opts = array(CURLOPT_HEADER => false,
CURLOPT_NOBODY => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_USERAGENT => $user_agent,
);
curl_setopt_array($ch, $curl_opts);
$pass = curl_exec($ch);
//curl_close($ch);
}while(!$pass);
preg_match_all('/name="csrf" value="(.*?)"><label/',$pass,$m);
$csrf = $m[1][0];
第二步:
$flag = true;
$i = 0;
#login ebay
do{
if($i > 2)
break;
$i++;
$url = LOGIN_URL;
echo "$url \n";
$ch = curl_init($url);
$curl_opts = array(CURLOPT_HEADER => false,
CURLOPT_NOBODY => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_USERAGENT => $user_agent,
CURLOPT_COOKIEJAR => $file_cook,
CURLOPT_COOKIEFILE => $file_cook,
CURLOPT_POST=> true,
CURLOPT_POSTFIELDS => 'email='.$username.'&password='.$userpass.'&csrf='.$csrf,
);
curl_setopt_array($ch, $curl_opts);
$pass = curl_exec($ch);
curl_close($ch);
if($pass && strpos($pass, 'Chen')!==false){
$flag = false;
}
}while($flag);
该做的都照做了,但是,仍然登不上。后来发现,第一步没有加入
CURLOPT_COOKIEJAR => $file_cook,
CURLOPT_COOKIEFILE => $file_cook,
这两个参数,加上了,就可以正确登陆了。
结论:目标有可能第一步就给我们的浏览器种cookie,我们要在模拟登陆过程中,全部加上cookie操作。