新用户注册恢复喜悦村十周年

关于抓取EMS网站的问题。。

EMS的网站:
http://www.ems.com.cn/qcgzOutQueryAction.do?reqCode=gotoSearch

想模拟提交,取得返回的结果

用了snoopy和curl,貌似都米法。。
不知道是我方法不对还是什么

研究了下原理,应该是有一个session,然后有一个隐藏的 myEmsbarCode 貌似随机数的东西。。
贴上自己的snoopy代码。求高手解决
  1. <?
  2. include "Snoopy.class.php";
  3. $snoopy = new Snoopy;
  4. $submit_url = "http://www.ems.com.cn/qcgzOutQueryAction.do";
  5.    
  6.     $submit_vars["reqCode"] = "browseBASE";
  7.     $submit_vars["myEmsbarCode"] = "1466260448764";
  8.     $submit_vars["mailNum"] = "EI436138259JP";
  9.         $snoopy->cookies["JSESSIONID"] = 'HZnX2dY2pLzYbGz3BVTBdzMBf3tVpvPgZrCJLSpJGzWG0v3rhTVt!240513717';
  10.     $snoopy->submit($submit_url,$submit_vars);
  11.     print $snoopy->results;
  12. ?>
复制代码
帮你用CURL写了个,经测试可用
[php]

<?php
set_time_limit(0);
error_reporting(E_ALL);

$url        =        "http://www.ems.com.cn/qcgzOutQueryAction.do?reqCode=gotoSearch";
$url2        =        "http://www.ems.com.cn/qcgzOutQueryAction.do";
$mailNum=        "EI436138259JP";
$cookie_jar= dirname(__FILE__) ."/test.cookie";


echo emsQuery($url,$url2,$mailNum,$cookie_jar);


function  emsQuery($url,$url2,$mailNum,$cookie_jar){
        $ch = curl_init();  
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
        curl_setopt($ch,CURLOPT_COOKIE,$cookie_jar);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_NOBODY, false);
        curl_setopt($ch,CURLOPT_REFERER,$url);
        $content=curl_exec($ch);
        preg_match('/name="myEmsbarCode" value="(.*)"/i',$content,$myEmsbarCode);
        curl_close($ch);
        $myEmsbarCode=$myEmsbarCode[1];


        $ch2 = curl_init();
        curl_setopt($ch2, CURLOPT_URL,$url2);
        $post="reqCode=browseBASE&myEmsbarCode=$myEmsbarCode&mailNum=$mailNum";
        curl_setopt($ch2, CURLOPT_POST, 1);
        curl_setopt($ch2, CURLOPT_POSTFIELDS,$post);

        curl_setopt($ch2,CURLOPT_REFERER,$url);
        curl_setopt($ch2, CURLOPT_HEADER, false);
        curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_jar);
        $content2 = curl_exec($ch2);
        curl_close($ch2);
        preg_match('/td class="txt-main" align="left">(.*)<form name="form1"/isU',$content2,$res);

        return $res[1];


}

[/php]

结果见附件

[php][/php]
附件: 您所在的用户组无法下载或查看附件
好强好强。。。完全偶像。。
一半以上的代码看不懂。。
看来我还要抓紧学习了。。
谢谢  songlv 大大
原帖由 zxishere 于 2008-3-14 01:47 PM 发表
好强好强。。。完全偶像。。
一半以上的代码看不懂。。
看来我还要抓紧学习了。。
谢谢  songlv 大大
不客气
偶像淫....................
只有想不到的,没有做不到的!
就是和正常访问一样,分两次访问,cookie得打开 ,用来存储sessionID的,要不服务器读不到随机码,第一次是获得表单页面中的随机码,第2次利用已经获得的随机码的值进行POST 同时提交cookie
诶。。我在进来讨论一下。今天和同事谈到这个模拟提交的问题。
因为说的session其实也是通过cookie来判断的,
那如果有一个图片验证码,假如说我能模拟它session对应的cookie的值,
这样不是就可以绕过验证码了。

按照我同事的说法,session就是个浏览器生存周期的cookie
如果可以模拟,比如1234对应的seesionID是ABCD
那我模拟出来session的这个cookie,然后直接把1234赋值到验证码的输入框,是不是就可以跳过图片验证码了。。

不过感觉肯定不会那么简单,肯定我哪里思考有问题。。汗。。
求版主大大解答
原帖由 zxishere 于 2008-3-14 11:48 PM 发表
诶。。我在进来讨论一下。今天和同事谈到这个模拟提交的问题。
因为说的session其实也是通过cookie来判断的,
那如果有一个图片验证码,假如说我能模拟它session对应的cookie的值,
这样不是就可以绕过验证码了 ...
你太天真了。。。。  验证码的值是在服务器端,sessionID才在客户浏览器里,不识别图片就别想绕过
我转达我同事先。。
我自己已经被自己弄晕了。。。