超难问题500分求解(PHP 的解决方法)成功处理的再开4贴结分 你的读取程序少读了一个关键的东西。在.net中,服务器端控件都要在浏览器端放置一个供识别的唯一的编号。犹如sessionid一般。通过此编号来建立客户端与服务器端的联系 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有没有可能是通过隐藏表单来传递值的?不懂.net的机制,帮你顶! to: xuzuning(唠叨)大哥 我知道他那里面是用一个.net自带的控件分页处理的,其分页处的内容为<a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl1','')">2</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl2','')">3</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl3','')">4</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl4','')">5</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl5','')">6</a>老大,帮我看看啊,怎么处理,在线等,急 __doPostBack 里面写的语句是什么?不了解.net的机制 应该可以看到这个函数的吧!它里面一定有POST或者GET数据到服务器吧? form1中有个隐藏的input是__EVENTTARGET它的值javascript中经split("$").join(":")之后post到服务端值dgrdResultados1$_ctl54$_ctl1的时候是第一页值dgrdResultados1$_ctl54$_ctl2的时候是第二页类推看源码中的这个: function __doPostBack(eventTarget, eventArgument) { var theform; if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) { theform = document.Form1; } else { theform = document.forms["Form1"]; } theform.__EVENTTARGET.value = eventTarget.split("$").join(":"); theform.__EVENTARGUMENT.value = eventArgument; theform.submit(); } helloyou0(你好!)你说的这个我知道,关键是现在怎么样跳到第二页,大家倒说说啊,提个思路也行啊 无非是 POST 或 GET 页面参数,当然了,可能需要其他特殊验证信息。但理论上是可以抓到包分析的。模拟一次就可以。 to : lostgdi731(O_O)怎么模拟?指点一下 呵呵,如helloyou0说的:值dgrdResultados1$_ctl54$_ctl1的时候是第一页值dgrdResultados1$_ctl54$_ctl2的时候是第二页看一下_doPostBack函数的处理,挺简单的,只要POST的数据处理对了就能取到下一页了反正浏览器能做的,程序也都能做,HTTP无非是GET和POST数据而已 Visual Sniffer用他去抓包 呵呵其他的不好多说.net不熟悉 //改过的源码,但还是不行啊,因为php里面远程取数据都是用url获取的,而他的URL都一样,虽然程序能帮翻页,但是还是取的重复的数据啊,大大们再看一下<?phpset_time_limit(0);$url = "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9";$file = file_get_contents($url);//取__VIEWSTATEif(preg_match_all("|__VIEWSTATE\'?\"?\s+value\s*=\s*\"?\"(.+?)\"|is",$file,$viewStates)){ $viewState = $viewStates[1][0];}//取得总页数$page = 1;if(preg_match_all("|javascript:__doPostBack\(\'dgrdResultados1$_ctl54$_ctl(.+?)\',\'\'\)\"|is",$file,$pages)){ echo "go 2222 "; print_r($pages[1]);}for($page=0;$page<7;$page++){ if($page != 0) { $file = file_get_contents($url);//取得的结果还是一样啊?怎么让其变得不一样? } if(preg_match_all("|<tr\s+onClick\s*=\s*\"?\'?\s*submitar\(\s*\'?([0-9]+)\'?\s*[^)]+\)[^>]+>(.*?)</tr>|is",$file,$matches)) { for($i=0;$i<count($matches[2]);$i++) { //echo $matches[2][$i]; if(preg_match_all("|<td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td>|is",$matches[2][$i],$match1)) { for($j=0;$j<count($match1[1]);$j++) { $location = $match1[2][$j]; $type = $match1[3][$j]; $roomNum = $match1[4][$j]; $area = $match1[5][$j]; $plant = $match1[6][$j]; $price = $match1[7][$j]; $state = $match1[8][$j]; //写入数据库 echo $location; echo " "; echo $type; echo " "; echo $roomNum; echo " "; echo $area ; echo " "; echo $plant; echo " "; echo $price; echo " "; echo $state; echo "<br><br>"; } } } } //自动提交到下一个页面? 怎么样取下一页的数据呢? ?> <form name="Form1" action="<?=$url?>" method="post"> <input type="hidden" name="__EVENTTARGET" value="" > <input type="hidden" name="__EVENTARGUMENT" value=""> <input type="hidden" name="__VIEWSTATE" value="<?=$viewState?>"> </form> <script language="javascript" type="text/javascript"> <!-- eventTarget = "dgrdResultados1$_ctl54$_ctl"+"<?=$page?>"; var theform; if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) { theform = document.Form1; } else { theform = document.forms["Form1"]; } theform.__EVENTTARGET.value = eventTarget.split("$").join(":"); theform.__EVENTARGUMENT.value = eventArgument; theform.submit(); // --> </script><?php}?> 看手册上的这个例子,是发post请求的,应该依葫芦画瓢就可以http://www.php.net/manual/en/ref.stream.php helloyou0(你好!) ,看到我上面的网站$url = "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9";我要是用fsockopen 的话,网址就只能为 $url = "www.fotocasa.es" 那我就得同时get/和post数据过去,用fsockopen 的话,不好处理吧 这是按fsockopen修改的程序,为什么运行时会提示找不到对像,当将post改成get时,运行结果就是显示第一页的结果//程序如下<?phpset_time_limit(0);$url = "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9";$file = file_get_contents($url);//取__VIEWSTATEif(preg_match_all("|__VIEWSTATE\'?\"?\s+value\s*=\s*\"?\"(.+?)\"|is",$file,$viewStates)){ $viewState = $viewStates[1][0];}//取得总页数if(preg_match_all("|dgrdResultados1[$]_ctl54[$]_ctl([0-9]+)|is",$file,$pages)){ $count = count($pages[1]); $count--; $totalPage = $pages[1][$count];}$url = "www.fotocasa.es";$fp = fsockopen($url,80,&$errno,&$errstr,300000);if(!$fp){ echo $errno.$errstr; die();}else{ //第一页数据是用get 取得的 上面的file_get_content所取得的 for($page=1;$page<$totalPage;$page++) { if($page > 0) { //取__EVENTTARGET 和__EVENTARGUMENT $tmp = "dgrdResultados1$_ctl54$_ctl2"; $eventTarget = str_replace("$",":",$tmp); $eventArgument = ""; //参数附加 $file = ""; $params = "__EVENTTARGET=".$eventTarget."&__EVENTARGUMENT=".$eventArgument."&__VIEWSTATE=".$viewState; $length = strlen($params); $header = "POST /busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9 HTTP/1.1\r\n"; $header .= "Host:$url\r\n"; $header .= "Content-Length:$length\r\n"; $header .= "Content-type: application/x-www-form-urlencoded\r\n"; $header .= "Connection:Close\r\n\r\n"; $header .= $params."\r\n"; fputs($fp,$header); while(!feof($fp)) { $file. = fgets($fp, 4096); } } //写数据库 if(preg_match_all("|<tr\s+onClick\s*=\s*\"?\'?\s*submitar\(\s*\'?([0-9]+)\'?\s*[^)]+\)[^>]+>(.*?)</tr>|is",$file,$matches)) { for($i=0;$i<count($matches[2]);$i++) { //echo $matches[2][$i]; if(preg_match_all("|<td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td>|is",$matches[2][$i],$match1)) { for($j=0;$j<count($match1[1]);$j++) { $location = $match1[2][$j]; $type = $match1[3][$j]; $roomNum = $match1[4][$j]; $area = $match1[5][$j]; $plant = $match1[6][$j]; $price = $match1[7][$j]; $state = $match1[8][$j]; //写入数据库 echo $location; echo " "; echo $type; echo " "; echo $roomNum; echo " "; echo $area ; echo " "; echo $plant; echo " "; echo $price; echo " "; echo $state; echo "<br><br>"; } } } } }}?> swfupload如何自定义boundary php的header()函数问题 phpmailer发送html邮件 在zend studio 5.5.1中文版中,哪个窗口可以查看目前页面中的所有类名 用smarty模板做的cms系统 PHP怎么判断字符串中包含重复的数字? 有关句语的问题 这个action提交到哪个页面 请问如何用C#将PHP格式的时间戳转换成标准的年月日格式? cook的最终问题!!! $_DCACHE[]这种格式的变量,是否可以直接被引用? PHP都有哪些好的设计模式,大家一般都使用什么洋的设计模式哦
不懂.net的机制,帮你顶!
我知道他那里面是用一个.net自带的控件分页处理的,其分页处的内容为<a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl1','')">2</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl2','')">3</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl3','')">4</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl4','')">5</a> <a href="javascript:__doPostBack('dgrdResultados1$_ctl54$_ctl5','')">6</a>
老大,帮我看看啊,怎么处理,在线等,急
它的值javascript中经split("$").join(":")之后post到服务端
值dgrdResultados1$_ctl54$_ctl1的时候是第一页
值dgrdResultados1$_ctl54$_ctl2的时候是第二页
类推
看源码中的这个:
function __doPostBack(eventTarget, eventArgument) {
var theform;
if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
theform = document.Form1;
}
else {
theform = document.forms["Form1"];
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
当然了,可能需要其他特殊验证信息。
但理论上是可以抓到包分析的。
模拟一次就可以。
怎么模拟?指点一下
值dgrdResultados1$_ctl54$_ctl1的时候是第一页
值dgrdResultados1$_ctl54$_ctl2的时候是第二页看一下_doPostBack函数的处理,挺简单的,只要POST的数据处理对了就能取到下一页了
反正浏览器能做的,程序也都能做,HTTP无非是GET和POST数据而已
用他去抓包 呵呵
其他的不好多说
.net不熟悉
<?php
set_time_limit(0);
$url = "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9";
$file = file_get_contents($url);//取__VIEWSTATE
if(preg_match_all("|__VIEWSTATE\'?\"?\s+value\s*=\s*\"?\"(.+?)\"|is",$file,$viewStates))
{
$viewState = $viewStates[1][0];
}//取得总页数
$page = 1;
if(preg_match_all("|javascript:__doPostBack\(\'dgrdResultados1$_ctl54$_ctl(.+?)\',\'\'\)\"|is",$file,$pages))
{
echo "go 2222 ";
print_r($pages[1]);
}
for($page=0;$page<7;$page++)
{
if($page != 0)
{
$file = file_get_contents($url);//取得的结果还是一样啊?怎么让其变得不一样?
}
if(preg_match_all("|<tr\s+onClick\s*=\s*\"?\'?\s*submitar\(\s*\'?([0-9]+)\'?\s*[^)]+\)[^>]+>(.*?)</tr>|is",$file,$matches))
{
for($i=0;$i<count($matches[2]);$i++)
{
//echo $matches[2][$i];
if(preg_match_all("|<td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td>|is",$matches[2][$i],$match1))
{
for($j=0;$j<count($match1[1]);$j++)
{
$location = $match1[2][$j];
$type = $match1[3][$j];
$roomNum = $match1[4][$j];
$area = $match1[5][$j];
$plant = $match1[6][$j];
$price = $match1[7][$j];
$state = $match1[8][$j];
//写入数据库
echo $location;
echo " ";
echo $type;
echo " ";
echo $roomNum;
echo " ";
echo $area ;
echo " ";
echo $plant;
echo " ";
echo $price;
echo " ";
echo $state;
echo "<br><br>";
}
}
}
}
//自动提交到下一个页面? 怎么样取下一页的数据呢?
?>
<form name="Form1" action="<?=$url?>" method="post">
<input type="hidden" name="__EVENTTARGET" value="" >
<input type="hidden" name="__EVENTARGUMENT" value="">
<input type="hidden" name="__VIEWSTATE" value="<?=$viewState?>">
</form>
<script language="javascript" type="text/javascript">
<!--
eventTarget = "dgrdResultados1$_ctl54$_ctl"+"<?=$page?>";
var theform;
if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
theform = document.Form1;
}
else {
theform = document.forms["Form1"];
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
// -->
</script>
<?php
}
?>
应该依葫芦画瓢就可以
http://www.php.net/manual/en/ref.stream.php
我要是用fsockopen 的话,网址就只能为 $url = "www.fotocasa.es" 那我就得同时get/和post数据过去,用fsockopen 的话,不好处理吧
<?php
set_time_limit(0);
$url = "http://www.fotocasa.es/busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9";
$file = file_get_contents($url);//取__VIEWSTATE
if(preg_match_all("|__VIEWSTATE\'?\"?\s+value\s*=\s*\"?\"(.+?)\"|is",$file,$viewStates))
{
$viewState = $viewStates[1][0];
}//取得总页数
if(preg_match_all("|dgrdResultados1[$]_ctl54[$]_ctl([0-9]+)|is",$file,$pages))
{
$count = count($pages[1]);
$count--;
$totalPage = $pages[1][$count];
}
$url = "www.fotocasa.es";
$fp = fsockopen($url,80,&$errno,&$errstr,300000);
if(!$fp)
{
echo $errno.$errstr;
die();
}
else
{
//第一页数据是用get 取得的 上面的file_get_content所取得的
for($page=1;$page<$totalPage;$page++)
{
if($page > 0)
{
//取__EVENTTARGET 和__EVENTARGUMENT
$tmp = "dgrdResultados1$_ctl54$_ctl2";
$eventTarget = str_replace("$",":",$tmp);
$eventArgument = "";
//参数附加
$file = "";
$params = "__EVENTTARGET=".$eventTarget."&__EVENTARGUMENT=".$eventArgument."&__VIEWSTATE=".$viewState;
$length = strlen($params);
$header = "POST /busq/resultados.aspx?idTipoInmueble=2&idTipoOferta=2&idProvincia=27&idZona1=0&idZona2=0&idBarrio=0&idOtrasZonas=0&IdPoblacion=0&idDistrito=-2&Precio=0&Superficie=0&nHabitaciones=0&idTipoVivienda=0&x=50&y=9 HTTP/1.1\r\n";
$header .= "Host:$url\r\n";
$header .= "Content-Length:$length\r\n";
$header .= "Content-type: application/x-www-form-urlencoded\r\n";
$header .= "Connection:Close\r\n\r\n";
$header .= $params."\r\n";
fputs($fp,$header);
while(!feof($fp))
{
$file. = fgets($fp, 4096);
}
}
//写数据库
if(preg_match_all("|<tr\s+onClick\s*=\s*\"?\'?\s*submitar\(\s*\'?([0-9]+)\'?\s*[^)]+\)[^>]+>(.*?)</tr>|is",$file,$matches))
{
for($i=0;$i<count($matches[2]);$i++)
{
//echo $matches[2][$i];
if(preg_match_all("|<td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td><td\s+[^>]*>(.*?)</td>|is",$matches[2][$i],$match1))
{
for($j=0;$j<count($match1[1]);$j++)
{
$location = $match1[2][$j];
$type = $match1[3][$j];
$roomNum = $match1[4][$j];
$area = $match1[5][$j];
$plant = $match1[6][$j];
$price = $match1[7][$j];
$state = $match1[8][$j];
//写入数据库
echo $location;
echo " ";
echo $type;
echo " ";
echo $roomNum;
echo " ";
echo $area ;
echo " ";
echo $plant;
echo " ";
echo $price;
echo " ";
echo $state;
echo "<br><br>";
}
}
}
}
}
}
?>