我现在已经在这项任务上苦苦挣扎了近三天,我想我缺少一些基本的cURL技能。
我从:
开始在IE的F12中,我在第一页看到2个POST :(我注意到第一个是获得302,这应该是重定向,而cURL我只得到200)
填写验证码:
在第二页(验证码之后):
流量:
这是我的代码(我不能继续使用它,因为它不适用于早期阶段):
我构建了一个特殊表单,使用GET
(使用cURL)提交到我自己的页面,然后访问该网站:
$id=$_GET['id']; // getting the biznumber
$humanCode=$_GET['nobot'];
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, "https://www.*******.******.***");
// setting some https to be able to access the website from my local computer.
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_CAINFO, "c:/xampp/htdocs/CAcerts/curl-ca-bundle.crt");
// I know the values for the ASPX vars like __EVENTTARGET, __EVENTARGUMENT, __VIEWSTATE are arbitrary now. I need to take care of that but I don't yet know how.
$postarr= array (
"__EVENTTARGET"=>"",
"__VIEWSTATE=" =>"%2FwEPDwULLTEzMzI2OTg4NDYPZBYCZg9kFgQCBA8PZBYCHgdvbmNsaWNrBQxnb1RvTWl2emFrKClkAgYPD2QWAh8ABQxnb1RvTWl2emFrKClkZM6iZZ0Qaf2CpfXoJJdZ0IqaWsDO",
"__EVENTARGUMENT=" =>"",
"__EVENTVALIDATION" =>"%2FwEWBQKgysLGCwL2r7SGDQLh4ri%2BAwLWws7NDwLWwpLPD%2F1HuCAFYzs2seaziWbYEXjDfigP",
"hidUrlFileIshurim"=>"https%3A%2F,
"cod"=>"3322"
);
$fields_string='';
foreach($postarr as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');
curl_setopt($curl, CURLOPT_POST ,1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt ($curl, CURLOPT_USERAGENT, "User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)");
// I made a cookie file and it seems to work
$cookiefile = "d:/cookie.txt";
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($curl, CURLOPT_FRESH_CONNECT , 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION ,1);
curl_setopt($curl, CURLOPT_HEADER ,1); // DO NOT RETURN HTTP HEADERS
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$temp=curl_exec($curl);
$info = curl_getinfo($curl);
$html = mb_convert_encoding($temp, 'HTML-ENTITIES', 'utf-8');
echo "ERRCODE: ".curl_error($curl);
echo '<br /><br />';
echo "INFO : ";
print_r($info);
echo '<br /><br />';
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
echo "CODE: ".$httpcode;
echo '<br /><br />';
echo "CODE: ".$httpcode;
echo '<br /><br />';
echo "VARS: ".$vars;
echo '<br /><br />';
//echo $html;
curl_setopt ($curl, CURLOPT_URL, "https://www.*******.******.***");
curl_setopt($curl, CURLOPT_FRESH_CONNECT , 0);
echo "<br /><br /><b>2nd</b><br /><br />";
$temp=curl_exec($curl);
$info = curl_getinfo($curl);
$html = mb_convert_encoding($temp, 'HTML-ENTITIES', 'utf-8');
echo "ERRCODE: ".curl_error($curl);
echo '<br /><br />';
echo "INFO : ";
print_r($info);
echo '<br /><br />';
echo $html;
甚至无法开始工作。它首先返回200 OK,而不是302,有时我也得到500.
我知道ASPX变量可能实际上是至关重要的,但是如果我的浏览器可以制作这些变量并将它们发送到服务器,那么cURL也不能这样做吗?
感谢您的帮助!!
答案 0 :(得分:4)
问题解决了。
这是使用正确的标题的问题。
根据浏览器的报告,我完成了所有步骤,结果显示出来了。
我使用以下方法完成了每一步:
curl_init
curl_setopt()
..
curl_setopt()
curl_exec()
curl_close()
这样我就不得不手动设置每个请求并完成设置。它使代码更长,但更容易理解。
我对该网站有一些想法,使用一些javascript特殊代码来使网站正常工作,所以我对所有额外的javascript代码感到很困扰,结果是不必要的。
所有这些都是为了更有条理并遵循正确的标题设置。
此外,由于这是一个ASPX
网站,我必须阅读并记住每次迭代中最后一页的VIEWSTATE
和VALIDATION
。这是我过去常常得到的500内部错误服务器消息的第一个也是非常原因。
我使用Firebug和LiveHttpHeaders来完成每一步。
答案 1 :(得分:1)
“甚至无法开始工作。首先回复200 OK,而不是302,有时我也会得到500.”
curl_setopt($curl, CURLOPT_FOLLOWLOCATION ,1);
您已将Curl设置为遵循任何302重定向。这些将在Curl内部跟随,并且不会被PHP看到。
此外:
curl_setopt($curl, CURLOPT_HEADER ,1); // DO NOT RETURN HTTP HEADERS
评论完全与代码的作用完全相反......这似乎是错误的。
答案 2 :(得分:0)
在你制作cURL之前,你需要检查所使用的请求字段。通常在aspx中找不到HTTP 500的字段发送..
foreach($postarr as $key=>$value) {
$fields_string .= $key.'='.$value.'&';
echo" $fields_string <br> ";
}
请确保,当您发送请求时,该字段不是dinamic .. 希望这有用..
答案 3 :(得分:0)
我用过这个:
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
它模拟了卷曲,就像它有浏览器名称和版本一样。