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