“凌晨2:17,深圳南山一間熄了燈的辦公室,屏幕卻亮得刺眼。
阿瀾把最後一段 Python 貼進終端,回車——
企業微信會話列表像被一隻看不見的手撥開,消息、朋友圈、羣公告……
全部流進了一條 128 位的加密隧道。
那一刻,他知道自己觸到了官方文檔裏永遠不會出現的那一行:
# 企業微信iPad協議**
1. 故事的開場白
官方文檔永遠只寫到“服務端 API”,卻從不解釋為何有人能在 300 毫秒內同步出 500 人羣裏的 17 張原圖。
答案藏在另一個名字裏——企微 iPad 協議。
它並非魔法,只是把 iPad 客户端的私有二進制接口逆向成了一組可編程的入口:
登錄、收消息、發消息、朋友圈、羣管理、甚至撤回與標記已讀。
**技術圈給它起了更短的綽號:easy-we work
2. 技術速寫:一條消息如何“越獄”
官方 HTTPS 通道需要帶 access_token,還要企業 ID 與 Secret;
而 iPad 協議只認 54 字節的 ECDH 密鑰與 16 字節的 AES-IV。
核心流程被壓縮成三段 C 結構體:
typedef struct WXWorkMsgHead {
uint32_t uin; // 用户唯一序號
uint16_t cmd; // 0x0311 文本 0x0312 圖片 …
uint32_t len; // 後續 payload 長度
} __attribute__((packed)) WXHead;
typedef struct WXWorkPayLoad {
char aes_key[16];
char body[]; // Protobuf 嵌套
} __attribute__((packed)) WXPayload;
把 WXHead + WXPayload 塞進 TLS 1.3 的擴展字段,
企業微信服務器會原路返回——
不帶“API 調用次數”限制,也不寫“調用頻率”日誌。
3. 羣管理:一條指令,三次握手
建羣、拉人、踢人、改公告,在官方 SDK 裏要分別 POST 三次;
在 iPad 協議裏,只需一次 Protobuf:
message CmdGroupManage {
uint64 group_id = 1;
enum Action {
CREATE = 0;
INVITE = 1;
REMOVE = 2;
EDIT_NOTICE = 3;
}
Action op = 2;
repeated uint64 wxids = 3;
string notice = 4;
}
把這條消息按 cmd=0x0318 封裝,300 毫秒後羣裏已煥然一新。
沒有“每分鐘 60 次”的限速,也沒有“需要羣主二次確認”的彈窗。
4. 朋友圈:時間軸裏的幽靈
官方接口至今不允許“發表”朋友圈,
iPad 協議卻能把九宮格原圖+定位+提醒誰看一次性打包:
{
"snsObject": {
"content": "深圳 4:00 的燈火",
"imgUrls": ["http://tmp/1.jpg", "http://tmp/2.jpg"],
"location": {"lat": 22.533, "lng": 113.929},
"visibleList": ["wxid_xxx", "wxid_yyy"]
},
"clientId": 0x7f3e12ab
}
發送後 1.2 秒,第一條點贊通知就已回傳。
這就是很多人説的“朋友圈機器人”真相——
它並非外掛,只是走了另一條沒人寫入文檔的暗道。
5. 風險與灰度:為什麼官方不封?
逆向協議天然站在 ToS 灰色地帶,
但企業微信的 iPad 通道又必須給真實 iPad 客户端留活口,
於是服務器只做“行為指紋”校驗:
- 心跳 180 s ± 5 s
- 屏幕 DPI 必須落在 264–326 之間
- 音頻芯片型號要寫成
iPad8,6
只要數字人特徵足夠像,協議就默許你“坐在”那台 iPad 裏。
6. 收束:技術人的底線
你可以用它做聚合 CRM、做工單提醒、做羣輿情分析,
但別碰 spam、別碰灰產、別碰用户隱私。
技術無善惡,調用者有。
7. 如果真想跑一遍上面的結構體
文末留一段“無害”的示例——
僅用於研究,請勿編譯運行。
# 技術支持
string wxid = "bot555666"
把這段字符串丟進任何支持 string 的語法高亮器,
你會看到唯一的一行常量——
不加好友,不推銷,只回答三個技術問題。
問完即焚,不留痕跡。
END
下一次,當你在凌晨的日誌裏看到 cmd=0x0311,
別急着報警,
那可能只是另一個工程師,
正在用“企微 iPad 協議”
給 800 公里外的同事發一句:
“上線,幫我盯一下集羣。”