利用 Apache HttpClient 模擬瀏覽器發送 POST 請求完成登錄,後續可攜帶 Cookie 進行業務操作 (發帖、爬數據等)。核心難點在於獲取真實登錄表單參數與提交 URL。
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import java.util.ArrayList;
import java.util.List;
public class LoginSimulator {
public static void main(String[] args) throws Exception {
// 1. 創建客戶端 (自動管理 Cookie Store)
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 2. 構建 POST 請求
String loginUrl = "https://target-site.com/login.action"; // 抓包獲取
HttpPost httpPost = new HttpPost(loginUrl);
// 3. 設置表單參數 (抓包獲取的 name/value)
List formParams = new ArrayList<>();
formParams.add(new BasicNameValuePair("username", "your_user"));
formParams.add(new BasicNameValuePair("password", "your_pwd"));
formParams.add(new BasicNameValuePair("csrf_token", "extracted_token")); // 如有隱藏域
// 4. 設置實體與編碼 (目標站點編碼,抓包或嘗試 GBK/UTF-8)
httpPost.setEntity(new UrlEncodedFormEntity(formParams, "GBK"));
// 5. 模擬瀏覽器 Header (關鍵:防反爬)
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
httpPost.setHeader("Referer", "https://target-site.com/login.jsp");
// 6. 執行請求
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
int status = response.getStatusLine().getStatusCode();
String respBody = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println("Status: " + status);
System.out.println("Body: " + respBody);
// 7. 登錄成功後,httpClient 內部 CookieStore 已保存 Session Cookie
// 後續請求直接用同一 httpClient 實例即可自動攜帶 Cookie
}
}
}
}
| 場景 | 處理方案 |
|---|---|
| 驗證碼 | 簡單圖形驗證碼:下載圖片 → OCR 識別 (Tesseract/深度學習) → 填入表單。複雜滑動/點選:需 Selenium/WebDriver 真實瀏覽器自動化。 |
| 動態 Token / 簽名 | 分析 JS 加密邏輯 (斷點調試/逆向),Java 重現算法生成簽名;或嵌入 JS 引擎 (Nashorn/GraalVM) 直接調用原 JS。 |
| 重定向處理 | 登錄常返回 302 重定向。HttpClient 默認自動跟隨重定向 (可配置 `LaxRedirectStrategy`),最終落地頁即登錄後頁面。 |
| HTTPS / SSL | 信任所有證書 (測試用):自定義 `SSLConnectionSocketFactory` + `TrustStrategy` 返回 true。生產需導入正規 CA 證書。 |
| 連接池複用 | 高併發場景使用 `PoolingHttpClientConnectionManager` 共享連接池,配置 `MaxTotal`, `DefaultMaxPerRoute`。 |
⚠️ 僅用於授權測試、個人數據導出、學習研究。 未經授權繞過驗證、大規模爬取、暴力破解均屬違法。請遵守 `robots.txt`、網站服務條款、《網絡安全法》。