本篇文章主要是解說怎樣模擬登錄CSDN。使用的工具是HttpClient+Jsoupjavascript
當中HttpClient主要是負責發送請求,而Jsoup主要是解析HTMLhtml
你可能對HttpClient的API不太瞭解,只是不要緊。往下看就行了~java
Jsoup的語法相似jQuery的選擇器。相信有必定web基礎的人都可以很是快的掌握web
當中select(String selector)就是最強大的選擇器。另外還提供一系列的細化的方法,比方:chrome
getElementById(String id), getElementsByClass(String class), getElementsByTag(String tagName)編程
是否是很是親切?對~這個就跟javascript的方法相似了~小程序
因此Jsoup對於開發WEB的朋友的學習成本是至關的低的!那麼,繼續吧騷年!工具
可能你對HttpClient的API不熟悉。那麼怎樣在項目中高速使用HttpClient呢?post
這裏已經封裝了兩個最常常使用的get和post請求方法,因此以前就讓你別操心啦~^_^學習
假設不想花時間看API的話直接拿去用就可以了
/** * Http工具類 * * @author Zhu * */ public class HttpUtils { private static CloseableHttpClient httpClient = HttpClients.createDefault(); private static HttpClientContext context = new HttpClientContext(); private HttpUtils() { } public static String sendGet(String url) { CloseableHttpResponse response = null; String content = null; try { HttpGet get = new HttpGet(url); response = httpClient.execute(get, context); HttpEntity entity = response.getEntity(); content = EntityUtils.toString(entity); EntityUtils.consume(entity); return content; } catch (Exception e) { e.printStackTrace(); if (response != null) { try { response.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return content; } public static String sendPost(String url, List<NameValuePair> nvps) { CloseableHttpResponse response = null; String content = null; try { // HttpClient中的post請求包裝類 HttpPost post = new HttpPost(url); // nvps是包裝請求參數的list if (nvps != null) { post.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8")); } // 運行請求用execute方法,content用來幫咱們附帶上額外信息 response = httpClient.execute(post, context); // 獲得對應實體、包含響應頭以及對應內容 HttpEntity entity = response.getEntity(); // 獲得response的內容 content = EntityUtils.toString(entity); // 關閉輸入流 EntityUtils.consume(entity); return content; } catch (Exception e) { e.printStackTrace(); } finally { if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } } return content; } }
現在get和post對你來講都已經垂手可得了。那麼開始模擬登錄吧~
/** * 獲取必要的登錄參數信息 * * @throws IOException */ private void fetchNecessaryParam() throws IOException { // 查看CSDN登錄頁面源代碼發現登錄時需要post5個參數 // name、password,另外三個在頁面的隱藏域中,a good start logger.info("獲取必要的登錄信息。。。。。"); // 這樣登錄不行,因爲第一次需要訪問需要拿到上下文context // Document doc = Jsoup.connect(LOGIN_URL).get(); String html = HttpUtils.sendGet(LOGIN_URL); Document doc = Jsoup.parse(html); Element form = doc.select(".user-pass").get(0); lt = form.select("input[name=lt]").get(0).val(); execution = form.select("input[name=execution]").get(0).val(); _eventId = form.select("input[name=_eventId]").get(0).val(); logger.info("獲取成功。。。。
。"); }
private boolean mockLogin() { logger.info("開始登錄。。。
。。"); boolean result = false; List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("username", username)); nvps.add(new BasicNameValuePair("password", password)); nvps.add(new BasicNameValuePair("lt", lt)); nvps.add(new BasicNameValuePair("execution", execution)); nvps.add(new BasicNameValuePair("_eventId", _eventId)); String ret = HttpUtils.sendPost(LOGIN_URL, nvps); if (ret.indexOf("redirect_back") > -1) { logger.info("登錄成功。。。。
。"); result = true; } else if (ret.indexOf("登陸太頻繁") > -1) { logger.info("登陸太頻繁。請稍後再試。
。
。
。
。
"); } else { logger.info("登錄失敗。。。。。"); } return result; }