本人之前用httpclient 3做了个自动登录网站的程序,实现的功能为登录网站,并在另一个页面post一个请求,请求时有图片验证码。登录功能没有问题,在后面的post之前,我先从网站用get方法获取这个最新的验证码图片,然后调用本地程序解析成正确的String,但是提交了之后还是回到这个提交页面。我用浏览器模拟了一下这些操作,提交成功的话应该是返回302,并转到另一个page。如果是验证码错误,就会返回200,并回到提交的页面,原来的字段输入都会保存在页面上(用的应该是aspx的__VIEWSTATE和__EVENTVALIDATION)但不会提示验证码错误。
就因为网站本身不会提示验证码错误,所以我程序返回200,并回到原来的页面我就无从判断到底是什么原因,因为我在本地程序里看到的验证码的确是解析正确的。猜测会不会是cookie的问题,但我登录之后,每次操作前都会获取一下cookie,并且在get或者post前,用httpclient再把cookie set回request里,这样跳转页面的话,session还能保持的。或者是验证码重复刷新的问题,但是我用fiddler看过浏览器的请求过程,它先用get获取那个要提交的页面,然后会自动用get获取那个验证码,再人工点击提交form。我只不过是直接用get获取了那个验证码,然后post提交了那个页面。也怀疑过是aspx的__VIEWSTATE和__EVENTVALIDATION,在我的post request里有这两个字段的值,每次用浏览器提交,似乎都是不变的,所以我直接写进request了。如果不包括这两个值,那么如果验证码错误的话,返回到提交页面,上面原来部分输入的字段就是空的要重新输入,所以这两个参数应该是用来记录页面信息并还原的。请有经验的朋友指教指教,如果能解决,立马结贴,谢谢!Httpclient 验证码登录 自动登录程序
就因为网站本身不会提示验证码错误,所以我程序返回200,并回到原来的页面我就无从判断到底是什么原因,因为我在本地程序里看到的验证码的确是解析正确的。猜测会不会是cookie的问题,但我登录之后,每次操作前都会获取一下cookie,并且在get或者post前,用httpclient再把cookie set回request里,这样跳转页面的话,session还能保持的。或者是验证码重复刷新的问题,但是我用fiddler看过浏览器的请求过程,它先用get获取那个要提交的页面,然后会自动用get获取那个验证码,再人工点击提交form。我只不过是直接用get获取了那个验证码,然后post提交了那个页面。也怀疑过是aspx的__VIEWSTATE和__EVENTVALIDATION,在我的post request里有这两个字段的值,每次用浏览器提交,似乎都是不变的,所以我直接写进request了。如果不包括这两个值,那么如果验证码错误的话,返回到提交页面,上面原来部分输入的字段就是空的要重新输入,所以这两个参数应该是用来记录页面信息并还原的。请有经验的朋友指教指教,如果能解决,立马结贴,谢谢!Httpclient 验证码登录 自动登录程序
解决方案 »
- 修改代码 显示结果
- myeclipse发布项目问题
- 怎么实现添加的时候Select 里面VALUE 或者TEXT 重复值 退出
- @interface如何??注释吗??
- java中如何判断字符是否存在数组中
- 触发器怎么用?在什么情况下用?最好举个简单例子,谢谢!
- 求教服务器问题 在线等 解决立即给分
- 大家帮个忙
- sql = "INSERT INTO INSERT_TAB(userorder,useraccount,insertdate) VALUES(userorder.nextval,username,sysdate)";
- 请大家说说一共有什么jsp服务器,以及他们的优、缺点
- 数据采集后页面显示怎么样保存那些临时的数据?怎么样效率最高呀?
- 登录
你用httpwatch看一下。这里有范例http://www.cnblogs.com/mayingbao/archive/2007/11/30/978530.html
client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT, "http");
client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
client.getParams().setParameter(HttpMethodParams.USER_AGENT,
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0");
HttpMethod method_post = getPostMethod(); // 使用 POST 方式提交数据
method_post.getParams().setParameter("http.protocol.cookie-policy",
CookiePolicy.BROWSER_COMPATIBILITY);
client.executeMethod(method_post);
method_post.releaseConnection();String tmpcookies = GetCookies(client);
GetCheckCode(client, tmpcookies); HttpMethod final_post = getFinalPostMethod(); final_post.getParams().setParameter("http.protocol.cookie-policy",
CookiePolicy.BROWSER_COMPATIBILITY);
tmpcookies = GetCookies(client);
final_post.setRequestHeader("cookie", tmpcookies);
client.executeMethod(final_post); int statuscode = final_post.getStatusCode();
if (statuscode == 200) {
String response = final_post.getResponseBodyAsString();
System.out.println(response);
//如果验证码错误,返回的应该是200
}
if (statuscode == 302) {
//如果验证码正确,并且正确提交,返回的应该是302
Header header = final_post.getResponseHeader("location");
newuri = header.getValue();
System.out.println("final_post newuri:" + newuri); if ((newuri == null) || (newuri.equals("")))
newuri = "/"; GetMethod redirect = new GetMethod(newuri);
tmpcookies = GetCookies(client);
redirect.setRequestHeader("cookie", tmpcookies);
client.executeMethod(redirect); System.out.println("==========Final Redirect:==========\n"
+ redirect.getStatusLine().toString());
System.out.println(redirect.getResponseBodyAsString());
redirect.releaseConnection();
}
final_post.releaseConnection();private static HttpMethod getPostMethod() {
PostMethod post = new PostMethod("/login.aspx");
NameValuePair username = new NameValuePair("name", "my name");
NameValuePair password = new NameValuePair("password", "pass");
post.setRequestBody(new NameValuePair[] { username, password}); return post;
}private static HttpMethod getFinalPostMethod() {
PostMethod post = new PostMethod("/finalpost.aspx?m1=100");
NameValuePair _EVENTTARGET = new NameValuePair("__EVENTTARGET", "");
NameValuePair _EVENTARGUMENT = new NameValuePair("__EVENTARGUMENT", "");
NameValuePair _VIEWSTATE = new NameValuePair(
"__VIEWSTATE",
"/asdfuovansodfhasdhsdfkasdf=");
NameValuePair _EVENTVALIDATION = new NameValuePair(
"__EVENTVALIDATION",
"/sdfgsdfasdfasdf==");
NameValuePair t1 = new NameValuePair("t1", "test");
NameValuePair t2 = new NameValuePair("t2", "[email protected]");
NameValuePair CheckCode = new NameValuePair("CheckCode", code);
post.setRequestBody(new NameValuePair[] { _EVENTTARGET, _EVENTARGUMENT,
_VIEWSTATE, _EVENTVALIDATION, t1, t2, CheckCode,
CheckCode });
post.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,
"UTF-8");
post.setRequestHeader("referer","http://fortest.com.cn/finalpost.aspx?m1=100"); return post;
}
private static String GetCookies(HttpClient client) {
String tmpcookies = "";
Cookie[] cookies = client.getState().getCookies();
for (Cookie c : cookies) {
tmpcookies += c.toString() + ";";
}
return tmpcookies;
}public static void GetCheckCode(HttpClient client, String tmpcookies)
throws HttpException, IOException {
/********** Get Checkcode **********/ GetMethod getcode = new GetMethod("/getCode.aspx");
getcode.setRequestHeader("cookie", tmpcookies);
client.executeMethod(getcode);
System.out.println("getting code status: "
+ getcode.getStatusLine().toString());
InputStream inStream = getcode.getResponseBodyAsStream();
BufferedImage iag = ImageIO.read(inStream);
//以下省略了较长的解析代码,弄成本地图片在本地解析,然后赋值到这个public类的String类型的code字段,code字段是在getFinalPostMethod方法中所使用到的。
}
post.setRequestBody(new NameValuePair[] { _EVENTTARGET, _EVENTARGUMENT,
_VIEWSTATE, _EVENTVALIDATION, t1, t2, CheckCode,
CheckCode });
上面多输入了一个CheckCode,实际代码里是没有的。
httpClient.getCookieStore().getCookies()
获取cookie,看看有没有set进去吧
还是说要new多个httpclient?
最近一直在研究验证码,有兴趣交流。