使用HttpClient登录到百度

使用HttpClient登录百度

       由于某些原因要java程序登录百度(www.baidu.com),使用了httpclient。但是httpclient现在更新到了4.X,比原来的3.X改变还是有很多!因此博主还是使用了httpclient3.X,能够获取的token以及cookie且完美成功登录,看了网上的一些文章都不能成功的登录,所以就自己研究了一下!不多说源码:

//要用到的包
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public String login() 
	{
		HttpClient httpClient = new HttpClient();
		httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
		//第一次登陆获取一个cookie
		GetMethod httpget = new GetMethod("https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true");
		try {
			httpClient.executeMethod(httpget);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		String token=null;
		//第二次登陆获取token
		GetMethod getToken=new GetMethod("https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true");
		try {
			httpClient.executeMethod(getToken);
		} catch (HttpException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//使用正则表达式得到token
		Pattern tokenp=Pattern.compile("bdPass.api.params.login_token='(.*?)';");
		Matcher m;
		try {
			m = tokenp.matcher(getToken.getResponseBodyAsString());
			if(m.find()){
			    token=m.group(1);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(token);
//正式进行登陆得到登陆后的Cookie至关重要
		PostMethod httppost = new PostMethod("https://passport.baidu.com/v2/api/?login");
		//传入登录请求post的数据
		httppost.setParameter("tpl", "mn");//这个值必须和前面的一样不然会出错
		        httppost.setParameter("callback","parent.bdPass.api.login._postCallback");
		        httppost.setParameter("staticpage","https://passport.baidu.com/v3Jump.html");
		        httppost.setParameter("codestring","");
		        httppost.setParameter("ppui_logintime", "10484");//随便写一个就是了
		        httppost.setParameter("u", "");
		        httppost.setParameter("charset","utf-8");
		        httppost.setParameter("index","0");
		        httppost.setParameter("password","******密码哇");//密码
		        httppost.setParameter("loginType","1");
		        httppost.setParameter("safeflg", "0");
		        httppost.setParameter("isphone", "false");
		        httppost.setParameter("username", "*******用户名呀");//登录用户名
		        httppost.setParameter("verifycode", "");
		        httppost.setParameter("mem_pass", "on");
		        httppost.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)");//摸似浏览器访问
		        httppost.setRequestHeader("Host","passport.baidu.com");
		        httppost.setParameter("token",token);//刚才得到的token。
		        httppost.setParameter("class", "login");
		        httppost.setParameter("tangram", "true");
		        try {
					httpClient.executeMethod(httppost);
					System.out.println(httppost.getResponseBodyAsString());
				} catch (HttpException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		       
		//获取登陆后的cookie
		Cookie[] cookies=httpClient.getState().getCookies();
		//cookie解析是一个StringBuffer。
		StringBuffer sb = new StringBuffer();
		for (Cookie cookie : cookies) {
			sb.append(cookie.getName()).append("=").append(cookie.getValue())
					.append(";");
		}
		if (sb.length() > 0)
			sb.deleteCharAt(sb.length() - 1);
		System.out.println("我是你们要的Cookie------->"+sb.toString());
		 return sb.toString();
}
//测试
public class a {
	private static final String HTTP_PROTROL = "http://";
	public final static String USER_AGENT_H = "User-Agent";
	//public final static String REFERER_H = "Referer";
	public final static String USER_AGENT = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22";
	//public final static String USER_AGENT = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)";
	private String host;
	private String CookieStr = null;
	public String getHost() {
		return host;
	}
	public void setHost(String host) {
		this.host = host;
	}
	public static void main(String[] args) throws Exception {
		a a = new a();
		String cookies = a.login();
		HttpClient client = new HttpClient();
		client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
		HttpMethod get = null;
		
		
		
		String url = "http://www.baidu.com";
		get = new GetMethod(url);
		get.setRequestHeader(USER_AGENT_H,USER_AGENT);
		get.setRequestHeader("Cookie", cookies);
		int status = client.executeMethod(get);
		System.out.println(cookies);
		if (status == HttpStatus.SC_OK) {
			InputStream in = get.getResponseBodyAsStream();
			System.out.println(get.getResponseBodyAsString());
}
}
//从输出的结果中你能看到自己的用户名以及你要的cookie;
 
  

你可能感兴趣的:(使用HttpClient登录到百度)