微信作為國民級應用,其自動化操作一直是開發者關注的焦點。早期通過逆向分析微信網頁版協議,開發者實現了模擬登錄、消息收發等功能,從而構建出能自動回復、群管理等特性的「微信機器人」。本文將深度解析基於 Java 實現的微信機器人核心流程,涵蓋掃碼登錄、協議參數獲取、消息監聽與轉發邏輯,並附帶完整代碼示例與項目地址。
機器人的核心思路極為簡單:監聽指定用戶發送的消息 → 轉發給智能聊天接口(如小冰) → 將回復內容原路返回給用戶。這實際上是一個「中繼代理」模式,利用微信網頁版提供的 Web API 實現賬號的自動化控制。
程序啟動後,首先調用 wxRobotApp.prepareQRCode() 獲取登錄二維碼。微信網頁版二維碼有效期通常為 30 秒,代碼中實現了超時重試機制:若 30 秒內未掃碼,自動請求生成新二維碼,確保登錄入口長期有效。
用戶掃碼確認後,微信服務器會返回一個 redirect_url。程序需攜帶必要參數訪問該 URL,並獲取返回的 Cookie(包含 wxuin、wxsid、skey、pass_ticket 等關鍵字段),這些 Cookie 是後續所有 API 請求的身份憑證。
代碼中通過自定義 WxLoginCookieJar 實現 OkHttp 的 CookieJar 接口,精準攔截並保存登錄域名 wx.qq.com 下的 Cookie,實現會話持久化:
public class WxLoginCookieJar implements CookieJar {
private String loginUrl = "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage";
private List<Cookie> cookies;
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
if (url.url().toString().contains(loginUrl)) this.cookies = cookies;
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
return cookies != null ? cookies : new ArrayList<>();
}
}
拿到 Cookie 後,構造 BaseRequest(含 Uin、Sid、Skey、DeviceId)調用初始化接口 webwxinit,獲取當前用戶信息(User)與同步鍵(SyncKey)。隨後調用 webwxgetcontact 拉取完整聯系人列表,並建立「用戶名稱 ↔ UserName」的雙向映射表,為後續精準轉發消息奠基。關鍵邏輯是從聯系人中識別出「小冰」的 UserName,作為機器人對話的目標對象。
啟動 messageListener() 開啟長輪詢(Long Polling)監聽新消息。收到消息後,判斷發送者是否為目標監聽對象,若是則將消息內容轉發給小冰(調用 webwxsendmsg),接收小冰回復後,再調用發送接口將回復發回原用戶。整個過程實現了無感知的自動對話。
public static void main(String[] args) {
WxRobotApp wxRobotApp = new WxRobotApp();
wxRobotApp.putThing("deviceId", "e" + System.currentTimeMillis());
wxRobotApp.showFrame(); // 顯示二維碼界面
// 1. 獲取二維碼(含重試)
wxRobotApp.prepareQRCode();
// 2. 登錄確認,獲取 Cookie
Map<String, Object> cookieResult = WxFun.getCookie(wxRobotApp.getThing("redirect").toString());
Map<String, Object> baseRequest = new HashMap<>();
Map<String, Object> bodyInnerParams = new HashMap<>();
bodyInnerParams.put("Uin", cookieResult.get("wxuin"));
bodyInnerParams.put("Sid", cookieResult.get("wxsid"));
bodyInnerParams.put("Skey", cookieResult.get("skey"));
bodyInnerParams.put("DeviceId", wxRobotApp.getThing("deviceId"));
baseRequest.put("BaseRequest", bodyInnerParams);
wxRobotApp.putThing("baseRequest", baseRequest);
wxRobotApp.putThing("pass_ticket", cookieResult.get("pass_ticket"));
// 3. 初始化微信
Map<String, Object> initData = WxFun.init((Map<String, Object>) wxRobotApp.getThing("baseRequest"));
Map user = (Map) initData.get("User");
Map syncKey = (Map) initData.get("SyncKey");
wxRobotApp.putThing("user", user);
wxRobotApp.putThing("userId", user.get("UserName"));
wxRobotApp.putThing("syncKey", syncKey);
// 4. 獲取聯系人,鎖定「小冰」
Vector vector = WxFun.getContactList((Map<String, Object>) wxRobotApp.getThing("baseRequest"));
wxRobotApp.initContactList(vector);
for (Object uStr : vector) {
String[] uInfo = uStr.toString().split(splitFlag);
wxRobotApp.putThing("u_" + uInfo[1], uInfo[0]);
if (uInfo[0].equals(xiaoIceName)) xiaoIceId = uInfo[1];
}
// 5. 啟動消息監聽
wxRobotApp.messageListener();
}
本項目展示了基於微信網頁版協議的機器人實現全貌,涵蓋協議逆向、網絡請求封裝、狀態機管理、異步消息處理等核心技術點。雖然原版網頁版協議已停止維護,但其架構思想對理解即時通訊協議、Web 自動化測試、逆向分析方法論仍具極高參考價值。
