想用HttpClient登录某个外国网站,验证码已经识别出来了,但是用post登录总是跳转回登录页面

问题描述

我想模拟登录一个界面,登陆界面有验证码,我就通过get获取验证码保存到本地,通过ocr识别了验证码,再通过post填写表单数据,发送出去,响应回来的是200,不是302;通过html源码,返回回来的是验证码错误,难道get请求和post请求的不是一张验证码,难道是cookie不一致,httpclient应该具有自动处理cookie的功能啊,搞了一天没成功,郁闷的要死,求大神给点解决的方法,如何保证get和post请求的是同一张验证码下面是我的代码publicclassImitateLogin{privateBufferedImageimg;privateStringpicName="pic\"+"pic.jpg";privateStringpath="D:\tesseract-ocr\Tesseract-OCR\doc\pic.jpg";privateStringtext;privateStringgetCookies;@SuppressWarnings("deprecation")@Testpublicvoidlogin()throwsHttpException,IOException{HttpClienthttpClient=newHttpClient();//设置cookie策略httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);httpClient.getParams().setParameter("http.protocol.single-cookie-header",true);//发送登录请求GetMethodgetMethod=newGetMethod("http://libertagia.com/pages/captcha?"+Math.random());getMethod.setRequestHeader("User-Agent","Mozilla/5.0(WindowsNT6.1;WOW64;rv:11.0)Gecko/20100101Firefox/11.0");getMethod.setRequestHeader("Host","libertagia.com");getMethod.setRequestHeader("Connection","Keep-Alive");getMethod.setRequestHeader("Accept","image/png,image/*;q=0.8,*/*;q=0.5");try{//发送请求intstatusCode=httpClient.executeMethod(getMethod);//响应错误if(statusCode!=HttpStatus.SC_OK){System.err.println("Methodfailed:"+getMethod.getStatusLine());return;}Stringget=GetCookies(httpClient);System.out.println(get);InputStreaminputStream=getMethod.getResponseBodyAsStream();OutputStreamoutStream=newFileOutputStream(picName);IOUtils.copy(inputStream,outStream);outStream.close();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}finally{//释放连接getMethod.releaseConnection();}//读取保存的验证码try{//去除背景色img=OCRUtil.removeBackground(picName);//进一步去除黑点BufferedImagepicture=OCRUtil.removeBlack(img);//保存验证码ImageIO.write(img,"JPG",newFile(path));//检索验证码text=OCRUtil.recognize(newFile(path));System.out.println(text);}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}PostMethodpostMethod=newPostMethod("http://libertagia.com/login");HttpMethodParamsparams=postMethod.getParams();params.setContentCharset("UTF-8");//设置编码//参数设置List<NameValuePair>nameValues=newArrayList<NameValuePair>();//设置参数列表nameValues.add(newNameValuePair("data[Member][email]","993214132@qq.com"));nameValues.add(newNameValuePair("data[Member][password]","65504821"));nameValues.add(newNameValuePair("data[Captcha][captcha]",text));//头设置List<Header>headers=newArrayList<Header>();headers.add(newHeader("User-Agent","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)"));headers.add(newHeader("Accept","text/html,application/xhtml+xml,*/*"));headers.add(newHeader("Referer","http://libertagia.com/login"));headers.add(newHeader("Connection","Keep-Alive"));headers.add(newHeader("Host","libertagia.com"));httpClient.getHostConfiguration().getParams().setParameter("http.default-headers",headers);postMethod.setRequestBody((NameValuePair[])nameValues.toArray(newNameValuePair[nameValues.size()]));//添加参数列表intc=httpClient.executeMethod(postMethod);System.out.println(c);}privatestaticStringGetCookies(HttpClientclient){Stringtmpcookies="";Cookie[]cookies=client.getState().getCookies();for(Cookiec:cookies){tmpcookies+=c.toString()+";";}returntmpcookies;}}publicclassOCRUtil{privatestaticfinalStringEOL=System.getProperty("line.separator");publicstaticBufferedImageremoveBackground(Stringfile)throwsIOException{Filef=newFile(file);BufferedImageimg=ImageIO.read(f);intwidth=img.getWidth();intheight=img.getHeight();for(intx=0;x<width;++x){for(inty=0;y<height;++y){if(isWhite(img.getRGB(x,y))==1){img.setRGB(x,y,Color.WHITE.getRGB());}else{img.setRGB(x,y,Color.BLACK.getRGB());}}}returnimg;}privatestaticintisWhite(intrgb){Colorcolor=newColor(rgb);if(color.getRed()+color.getBlue()+color.getGreen()>=550){return1;}return0;}publicstaticBufferedImageremoveBlack(BufferedImageimg)throwsException{intwidth=img.getWidth();intheight=img.getHeight();for(intx=0;x<width;x++){b:for(inty=0;y<height;y++){intrgb=img.getRGB(x,y);if(getColorRGB(rgb)<100){intright,left,top,below;//取周圍的圖形rgbif(x>0&&y>0){if(x+1<=width-1){right=img.getRGB(x+1,y);left=img.getRGB(x-1,y);}else{break;}if(y+1<=height-1){top=img.getRGB(x,y+1);below=img.getRGB(x,y-1);}else{breakb;}if(getColorRGB(right)<100|getColorRGB(left)<100|getColorRGB(top)<100|getColorRGB(below)<100){img.setRGB(x,y,Color.BLACK.getRGB());}else{img.setRGB(x,y,Color.WHITE.getRGB());}right=0;left=0;top=0;below=0;}}}}returnimg;}privatestaticintgetColorRGB(intrgb){Colorcolor=newColor(rgb);returncolor.getRed()+color.getBlue()+color.getGreen();}publicstaticStringrecognize(FileimageFile)throwsException{FileoutputFile=newFile(imageFile.getParentFile(),"output");StringBufferstrB=newStringBuffer();List<String>cmd=newArrayList<String>();cmd.add("tesseract");cmd.add(imageFile.getName()+"");cmd.add(outputFile.getName());ProcessBuilderpb=newProcessBuilder();pb.directory(imageFile.getParentFile());cmd.set(1,imageFile.getName());pb.command(cmd);pb.redirectErrorStream(true);Processprocess=pb.start();intw=process.waitFor();//deletetempworkingfiles//imageFile.delete();if(w==0){//0代表正常退出BufferedReaderin=newBufferedReader(newInputStreamReader(newFileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));Stringstr;while((str=in.readLine())!=null){strB.append(str).append(EOL);}in.close();}else{Stringmsg;switch(w){case1:msg="Errorsaccessingfiles.Theremaybespacesinyourimage'sfilename.";break;case29:msg="Cannotrecognizetheimageoritsselectedregion.";break;case31:msg="Unsupportedimageformat.";break;default:msg="Errorsoccurred.";}thrownewRuntimeException(msg);}//newFile(outputFile.getAbsolutePath()+".txt").delete();Stringtext=strB.toString();char[]c=text.toCharArray();Stringpattern=";:,'‘?$@-."?_~—/<’][";for(inti=0;i<c.length;i++){if(pattern.contains(c[i]+"")){c[i]='';}}Stringstring=newString(c);Stringt=string.replaceAll("\s{1,}","");returnt.toLowerCase().trim();}}

解决方案

解决方案二:
发代码不用格式化工具,没法看

时间: 2024-09-22 21:28:02

想用HttpClient登录某个外国网站,验证码已经识别出来了,但是用post登录总是跳转回登录页面的相关文章

为嘛总是跳转回登录界面?

问题描述 登录代码:<divid="loginButton"><asp:ImageButtonID="ImageButton1"runat="server"ImageUrl="images/login.gif"OnClick="ImageButton1_Click"/><asp:ImageButtonID="ImageButton2"runat="

asp.net做一个无登录的投票网站用什么作为唯一标识来防止刷票

问题描述 asp.net做一个无登录的投票网站用什么作为唯一标识来防止刷票 asp.net做一个无登录的投票网站用什么作为唯一标识来防止刷票,还有手机端的用什么来防止刷票,手机端只是网页不是app 解决方案 自己顶一下,高手快来呀

打开一个页面要是没有cookies,会自动跳转到登录页面

问题描述 打开一个页面要是没有cookies,会自动跳转到登录页面 我做个网站,想要通过cookie实现登录.如果复制该网址在浏览器中打开的时候会自动跳转到login页面,怎么写 解决方案 cookie不能跨浏览器共享,标签式浏览器,你在一个标签登录保存cookie后,其他标签都会共享cookie,你要判断直接输入的地址不允许访问自己加个来源判断,不允许为空,要不cookie是存在肯定可以访问你页面的 解决方案二: 你用什么技术做的网站呢?jQuery提供了cookie插件 jquery.coo

初学ios网络编程,想请教下如何向有用户名密码登录功能的网站发送请求

问题描述 初学ios网络编程,想请教下如何向有用户名密码登录功能的网站发送请求 如何将本地输入的用户名密码发送到服务器?是该用ns的什么方法?最好是swift 解决方案 http://download.csdn.net/detail/wangting/6896741

用户登录,跳转另一网站,怎么自动登录另一网站,已知用户名和密码

问题描述 对接用户登录,跳转另一网站,怎么自动登录另一网站,已知用户名和密码 解决方案 解决方案二:http://bbs.csdn.net/topics/340186967解决方案三:我想要对接别的网站,我知道了用户名和密码然后直接从我网站登录到别的网站解决方案四:看对方网站登陆页面的要求PSOT或者GET提交用户名和密码解决方案五:引用3楼caoqinghua的回复: 看对方网站登陆页面的要求PSOT或者GET提交用户名和密码 正解解决方案六:引用4楼liqz2009的回复: Quote: 引

JSP实现登录功能之添加验证码_JSP编程

jsp登陆验证,网页登陆验证带验证码校验,登录功能之添加验证码 part_1:专门用于生成一个验证码图片的类:VerificationCode.Java package cn.mike.javase.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.i

计算机-请问为什么不能登录路由器设置网站了??

问题描述 请问为什么不能登录路由器设置网站了?? 路由器设置过一次后以后再登录路由器设置网站就不行了.是tp-link的的路由器.大学寝室里的.路由器通过校园网.小弟求问,想问问解决方法和原理. 解决方案 网站打错了啊啊啊啊啊 解决方案二: 重置下路由器,你在已以下你应该ip重新进入下你应该是把192.168.1.1或192.168.0.1给改了. 解决方案三: 估计是你把路由器ip改了,或者是有的路由器限制无线端登陆,你要插网线试试 解决方案四: 这种问题比较奇葩,也比较常见,但具体是什么原因

android端http模拟登录某一网站并保存cookie做一些登录后的操作,求帮助

问题描述 android端http模拟登录某一网站并保存cookie做一些登录后的操作,求帮助 我用android端调用某网站的登陆接口,获取他的cookie并且保存下来,之后我定位到这个网站的一篇帖子并写请求去发帖,当然传入我登录时返回的cookie, 可是根据返回的结果查看,并没有登陆上去, 请各位帮我参谋一下 不胜感激 cookies = httpClient.getCookieStore();拿到cookies requestParams.addHeader("Referer"

discuz!-我自己开发了一个小网站,怎么使用discuz的帐号密码登录我这个网站呢

问题描述 我自己开发了一个小网站,怎么使用discuz的帐号密码登录我这个网站呢 我自己开发了一个小网站,怎么使用discuz的帐号密码登录我这个网站呢?discuz的论坛是我的,我想让会员可以直接用discuz的帐号密码直接登录我自己做的网站. 解决方案 http://www.cnblogs.com/kenkofox/archive/2011/09/18/2180649.html 解决方案二: http://download.csdn.net/detail/zhanjianhua/820062