目标站:http://218.25.58.44/searchsys/我的源码如下:现在问题是:返回结果“验证码错误”,也就是验证码失效了。求指点!
我在CSDN上查阅了相关资料,但还是弄不太明白。说是应该带cookie一起post 。我主要对这个流程没太懂,如何来保证我取到的验证码是与cookie一致?目前验证码识别问题我已经成功了。
多谢高手指点!

解决方案 »

  1.   

    用抓包工具 把所有发生的数据传输都做一个分析 完后保证传输的数据一致即可.
    至于cookie 打开页面的时候读取保存 发送的时候带上 具体的可以看 curl的相关参数.
      

  2.   

    至少在获取验证码图片时需要有
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
    $cookiefile:保存cookie的文件名发送数据到目标页时,需要携带cookie
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
      

  3.   

    问题是,怎么保证验证码不失效?或者这么说吧,怎么能在我用curl get模拟访问http://218.25.58.44/searchsys/页面时,同时把验证码也保存下来?就是访问得到数据后,验证码缓存到本地,能吗?
      

  4.   

    那么验证码那块呢?我就算带上了cookie,可是当我调用验证码识别函数的时候,它就重新生成了验证码!难道说我应该模拟访问生成验证码的文件(img.jsp)?这块不太一解,还请指点
      

  5.   

    我已经说了在获取验证码图片时需要同时获取cookie
    因为验证码是保存在 session 中的,并将 sessionid 放在 cookie 里提交时绝不可以再去读cookie,读了将可能改变 sessionid
    而必须将先前读到的cookie发送回去
      

  6.   

    问题是怎么同时?“在获取验证码图片时需要同时获取cookie”,谢谢,可以详细说一下吗?多谢了。
      

  7.   

    问题是怎么同时?“在获取验证码图片时需要同时获取cookie”,谢谢,可以详细说一下吗?多谢了。
    跟你遇到过一样的问题  验证码识别函数每次都会再次读取一下那个验证码生成的地址 导致 提交的不一致..... 你试试当页面载入后的验证码 保存到临时文件夹 在调用临时文件夹里面识别验证码 在提交 试试 
      

  8.   

    感谢8楼,可是能具体说下吗?我不知道用什么语句来取得页面截入后的验证码,即保存到临时文件夹的验证码,这个用PHP语句怎么实现呢?多谢
      

  9.   

    比如说,我用下面的代码来访问页面$ch = curl_init("http://218.25.58.44/searchsys/") ;  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回  
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回  
    $output = curl_exec($ch) ; 
    echo $output;
    curl_close($ch);
      

  10.   

    比如:
    $cookiefile = realpath('123.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);
    $output = curl_exec($ch) 后,文件 123.txt 中保存有取回的 cookie
    以后再 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); 就可以将 cookie 传回去了我想我说的再清楚不过了
      

  11.   

    按你说的做了,在没有带cookie时,提示“验证码已失效”,按你说的加上cookie后,提示变了“验证码错误”,我感觉还是我取到的验证码没能同步,就是我取到的码是“重新生成”的码。求解!
      

  12.   

    代码如下:get_by_curl("http://218.25.58.44/searchsys/");//得到cookie
    getGJWZResult('小型汽车','辽AQ007B','4300');//查询违章结果function get_yzm(){
        $valite = new valite();
        $valite->setImage("http://218.25.58.44/searchsys/img.jsp");
        $valite->getHec();
        $valite->filterInfo();
        $valite->dealwithData();
        $data = $valite->run();
        $data = implode("",$data);
        return $data;
    }function getGJWZResult($car_type = '',$car_no = '',$car_checkcode = '',$x='',$y='') {
        header("Content-type:text/html;charset=utf-8");
        $remote_server = 'http://218.25.58.44/search/wzcxrs.action';
        $post_string = 'wzcx.autotype='.$car_type.'&wzcx.autono='.$car_no.'&wzcx.memo='.$car_checkcode.'&rand='. get_yzm().'$x='.$x.'$y='.$y;
        $output = post_by_curl($remote_server, $post_string);
        echo $output;
        //return trim(getcontentbetween('<td align="center"  ><font size="5">','</font>',$output));
    }function get_by_curl($remote_server){
        $cookiefile = realpath('cookie.txt');
        $ch = curl_init($remote_server); 
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);//存储cookies
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
        $data = curl_exec($ch);
        curl_close($ch);
        //return $data;
    }function post_by_curl($remote_server, $post_string) {
        $cookiefile = realpath('cookie.txt');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies
        curl_setopt($ch, CURLOPT_URL, $remote_server);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
      

  13.   

    你在 get_yzm() 函数中获取了 cookie 吗?(从代码中看不出来)通常验证码值是在验证码图片生成时写入 session 的,如果你不能取得此时的 sessionid,那么验证是不会成功的 
      

  14.   

    简单的说,至少在取图片的时候就要保存一次cookie(页面的cookie反而不重要)
    提交时再把这个cookie发回去(一并提交)就是说 http://218.25.58.44/searchsys/img.jsp 的cookie要得到
      

  15.   

    看了一下连接:
    1、查询页面 http://218.25.58.44/searchsys/ 已设置了 sessionid (Set-Cookie: ....; Path=/)
    所以你需要先访问此 url,并获取 cookie
    2、验证码图片 http://218.25.58.44/searchsys/img.jsp
    从这个 url 获取图片流时,需将第1步读取的 cookie 发过去,不然将因为没有收到 sessionid 而产生新的 sessionid
    3、表单处理 http://218.25.58.44/searchsys/search/wzcxrs.action
    向此 url 发送数据时,一定要将第1步读取的 cookie 一并发过去
      

  16.   

    按您说的改了代码,可是还是提示验证码错误!get_by_curl("http://218.25.58.44/searchsys/");//得到cookie
    echo $yzm = get_yzm(get_yzm_with_cookie("http://218.25.58.44/searchsys/img.jsp"));getGJWZResult('小型汽车','辽AQ007B','4300',$yzm);//查询违章结果function get_yzm_with_cookie($remote_server){
        $cookiefile = realpath('cookie.txt');
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies
        curl_setopt($ch, CURLOPT_URL, $remote_server);
        //curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }function get_yzm(){
        $valite = new valite();
        $valite->setImage("http://218.25.58.44/searchsys/img.jsp");
        $valite->getHec();
        $valite->filterInfo();
        $valite->dealwithData();
        $data = $valite->run();
        $data = implode("",$data);
        return $data;
    }function getGJWZResult($car_type = '',$car_no = '',$car_checkcode = '',$yzm='') {
        header("Content-type:text/html;charset=utf-8");
        $remote_server = 'http://218.25.58.44/search/wzcxrs.action';
        $post_string = 'wzcx.autotype='.$car_type.'&wzcx.autono='.$car_no.'&wzcx.memo='.$car_checkcode.'&rand='. $yzm;
        $output = post_by_curl($remote_server, $post_string);
        echo $output;
        //return trim(getcontentbetween('<td align="center"  ><font size="5">','</font>',$output));
    }function get_by_curl($remote_server){
        $cookiefile = realpath('cookie.txt');
        $ch = curl_init($remote_server); 
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);//存储cookies
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
        $data = curl_exec($ch);
        curl_close($ch);
        //return $data;
    }
      

  17.   

    代码粘错了,我是这样改的,但出现了N多错误。主要是验证码图片那块语句不知道怎么写了。get_by_curl("http://218.25.58.44/searchsys/");//得到cookie
    echo $yzm = get_yzm(get_yzm_with_cookie("http://218.25.58.44/searchsys/img.jsp"));getGJWZResult('小型汽车','辽AQ007B','4300',$yzm);//查询违章结果function get_yzm_with_cookie($remote_server){
        $cookiefile = realpath('cookie.txt');
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies
        curl_setopt($ch, CURLOPT_URL, $remote_server);
        //curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }function get_yzm($yzm){
        $valite = new valite();
        $valite->setImage($yzm);
        $valite->getHec();
        $valite->filterInfo();
        $valite->dealwithData();
        $data = $valite->run();
        $data = implode("",$data);
        return $data;
    }function getGJWZResult($car_type = '',$car_no = '',$car_checkcode = '',$yzm='') {
        header("Content-type:text/html;charset=utf-8");
        $remote_server = 'http://218.25.58.44/search/wzcxrs.action';
        $post_string = 'wzcx.autotype='.$car_type.'&wzcx.autono='.$car_no.'&wzcx.memo='.$car_checkcode.'&rand='. $yzm;
        $output = post_by_curl($remote_server, $post_string);
        echo $output;
        //return trim(getcontentbetween('<td align="center"  ><font size="5">','</font>',$output));
    }function get_by_curl($remote_server){
        $cookiefile = realpath('cookie.txt');
        $ch = curl_init($remote_server); 
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);//存储cookies
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
        $data = curl_exec($ch);
        curl_close($ch);
        //return $data;
    }function post_by_curl($remote_server, $post_string) {
        $cookiefile = realpath('cookie.txt');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile); //使用获取的cookies
        curl_setopt($ch, CURLOPT_URL, $remote_server);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
      

  18.   

    我不知道你的 valite 类是如何写的
    但从 $valite->setImage("http://218.25.58.44/searchsys/img.jsp"); 就可知道是又发起了一次独立的 http 请求,因此 sessionid 就被改变了
      

  19.   

    主要就是你说的第2步那块,不知道怎么写了!“验证码图片 http://218.25.58.44/searchsys/img.jsp
    从这个 url 获取图片流时,需将第1步读取的 cookie 发过去”
      

  20.   

    那得修改你的 valite 类
    让他可以接受图片数据,而不是 url
      

  21.   

    valite就是接收的图片数据,问题是我现在不知道怎么写语句来取到http://218.25.58.44/searchsys/img.jsp这个图片类型的数据。我用curl get http://218.25.58.44/searchsys/img.jsp 后,得到的输入结果是乱码,要是能得出图片就能OK了。��JFIF�C       $.' ",#(7),01444'9=82<.342�C    2!!22222222222222222222222222222222222222222222222222�<"�   ��}!1AQa"q2亼�#B绷R佯$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼��   ��w!1AQaq"2�B憽绷 #3R�br� $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬� ?趸璕+&骹f�>a颉c蜱$2NF1儨寃甆/雵Y� � 5捠虙�5�*�76誗腮FOe�+[T蟒�,>Z壧环彅`巼�9�'裣袌格 找翁柟撤l�%K8�觥_�(H9' +leEG櫌箏鰳巢栨x惣効攲1�-撔q嶪_枻�5�5�. 鵨��  軒爍�<�閷ㄎ馩�4�%秛�趯夠楎�蹳892O85�6殩碍歕=3�酇u,恠柷Q訉謎甼 A5祫兤才訾皦t_9燵�0珣�<�>钺��訝洦m/盅�+;I \�$2巟嚆潖4拙癕 H�:m柠漹 �(*�]跭�8 傌<郬Mr KV廟�碆瀓萸€2�l�6頰讕�+揓<易塔 媈�5蕲胇贓l嬻A'跂Q&Kg,�癍踃濁gYt�赁}A�8�E吹苍/�4鮟$r�#H脠鰧F迖R鵳�!銐~谭�#X�&��稞>ゥ…zQ鐋�"点睙$浯Q錇O軸Ke�.C6@�1帲QW锌�5X舖奜填�:^9�>怠b祧2�99)�獉y鐷荓q孮E 櫀璓E'賁垳�#螦瀧鼉�=�~�)婇眦珗� 頊€@�>椟胪T泷:j墳嬷`%庂銮繐尀ㄠ�+'U_/P� 蘒>钽�3髐锷4QMn:膆�
      

  22.   

    现在问题就出在验证码这块儿,怎么才能在识别的验证码的同时,又取得同步的cookie?
    我的识别验证码的函数的参数应该是个url或path+filename,但我不知道怎么用curl取得验证码(我用curl get http://218.25.58.44/searchsys/img.jsp根本就得不到图片类型的验证码)并得到cookie
      

  23.   

    如果你需要我帮你修改 valite,那么你至少需要给我他的代码你的函数中都有 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    那么为什么抓取图片时就没有呢
      

  24.   

    这是部分源码:class valite
    {
    public function setImage($Image)
    {
    $this->ImagePath = $Image;
    } public function getData()
    {
    return $this->data;
    }
      

  25.   

    这个验证函数应该是这样的 返回类型:4位数字 参数:图片文件的路径,可是怎么调用呢?要是简单的调用http://218.25.58.44/searchsys/img.jsp,可以得到正确的识别号码,但这样调用,就没法同步得到cookie