編輯指南:企業(yè)微信在群發(fā)信息、大量添加朋友等場景下難以滿足企業(yè)需求,因此,部分企業(yè)為了滿足企業(yè)的批量處理需求,正在進(jìn)行企業(yè)微信hook。
本文作者對hook的原理及方案進(jìn)行了分析,一起來看一下吧。由于企業(yè)微信的限制策略,導(dǎo)致在群發(fā)消息、批量添加好友等場景難以滿足企業(yè)訴求。在此背景下,某些企業(yè)便對企業(yè)微信進(jìn)行hook,我們今天就來聊一下hook的原理及方案。
一、基本了解
首先我們要對企業(yè)微信(也是所有C/S架構(gòu))的數(shù)據(jù)傳輸有個基本了解:企業(yè)微信手機(jī)端、PC端按照一定規(guī)則將數(shù)據(jù)上報給服務(wù)端,同時也從服務(wù)端按照規(guī)則拉取最新數(shù)據(jù)到本地。企業(yè)微信通過開放的管理后臺提供API接口給企業(yè)微信服務(wù)商,服務(wù)商通過接口和企業(yè)微信進(jìn)行數(shù)據(jù)交互。
用發(fā)消息場景舉個例子:
- 企業(yè)微信賬號A,在手機(jī)客戶端上向客戶B(個人微信)發(fā)送一條消息,內(nèi)容“我是周杰倫”
- 這條消息內(nèi)容(連同發(fā)送者、接收者等信息)通過網(wǎng)絡(luò)上報到企業(yè)微信服務(wù)端
- 企業(yè)微信服務(wù)端做一系列動作,如判斷A和B是否是好友、B是否合法等等之后,將消息發(fā)送給客戶B
- 客戶B收到消息后,服務(wù)商通過API接口將這條消息拉取到自己的數(shù)據(jù)庫里
- 同時,如果企業(yè)微信A在PC客戶端處于登陸狀態(tài),企業(yè)微信服務(wù)端會將剛剛發(fā)送消息這件事告訴企業(yè)微信PC客戶端,在PC客戶端上也就能看到剛剛發(fā)送給客戶B的聊天記錄
二、如何hook
我們通常需要在設(shè)備上安裝一個客戶端軟件(我們稱其為小助手)用于hook企業(yè)微信的載體工具。
1)破解數(shù)據(jù)庫/內(nèi)存:拿到想要的數(shù)據(jù)
安裝客戶端后,一般會在當(dāng)前硬件設(shè)備硬盤上建立數(shù)據(jù)庫,用于存儲實時性比較強(qiáng)、數(shù)據(jù)量比較大的數(shù)據(jù)。通過破解數(shù)據(jù)庫我們便能拿到必要的數(shù)據(jù),比如企業(yè)微信的外部聯(lián)系人列表即存儲在本地的sqllite數(shù)據(jù)庫里。
2)破解函數(shù)
通過函數(shù)可以拿到想要的數(shù)據(jù)以及操縱企業(yè)微信(技術(shù)老師通常叫:截取和下發(fā))。
如圖,在發(fā)消息場景下,我們通過破解點1,偽裝成企業(yè)微信用戶A調(diào)用“發(fā)送消息函數(shù)”原始數(shù)據(jù),讓該函數(shù)幫助我們發(fā)送消息(下發(fā))。
(真實的發(fā)送消息場景,是一系列函數(shù)之間的調(diào)用,而不僅僅是一兩個函數(shù))
三、hookid是什么
hookid前面有定語,比如外部聯(lián)系人hookid、賬號hookid、群hookid、朋友圈hookid,在企業(yè)微信中,最常用的就是外部聯(lián)系人hookid。
外部聯(lián)系人hookid,即用于標(biāo)定該外部聯(lián)系人的唯一id。假如2個企業(yè)微信賬號都和外部聯(lián)系人A是好友關(guān)系,那么A在2個企業(yè)微信的好友列表里,hookid是相同的。
hookid是什么怎么生成的?
hooid不是系統(tǒng)自動生成的,是從企業(yè)微信在本地的sqllite數(shù)據(jù)庫的外部聯(lián)系人表中獲取的某個字段。
四、為什么要綁定hookid?
還是拿群發(fā)舉例子,如果想要發(fā)消息,數(shù)據(jù)需要從scrm下發(fā)給企業(yè)微信,完成群發(fā)。
發(fā)消息需要指明消息的接收人是誰。但問題是,scrm的外部聯(lián)系人列表是從官方API接口獲取的,而我們最終只能通過hook獲取的外部聯(lián)系人列表來完成群發(fā),兩個列表的口徑并不一致,這時就需要利用hookid來完成數(shù)據(jù)的綁定。
五、如何綁定hookid
1)差異化同步流程
小助手客戶端從企業(yè)微信客戶端同步完成數(shù)據(jù)后,會通知小助手服務(wù)端。
觸發(fā)條件:登錄小助手客戶端,并從小助手中打開企業(yè)微信。
服務(wù)端接到小助手客戶端的同步完成通知,會從庫中獲取該企業(yè)微信賬戶已經(jīng)綁定hookid的列表。
觸發(fā)條件:服務(wù)端獲得小助手同步完成的通知。
將已綁定的hookid下發(fā)給小助手。
觸發(fā)條件:拉取到完整的hookid列表。
下發(fā)方式:一次下發(fā)200個hookid,當(dāng)所有hookid都給到小助手客戶端后,會告知小助手客戶端。
小助手將已綁定的hookid在本地數(shù)據(jù)庫打上標(biāo)記。
觸發(fā)條件:被服務(wù)端告知,hookid已經(jīng)同步完畢。
服務(wù)端向小助手客戶端下發(fā)指令:上報無hookid外部聯(lián)系人。
小助手上報服務(wù)端未綁定hookid的外部聯(lián)系人。
內(nèi)容:外部聯(lián)系人頭像、昵稱、hookid。
方式:一次給200個外部聯(lián)系人信息,所有未綁定用戶都給到服務(wù)端后,會告知服務(wù)端。
服務(wù)端將官方數(shù)據(jù)和小助手客戶端上報數(shù)據(jù),根據(jù)頭像和昵稱進(jìn)行綁定。
2)增量同步邏輯
- 服務(wù)端獲取未綁定hookid列表
- 將未綁定hookid列表下發(fā)給小助手(頭像、昵稱等)
- 小助手從自己的庫里和服務(wù)端下發(fā)的列表進(jìn)行比對,將比對結(jié)果相同的聯(lián)系人上報給服務(wù)端,上報完成后通知服務(wù)端
- 觸發(fā)條件:比對完成后。如果沒有相同的,則?
- 服務(wù)端將官方數(shù)據(jù)和小助手上報數(shù)據(jù),根據(jù)頭像和昵稱進(jìn)行綁定
- 觸發(fā)條件:接受到小助手上報完成通知
3)備注綁定邏輯
- 服務(wù)端為某個hookid生成一個備注內(nèi)容,并下發(fā)給小助手
- 小助手為用戶修改備注,修改后,企業(yè)微信內(nèi)部會將新的備注上報給企業(yè)微信服務(wù)端
- 數(shù)據(jù)同步模塊會定時從企業(yè)微信官方拉取到該用戶對應(yīng)的備注內(nèi)容
- 服務(wù)端根據(jù)備注內(nèi)容,找到該備注對應(yīng)的hookid,進(jìn)行綁定
- 服務(wù)端通過官方接口,將備注還原
最后,分享一張企業(yè)微信(hook)服務(wù)商的整圖:
本文由 @Shanker 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自 Unsplash,基于 CC0 協(xié)議
1.《微信本地文件怎么打開方式看這里!PM拓展:聊聊企業(yè)微信的hook》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《微信本地文件怎么打開方式看這里!PM拓展:聊聊企業(yè)微信的hook》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/gl/3132879.html