====== 用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 nvp = new ArrayList(); 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 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 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 nvp = new ArrayList(); 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(); } } }