User Tools

Site Tools


java:httpclient-xiaonei

用HttpClien实现登录校内

HttpClient能够保存cookie,用它可以轻松模拟浏览器登录网站的一些行为.

另外再借助于wireshark强大的分析功能,得到每次POST/GET的具体参数,再将这些参数设进去,模拟浏览器的POST/GET行为,就可以不用浏览器也能登录一些网站了.

这里以校内开刀,整个过程还算顺利,由于对HttpClient的用法不是很熟悉,花了一些时间学习HttpClient Examples.

这里先把实现代码贴在这里,具体的分析实现过程等有空再整理到博客上.

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
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.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
 
public class Xiaonei {
	static final String tag = "xiaonei";
	static String loginUri = "http://www.renren.com/PLogin.do";
	static String username = "your email";
	static String password = "your password";
	static String originUrl = "http://www.renren.com/Home.do";
	static String domain = "renren.com";
 
	static String userAgent = "Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.2) Gecko/20090803 Fedora/3.5.2-2.fc11 Firefox/3.5.2";
 
	static String postStatusUrl = "http://status.renren.com/doing/update.do?";
 
	public static void loginAndPostStatus() {
		HttpParams params = new BasicHttpParams();
		HttpProtocolParams.setUserAgent(params, userAgent);
 
		SchemeRegistry schemeRegistry = new SchemeRegistry();
		schemeRegistry.register(new Scheme("http", PlainSocketFactory
				.getSocketFactory(), 80));
		ClientConnectionManager cm = new ThreadSafeClientConnManager(params,
		schemeRegistry);
 
		DefaultHttpClient httpClient = new DefaultHttpClient(cm,params);
		// HttpHost proxyHost = new HttpHost("127.0.0.1", 5865, "http");
		// httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,
		// proxyHost);
		httpClient.getParams().setParameter(HTTP.USER_AGENT, userAgent);
 
		HttpPost httpPost = new HttpPost(loginUri);
		List<NameValuePair> nvp = new ArrayList<NameValuePair>();
		nvp.add(new BasicNameValuePair("email", username));
		nvp.add(new BasicNameValuePair("password", password));
		nvp.add(new BasicNameValuePair("originUrl", originUrl));
		nvp.add(new BasicNameValuePair("domain", domain));
 
		String uri = null;
		String ticket = null;
		try {
			httpPost.setEntity(new UrlEncodedFormEntity(nvp, HTTP.UTF_8));
			HttpResponse response = httpClient.execute(httpPost);
 
			System.out.println("Post logon cookies:");
			List<Cookie> cookies = httpClient.getCookieStore().getCookies();
			if (cookies.isEmpty()) {
				System.out.println("None");
			} else {
				for (int i = 0; i < cookies.size(); i++) {
					// System.out.println("- " + cookies.get(i).toString());
				}
			}
 
			Log.e(tag, "" + response.getStatusLine());
			String entity = EntityUtils.toString(response.getEntity());
			// Log.e(tag, entity);
			uri = getUri(entity);
			Log.e(tag, "getUri=" + uri);
 
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
		if (null != uri) {
			HttpGet httpGet = new HttpGet(uri);
 
			try {
				HttpResponse response = httpClient.execute(httpGet);
				Log.e(tag, "" + response.getStatusLine());
				HttpEntity httpEntity = response.getEntity();
 
				if (null != httpEntity) {
					String entity = EntityUtils.toString(httpEntity);
 
					ticket = getTicket(entity);
					Log.e(tag, "ticket=" + ticket);
					// Log.e(tag, entity);
					httpEntity.consumeContent();
				}
 
				System.out.println("Post logon cookies:");
				List<Cookie> cookies = httpClient.getCookieStore().getCookies();
				if (cookies.isEmpty()) {
					System.out.println("None");
				} else {
					for (int i = 0; i < cookies.size(); i++) {
						// System.out.println("- " + cookies.get(i).toString());
					}
				}
 
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
 
		}
 
		postStatus(httpClient, "post status at" + System.currentTimeMillis(),
				ticket);
 
		httpClient.getConnectionManager().shutdown();
 
	}
 
	public static String getUri(String str) {
		return str.split("\"")[1];
	}
 
	public static String getTicket(String str) {
		str = str.split("publisher_form_ticket\" value=\"")[1];
		return str.split("\"")[0];
	}
 
	public static void postStatus(DefaultHttpClient httpClient, String status,
			String ticket) {
		HttpPost httpPost = new HttpPost(postStatusUrl);
 
		List<NameValuePair> nvp = new ArrayList<NameValuePair>();
		nvp.add(new BasicNameValuePair("c", status));
		nvp.add(new BasicNameValuePair("raw", status));
		String requestToken = ticket;
		nvp.add(new BasicNameValuePair("publisher_form_ticket", ticket));
		nvp.add(new BasicNameValuePair("requestToken", requestToken));
 
		try {
			httpPost.setEntity(new UrlEncodedFormEntity(nvp, HTTP.UTF_8));
			HttpResponse httpResponse = httpClient.execute(httpPost);
 
			Log.e(tag, "post status finished:" + httpResponse.getStatusLine());
 
			HttpEntity httpEntity = httpResponse.getEntity();
 
			if (null != httpEntity) {
				Log.e(tag, EntityUtils.toString(httpEntity));
			}
 
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
	}
}

/var/www/dokuwiki/wiki/data/pages/java/httpclient-xiaonei.txt · Last modified: 2016/05/05 13:07 by 127.0.0.1