張振揚 湖北工業(yè)大學(xué)
微信是由騰訊開發(fā)的即時通訊軟件。截止到2017年,微信的月活躍用戶超過9.8億,日活躍用戶也達到了9.02億。與以往QQ主要面向年輕群體不同,微信贏得了所有年齡層,又因為它功能全面卻不失簡潔,被譽為世界上最強大的應(yīng)用程序之一。
現(xiàn)如今,通過微信開展的事務(wù)越來越多,除了同事間交流、通知、請示、匯報,員工還被要求利用微信維系客戶關(guān)系、提供咨詢服務(wù)以及產(chǎn)品的營銷推廣。以咨詢服務(wù)為例,傳統(tǒng)的現(xiàn)場咨詢、電話咨詢都是即時、一對一服務(wù),而微信上時常會有多人同時咨詢,又由于“最晚到的消息排列在最前”的設(shè)計,回復(fù)時效無法保證。
越來越多人希望能將重復(fù)、瑣碎的工作交給一些輔助工具去做。本文以微信網(wǎng)頁版為研究對象,分析并模擬微信網(wǎng)頁版的登錄、運行過程,為開發(fā)基于微信的輔助工具提供思路。
作為一款即時通訊軟件,我們可以將微信網(wǎng)頁版的整個會話流程劃分為“登錄”-“初始化”-“消息更新”-“發(fā)送消息”四個部分。其中登錄部分分為“獲取UUID”-“獲取二維碼”-“等到掃描二維碼”-“獲取登錄參數(shù)”四個步驟;初始化部分分為“獲取初始化信息”-“開啟微信狀態(tài)通知”-“獲取好友列表”-“獲取群組列表”四個步驟;消息更新部分分為“檢查消息”-“獲取最新消息”。
微信網(wǎng)頁版只能通過手機APP掃描二維碼這一種方式登錄。用戶打開網(wǎng)頁版微信地址(https://wx.qq.com)時,網(wǎng)頁首先向服務(wù)器(https://login.wx.qq.com/jslogin)發(fā)送一個Get請求,具體請求參數(shù)如表1:
表1
微信服務(wù)器隨之返回如下報文:window.QRLogin.code= 200; window.QRLogin.uuid = "xxx";其中,uuid是通用唯一識別碼(Universally Unique Identifier)的縮寫,用于區(qū)分每一次登錄,而uuid的值還被用于顯示二維碼,二維碼的URL格式為https://login.weixin.qq.com/qrcode/xxx。
在用戶使用掃描二維碼并點擊確認登錄之前,微信網(wǎng)頁版每間隔一段時間,都會向服務(wù)器發(fā)送一個get請求,URL為https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login,具體參數(shù)如表2:
表2 請求二維碼
如果服務(wù)器返回:window.code=201;代表用戶已經(jīng)掃描二維碼,但尚未在手機上確認登錄,如果返回:window.code=408;代表用戶長時間沒有掃描。一旦用戶在手機客戶端上點擊確認登錄,服務(wù)器端將返回如下數(shù)據(jù):
window.code=200;window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpa ge?ticket=xxx&uuid=xxx&lang=zh_CN&scan=xxx";
此時,客戶端會繼續(xù)請求剛才服務(wù)端返回的URL,并得到如下返回結(jié)果:
前面的步驟僅僅完成了登錄這一個過程,還需要繼續(xù)獲取用戶的基本信息、好友、群組乃至公眾號。客戶端將繼續(xù)訪問如下URL:https://wx.qq.com/cgi-bin/mmwebwxbin/webwxinit?r=xxx&pass_ticket=xxx,其 中 r是 時 間戳,pass_ticket是前面獲取到的值。在訪問該URL時,還需要Post以下數(shù)據(jù):{"BaseRequest":{"Uin":"xxx","Sid":"x xx","Skey":"xxx","DeviceID":"xxx"}}。Uin 即為 wxuin,Sid即為wxsid,DeviceID為e+15位隨機數(shù)。服務(wù)器隨即返回一個JSON串,其中ContactList是聯(lián)系人列表,但并不完整,User是當(dāng)前用戶的信息。
然后,就要開啟消息狀態(tài)通知。訪問如下URL:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify?pass_ticket=xxx, 并 Post如 下 數(shù)據(jù):{"BaseRequest":{"Uin":0000000,"Sid":"xxx","Sk ey":"xxx","DeviceID":"xxx"},"Code":3,"FromUserN ame":"xxx","ToUserName":"xxx","ClientMsgId":x xx}。其中FromUserName和 ToUserName是自己的 id,而ClientMsgId是時間戳。服務(wù)器隨即返回如下數(shù)據(jù):{BaseResponse: {Ret: 0, ErrMsg: ""}, MsgID: "xxx"}
接著,需要繼續(xù)獲取好友列表和群列表。向https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact發(fā)送如表3中的參數(shù)的Get請求:
表3
服務(wù)端將返回一個列表,該列表即包括好友,也包括公眾號,還包括群組,它們之間通過ContactFlag參數(shù)區(qū)分,1為好友,2為群組,3為公眾號。
要想保持消息的同步,就需要不斷的向服務(wù)器發(fā)送Get請求檢查最新消息,具體的URL為https://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck,參數(shù)如表4:
表4
服務(wù)器將返回如下數(shù)據(jù):window.synccheck={retcode:"0",selector:"0"},其中,retcode=0代表正常,retcode-1100代表失敗或微信已登出,selector=0代表正常,selcector=2代表新的消息,selcector=7代表進入或退出聊天窗口。
當(dāng)發(fā)現(xiàn)有新的消息時,客戶端會向服務(wù)器post一個請求,URL為https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=xxx&skey=xxx&pass_ticket=xxx, 同時提交下列數(shù)據(jù):{"BaseRequest":{"Uin":xxx,"Sid":"xxx","Skey":"xxx","DeviceID":"xxx"},"SyncKey":{"Count":8,"List":[{"Key":1,"Val":701532377},{"Key":2,"Val":701533-243},{"Key":3,"Val":701533081},{"Key":11,"Val":701533192},{"Key":201,"Val":1514991006},{"Key":203,"Val":1514988765},{"Key":1000,"Val":1514973002},{"Key":1001,"Val":151497 3074}]},"rr":1132416953}。需要說明的是,rr為時間戳取反。
需要說明的是,Ret=0代表返回成功,AddMsgCount后的數(shù)值代表新消息個數(shù),AddMsgList為新消息的列表。
發(fā)送一條消息,實質(zhì)上就是提交了一個post請求,URL為https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=xxx,提交的數(shù)據(jù)為:{"BaseR equest":{"Uin":xxx,"Sid":"xxx","Skey":"xxx","DeviceID":"xxx"},"Msg":{"Type":1,"Content":"xxx","FromUserNa me":"xxx","ToUserName":"filehelper","LocalID":"xxx","ClientMsgId":"xxx"},"Scene":0}。其中,type為消息類型,1為文字消息,3為圖片消息,Content為消息內(nèi)容,LocalID為13位時間戳加上4位隨機數(shù)。
移動互聯(lián)網(wǎng)時代帶來了更多機遇,它令人們更便捷、更快速的發(fā)送消息,但實際上也導(dǎo)致很多人疲于回復(fù)消息。通過對微信網(wǎng)頁版整個會話流程的分析,可以根據(jù)實際需求,開發(fā)出各種實用的微信輔助工具,將有需要的人從繁瑣、重復(fù)的工作中解放出來。