读书人

HttpClient登录百度无法成功求解决

发布时间: 2013-04-07 12:50:11 作者: rapoo

HttpClient登录百度无法成功,求解决,问题何在?
模拟登录百度,但始终登录失败
代码:
HttpManager写法


package cn.zhou.test;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.CookiePolicy;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;

public class HttpManager {
public static final String DEFAULT_CHARSET = "UTF-8";
private static final HttpManager instance = new HttpManager();
private DefaultHttpClient client = new DefaultHttpClient();
private HttpManager(){
HttpClientParams.setCookiePolicy(client.getParams(),CookiePolicy.BROWSER_COMPATIBILITY);
client.getParams().setParameter("http.protocol.single-cookie-header", true);
CookieStore cookieStore = new BasicCookieStore();
cookieStore.addCookie(new BasicClientCookie("BDUSS", "VpBeHNMMUVuQ0o3c2pXZ0tQYXB3SWpjTG1rZTVvQzZ3OHRaTHpDTkZVSm00RkpSQVFBQUFBJCQAAAAAAAAAAAEAAABtnVkYyvq-ocC0vdkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZTK1FmUytRR"));
cookieStore.addCookie(new BasicClientCookie("BAIDUID", "1BE2294325A5959BFC652195D4C6754F:FG=1"));
cookieStore.addCookie(new BasicClientCookie("BAIDU_WISE_UID", "EAC7E7B67B6423D0053B993B87A7DC2A"));
client.setCookieStore(cookieStore);
}
public static HttpManager getHttpManager(){
return instance;
}
/**
* 执行一个HTTP GET请求,返回请求响应的HTML
*
* @param url
* 请求的URL地址
* @param queryString
* 请求的查询参数,可以为null
* @return 返回请求响应的HTML
*/
public String doGet(String url, Map<String, Object> queryParams) {
StringBuffer sb = new StringBuffer();
HttpGet method = new HttpGet(url);
if (queryParams != null) {
HttpParams params = new BasicHttpParams();
for (Map.Entry<String, Object> pv : queryParams.entrySet()) {
params.setParameter(pv.getKey(), pv.getValue());
}
method.setParams(params);
}
BufferedReader br = null;
try {
HttpResponse response = client.execute(method);
HttpEntity entity = response.getEntity();
InputStream ips = entity.getContent();
br = new BufferedReader(new InputStreamReader(ips, DEFAULT_CHARSET));


String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
method.releaseConnection();
}
return sb.toString();
}

/**
* 执行一个HTTP POST请求,返回请求响应的HTML
*
* @param url
* 请求的URL地址
* @param params
* 请求的查询参数,可以为null
* @return 返回请求响应的HTML
*/
public String doPost(String url, Map<String, String> queryParams) {
StringBuffer sb = new StringBuffer();
HttpPost method = new HttpPost(url);
if (queryParams != null && queryParams.size() > 0) {
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
NameValuePair nvp = new BasicNameValuePair(entry.getKey(),
(String) entry.getValue());
nvps.add(nvp);
}
method.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
method.setHeader("ContentType", "application/x-www-form-urlencoded");

}
System.out.println("before post:");
printCookies(client.getCookieStore().getCookies());
try {
HttpResponse response = client.execute(method);
HttpEntity entity = response.getEntity();
System.out.println("after post");
printCookies(client.getCookieStore().getCookies());
System.out.println("Login form get: " + response.getStatusLine());
return getHttpResponseContent(entity);
} catch (Exception e) {
} finally {
method.releaseConnection();
}
return null;
}

private void printCookies(List<Cookie> cookies) {
if (cookies.isEmpty())
{
System.out.println("No cookies");
}
else
{
for (Cookie c : cookies)
{
System.out.println("-" + c.toString());
}
}
}
private static String getHttpResponseContent(HttpEntity entity) {
if (entity == null)
return null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
entity.writeTo(baos);
return new String(baos.toByteArray(), DEFAULT_CHARSET);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}

public void closeQuietly(){


client.getConnectionManager().shutdown();
}
}



登录百度:

public static void loginWeb(){
UserModel user = new UserModel();
user.setId("kexin_bo");
user.setPwd("*******");
HttpManager.getHttpManager().doGet(BaiduConstants.WEB_LOGIN_PAGE, null);
String tokenPage = HttpManager.getHttpManager().doGet(BaiduConstants.WEB_LOGIN_TOKEN_PAGE, null);
String token = BaiduUtils.regex(tokenPage, "(?<=(login_token='))[^']+");
String loginResultPage = HttpManager.getHttpManager().doPost(BaiduConstants.WEB_LOGIN_POST_PAGE, BaiduUtils.getWebLoginForm(user, token));
String loginResult = BaiduUtils.regex(loginResultPage, "(?<=(jump.html\\?error=))\\d+");
boolean isLoginSuccess = false;
if("0".equals(loginResult)){
isLoginSuccess = true;
System.out.println("登录成功!");
}else if("1".equals(loginResult)){
System.out.println("账号格式错误!");

}else if("2".equals(loginResult)){
System.out.println("账号不存在!");
}else if("4".equals(loginResult)){
System.out.println("密码错误");
}else{
System.out.println("登录失败:"+loginResult);
}
System.out.println();
if(!isLoginSuccess){
return;
}
}

输出结果:
before post:
-[version: 1][name: BAIDUID][value: C14B600D8332EA3044BBC8337E12BC53:FG=1][domain: .baidu.com][path: /][expiry: Thu Feb 19 00:05:23 CST 2043]
after post
-[version: 1][name: BAIDUID][value: C14B600D8332EA300C58B3599CDCD6BF:FG=1][domain: .baidu.com][path: /][expiry: Thu Feb 19 00:05:23 CST 2043]
Login form get: HTTP/1.1 200 OK
登录失败:119998

无法访问登录后的内容。
这是百度做校验了?浏览器能访问,模拟浏览器httpClient理论上肯定也可以,该如何写?
java?HttpClient?百度
[解决办法]
看看是否需要输入验证码啥的,防火墙是否关闭
[解决办法]
清空cookie,清空缓存试下
[解决办法]
在你使用httpclient来做相关模拟登陆的时候,你最好是把浏览器的js禁用掉,因为,有的时候是通过js来发生改变,但是httpclient不能使用js.所以你禁用js来调试试试

藏章博客
[解决办法]
我以前做过一个百度自动登录签到软件(java swing),你可以参考参考:
http://pan.baidu.com/share/link?shareid=251715&uk=2885709842
因为考虑到某些原因,如果登录需要验证码的,程序不能进行,需要在某处添加一行代码(我删掉了一行)。
如果不需要验证码的,当然没问题了。
需要那行代码的可以联系我:hhaosjx@qq.com
[解决办法]
楼主,你这个程序都使用了什么jar包吗,我想调试一下但是不知道你用的什么jar
[解决办法]
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;


public class sha {
public static void main(String[]ags) throws HttpException, IOException{
String url="http://www.baidu.com/s";
PostMethod post=new PostMethod(url);
GetMethod get=new GetMethod(url);
NameValuePair name=new NameValuePair("wd","游隼");


post.setRequestBody(new NameValuePair[]{name} );
get.setQueryString(new NameValuePair[]{name});
HttpClient client=new HttpClient();
int m=client.executeMethod(get);
//System.out.println("执行返回代码 "+m);
System.out.println(get.getResponseBodyAsString());
File file=new File("d:\\123.html");
PrintWriter p=new PrintWriter(file);
p.append(get.getResponseBodyAsString());
System.out.println("网页已经生成!!!");















}






}

[解决办法]
楼主,没用的,最新的百度不再直接把登陆框加载出来了,而是采用js去加载,除非你把它的js代码研究透了,写个java代码模拟js,才可以得到最终的token和verifycodestring,这个实在是太麻烦了...
[解决办法]
一年多前我就用httpClient登百度,期间百度多次改变其前台代码,每次都要费不少精力去摸索新的登录方法,烦了,不玩了。

读书人网 >J2SE开发

热点推荐