首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 模擬 HTTP Get/Post 請求實現論壇自動回帖功能

     編輯:Java 相關知識

前言

本文展示如何使用 Java 原生 HttpURLConnection 模擬瀏覽器進行 GET/POST 請求,實現對特定論壇(示例為 t.vhao.net)的自動回帖。重點涵蓋 Cookie 處理、頁面存在性檢測、表單參數構造與反爬蟲應對。

⚠️ 法律與道德提醒:自動發帖/回帖可能違反網站服務條款,造成資源濫用。本文僅供技術學習參考,請勿用於生產環境或惡意灌水。

一、核心流程

  1. 獲取登錄後的 Cookie(手動登錄瀏覽器複製)。
  2. 遍歷帖子 ID,發送 GET 請求檢測帖子是否存在(判斷頁面關鍵字)。
  3. 存在則構造 POST 表單數據發送回覆請求。
  4. 適當延時避免觸發頻率限制。

二、關鍵代碼實現

1. 檢測帖子存在性

private static final String BASE_URL = "https://bbs.example.com/forum.php?mod=viewthread&tid=";
private static final String COOKIE = "your_cookie_here"; // 從瀏覽器複製

public static boolean isExist(int tid) {
    try {
        URL url = new URL(BASE_URL + tid);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Cookie", COOKIE);
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 ...");
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(5000);

        if (conn.getResponseCode() == 200) {
            String html = IOUtils.toString(conn.getInputStream(), StandardCharsets.UTF_8);
            // 根據實際頁面特徵判斷
            return !html.contains("指定的主題不存在或已被刪除");
        }
    } catch (IOException e) { log.error("檢測失敗 tid={}", tid, e); }
    return false;
}

2. 發送回覆 POST 請求

public static void reply(int tid, String content) {
    if (!isExist(tid)) return;

    try {
        StringBuilder form = new StringBuilder(BASE_URL + tid);
        Map params = new LinkedHashMap<>();
        params.put("mod", "post");
        params.put("action", "reply");
        params.put("replysubmit", "yes");
        params.put("infloat", "yes");
        params.put("handlekey", "fastpost");
        params.put("inajax", "1");
        params.put("message", content);
        params.put("formhash", "86ec5d81"); // 需從頁面提取或固定值

        params.forEach((k, v) -> form.append("&").append(k).append("=").append(URLEncoder.encode(v, "UTF-8")));

        URL url = new URL(form.toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Cookie", COOKIE);
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 ...");
        conn.setDoOutput(true);

        try (OutputStream os = conn.getOutputStream()) {
            os.write(form.toString().getBytes(StandardCharsets.UTF_8));
        }

        if (conn.getResponseCode() == 200) {
            String resp = IOUtils.toString(conn.getInputStream(), StandardCharsets.UTF_8);
            if (resp.contains("succeed")) log.info("回覆成功 tid={}", tid);
            else log.warn("回覆失敗 tid={} resp={}", tid, resp);
        }
    } catch (IOException e) { log.error("回覆異常 tid={}", tid, e); }
}

3. 主程序與延時控制

public static void main(String[] args) {
    int startTid = 774210;
    for (int i = 0; i < 100; i++) {
        reply(startTid + i, "友誼幫頂了");
        // 隨機延時 15-30 秒,模擬人類行為
        Thread.sleep(ThreadLocalRandom.current().nextLong(15000, 30000));
    }
}

三、關鍵技術點解析

點說明
Cookie 獲取瀏覽器 F12 Network → Request Headers → Cookie,複製完整字串。
formhash防 CSRF 令牌,通常隱藏在表單中,需先 GET 頁面解析提取,或嘗試固定值。
User-Agent必須模擬真實瀏覽器,否則易被 WAF 攔截。
編碼統一 UTF-8,URLEncoder.encode 處理特殊字元。
連線池生產建議用 Apache HttpClient / OkHttp 替換原生連線,支援連線復用、重試、攔截器。

四、反爬蟲對策與改進方向

  • IP 代理池輪換,避免單 IP 封禁。
  • Headless 瀏覽器執行 JS 渲染獲取動態 formhash。
  • 行為模擬:隨機延時、滑鼠軌跡、頁面停留時間。
  • 驗證碼識別:OCR 或打碼平台。
  • 合規替代方案:使用網站開放 API、RSS 訂閱、Webhook 通知。

五、總結

原生 HttpURLConnection 雖繁瑣但無依賴,適合輕量級任務。實務中強烈建議使用 OkHttp 或 Apache HttpClient 5,配合 Jsoup 解析 HTML、Gson/Jackson 處理 JSON,構建健壯的爬蟲/自動化工具。切記遵守 robots.txt 與服務條款,技術服務於合規場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved