開發 QQ 機器人時,最讓初學者頭痛的莫過於「需要 Cookie 才能存取的網址」這類驗證機制。以 QQ 登入流程為例,首先請求 https://ssl.ptlogin2.qq.com/ptqrshow?appid=501004106&e=0&l=M&s=5&d=72&v=4&t=0.4139144900254905 取得二維碼與初始 Cookie,接著必須攜帶該 Cookie 才能呼叫 ptqrlogin 介面完成掃碼驗證。若在程式碼中手動拼接 Cookie 极易出錯,且難以應對動態更新的情況。
Java 生態中成熟的 Apache HttpClient 內建 CookieStore 機制,能自動完成「攔截 Set-Cookie → 儲存 → 後續請求自動帶上」的完整流程。具體步驟如下:
CloseableHttpClient 實例,並掛載 BasicCookieStore。ptqrshow),HttpClient 會自動將回應標頭中的 Set-Cookie 寫入 CookieStore。ptqrlogin 請求時,同一個 HttpClient 會自動把 CookieStore 裡符合域名/路徑的 Cookie 加入 Cookie 標頭,完全無需手動操作字串。// 1. 準備自動管理 Cookie 的客戶端
CookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient client = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
// 2. 第一步:取得二維碼並自動接收 Cookie
HttpGet getQr = new HttpGet("https://ssl.ptlogin2.qq.com/ptqrshow?appid=501004106&e=0&l=M&s=5&d=72&v=4");
try (CloseableHttpResponse resp = client.execute(getQr)) {
// 此處可讀取 resp.getEntity() 取得圖片流
// Cookie 已自動存入 cookieStore
}
// 3. 第二步:攜帶 Cookie 輪詢掃碼狀態
HttpGet checkLogin = new HttpGet("https://ssl.ptlogin2.qq.com/ptqrlogin?webqq_type=10&remember_uin=1&login2qq=1&aid=501004106...");
try (CloseableHttpResponse resp = client.execute(checkLogin)) {
String result = EntityUtils.toString(resp.getEntity());
// 解析 result 判斷是否登入成功
}
若仍遇到「程式碼能跑但就是登不進去」的情況,建議啟動 Fiddler 抓取瀏覽器與程式的完整 HTTP 交互,重點比對:
Cookie 欄位是否一致pt_local_token、login_sig 等)是否遺漏通過對比,能快速定位「少傳了哪個 Header」或「參數編碼錯誤」等問題。
https://xui.ptlogin2.qq.com/ 或同域頁面。TrustAllStrategy(僅限開發階段)。掌握 HttpClient 的 Cookie 自動管理,不僅能輕鬆攻克 QQ 機器人登入,同樣適用於所有「需維持 Session 狀態」的爬蟲與自動化場景。下次再遇到「手動拼 Cookie」的誘惑,請直接丟給 CookieStore 處理吧!