您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

通过curl模拟Post数据到页面后提示验证码错误,求觖求

2024/3/18 1:33:05发布22次查看
目标站:http://218.25.58.44/searchsys/
我的源码如下:
现在问题是:返回结果“验证码错误”,也就是验证码失效了。求指点!
我在csdn上查阅了相关资料,但还是弄不太明白。说是应该带cookie一起post 。我主要对这个流程没太懂,如何来保证我取到的验证码是与cookie一致?目前验证码识别问题我已经成功了。
多谢高手指点!
回复讨论(解决方案) 用抓包工具 把所有发生的数据传输都做一个分析 完后保证传输的数据一致即可.
至于cookie 打开页面的时候读取保存 发送的时候带上 具体的可以看 curl的相关参数.
至少在获取验证码图片时需要有
curl_setopt($ch, curlopt_cookiejar, $cookiefile);
$cookiefile:保存cookie的文件名
发送数据到目标页时,需要携带cookie
curl_setopt($ch, curlopt_cookiefile, $cookiefile);
问题是,怎么保证验证码不失效?或者这么说吧,怎么能在我用curl get模拟访问http://218.25.58.44/searchsys/页面时,同时把验证码也保存下来?就是访问得到数据后,验证码缓存到本地,能吗?
至少在获取验证码图片时需要有
curl_setopt($ch, curlopt_cookiejar, $cookiefile);
$cookiefile:保存cookie的文件名
发送数据到目标页时,需要携带cookie
curl_setopt($ch, curlopt_cookiefile, $cookiefile);
那么验证码那块呢?我就算带上了cookie,可是当我调用验证码识别函数的时候,它就重新生成了验证码!难道说我应该模拟访问生成验证码的文件(img.jsp)?这块不太一解,还请指点
我已经说了 在获取验证码图片时需要同时获取cookie
因为验证码是保存在 session 中的,并将 sessionid 放在 cookie 里
提交时绝不可以再去读cookie,读了将可能改变 sessionid
而必须将先前读到的cookie发送回去
逻辑就如图中所示,但愿你能看懂
我已经说了 在获取验证码图片时需要同时获取cookie
因为验证码是保存在 session 中的,并将 sessionid 放在 cookie 里
提交时绝不可以再去读cookie,读了将可能改变 sessionid
而必须将先前读到的cookie发送回去
问题是怎么同时?“ 在获取验证码图片时需要同时获取cookie”,谢谢,可以详细说一下吗?多谢了。
我已经说了 在获取验证码图片时需要同时获取cookie
因为验证码是保存在 session 中的,并将 sessionid 放在 cookie 里
提交时绝不可以再去读cookie,读了将可能改变 sessionid
而必须将先前读到的cookie发送回去
问题是怎么同时?“ 在获取验证码图片时需要同时获取cookie”,谢谢,可以详细说一下吗?多谢了。
跟你遇到过一样的问题  验证码识别函数每次都会再次读取一下那个验证码生成的地址 导致 提交的不一致..... 你试试当页面载入后的验证码 保存到临时文件夹 在调用临时文件夹里面识别验证码 在提交 试试 
感谢8楼,可是能具体说下吗?我不知道用什么语句来取得页面截入后的验证码,即保存到临时文件夹的验证码,这个用php语句怎么实现呢?多谢
比如说,我用下面的代码来访问页面
$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);
比如:
$cookiefile = realpath('123.txt');
curl_setopt($ch, curlopt_cookiejar, $cookiefile);
$output = curl_exec($ch) 后,文件 123.txt 中保存有取回的 cookie
以后再 curl_setopt($ch, curlopt_cookiefile, $cookiefile); 就可以将 cookie 传回去了
我想我说的再清楚不过了
版主可以加q说下吗?还是没理解呀,你说的挺明白,可我的问题在不这儿。我q:9174059 希望能加下,多谢版主!
比如:
$cookiefile = realpath('123.txt');
curl_setopt($ch, curlopt_cookiejar, $cookiefile);
$output = curl_exec($ch) 后,文件 123.txt 中保存有取回的 cookie
以后再 curl_setopt($ch, curlopt_cookiefile, $cookiefile); 就可以将 cookie 传回去了
我想我说的再清楚不过了
按你说的做了,在没有带cookie时,提示“验证码已失效”,按你说的加上cookie后,提示变了“验证码错误”,我感觉还是我取到的验证码没能同步,就是我取到的码是“重新生成”的码。求解!
贴出你的代码,不要截图!(可删节,但通讯部分必须完整)
贴出你的代码,不要截图!(可删节,但通讯部分必须完整)
代码如下:
get_by_curl(http://218.25.58.44/searchsys/);//得到cookiegetgjwzresult('小型汽车','辽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('','',$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;}
你在 get_yzm() 函数中获取了 cookie 吗?(从代码中看不出来)
通常验证码值是在验证码图片生成时写入 session 的,如果你不能取得此时的 sessionid,那么验证是不会成功的
简单的说,至少在取图片的时候就要保存一次cookie(页面的cookie反而不重要)
提交时再把这个cookie发回去(一并提交)
就是说 http://218.25.58.44/searchsys/img.jsp 的cookie要得到
看了一下连接:
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 一并发过去
看了一下连接:
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 一并发过去
按您说的改了代码,可是还是提示验证码错误!
get_by_curl(http://218.25.58.44/searchsys/);//得到cookieecho $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('','',$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;}
代码粘错了,我是这样改的,但出现了n多错误。主要是验证码图片那块语句不知道怎么写了。
get_by_curl(http://218.25.58.44/searchsys/);//得到cookieecho $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('','',$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;}
我不知道你的 valite 类是如何写的
但从 $valite->setimage(http://218.25.58.44/searchsys/img.jsp); 就可知道是又发起了一次独立的 http 请求,因此 sessionid 就被改变了
阿。。神一样的回复
我不知道你的 valite 类是如何写的
但从 $valite->setimage(http://218.25.58.44/searchsys/img.jsp); 就可知道是又发起了一次独立的 http 请求,因此 sessionid 就被改变了
你看的是我粘错的代码,下边的才是我改后的,出了n多错误。
主要就是你说的第2步那块,不知道怎么写了!“验证码图片 http://218.25.58.44/searchsys/img.jsp
从这个 url 获取图片流时,需将第1步读取的 cookie 发过去”
那得修改你的 valite 类
让他可以接受图片数据,而不是 url
valite就是接收的图片数据,问题是我现在不知道怎么写语句来取到http://218.25.58.44/searchsys/img.jsp这个图片类型的数据。我用curl get http://218.25.58.44/searchsys/img.jsp 后,得到的输入结果是乱码,要是能得出图片就能ok了。
jfifc    $.' ,#(7),01444'9=82z?环?`9?'裣?格 找翁?撤l?%k8?觥_?(h9' +leeg巢?x?1?-?q?_5?5?. ? ? ?椟胪t?泷:j?嬷`%?銮ㄠ?+'u_/p? ?>钽?3?锷4qmn:?
那得修改你的 valite 类
让他可以接受图片数据,而不是 url
现在问题就出在验证码这块儿,怎么才能在识别的验证码的同时,又取得同步的cookie?
我的识别验证码的函数的参数应该是个url或path+filename,但我不知道怎么用curl取得验证码(我用curl get http://218.25.58.44/searchsys/img.jsp根本就得不到图片类型的验证码)并得到cookie
如果你需要我帮你修改 valite,那么你至少需要给我他的代码
你的函数中都有 curl_setopt($ch, curlopt_returntransfer, true);
那么为什么抓取图片时就没有呢
如果你需要我帮你修改 valite,那么你至少需要给我他的代码
你的函数中都有 curl_setopt($ch, curlopt_returntransfer, true);
那么为什么抓取图片时就没有呢
不行啊,源码太长了,发不上来!如果可以的话,能不能给我个邮箱,我把源码发过去,您帮我看下,行吗?
如果你需要我帮你修改 valite,那么你至少需要给我他的代码
你的函数中都有 curl_setopt($ch, curlopt_returntransfer, true);
那么为什么抓取图片时就没有呢
这是部分源码:
class valite{ public function setimage($image) { $this->imagepath = $image; } public function getdata() { return $this->data; }
这个验证函数应该是这样的 返回类型:4位数字 参数:图片文件的路径,可是怎么调用呢?要是简单的调用http://218.25.58.44/searchsys/img.jsp,可以得到正确的识别号码,但这样调用,就没法同步得到cookie
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product