昨天是周末,在家閑得無聊,于是去weiphone.com逛了一圈,偶然發現有人發了一帖叫《微信 for Mac》, 這勾起了我的好奇心,國內做Mac開發的人確實很少,對于那些能夠獨自開發一些Mac第三方工具的開發者我都表示很敬畏,于是點進去看了一個究竟,如果你 們好奇也可以點進去看個明白,我最終得出的結論就是:坑爹呢這是!直接用一個WebView去加載了wx.qq.com這個網頁也敢自稱是微信For Mac?對于這種欺騙用戶的行為我十分不屑,同時也讓我在思考在微信不提供API的環境下開發一款原生的微信Mac版本是否可行,最有可能的就是去分析微 信Web版本的通信過程,然后在程序中模擬這個流程,在我苦苦研究了一個下午之后,終于摸透了這個過程,并用程序實現了大部分功能,下面就詳細解說一下微 信Web版的流程:
1.微信服務器返回一個會話ID
微信Web版本不使用用戶名和密碼登錄,而是采用二維碼登錄,所以服務器需要首先分配一個唯一的會話ID,用來標識當前的一次登錄,通過請求地址:
https://login.weixin.qq.com /jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F %2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new& amp;lang=zh_CN&_=1377482012272(其中1377482012272這個值是當前距離林威治標準時間的毫秒)
服務器會返回如下的字符串:
window.QRLogin.code = 200; window.QRLogin.uuid = “DeA6idundY9VKn”;
而這個DeA6idundY9VKn字符串就是微信服務器返回給我們的ID。
2.通過會話ID獲得二維碼
既然微信Web版本是通過二維碼進行登錄,如何獲得這個隨機的二維碼呢?答案就是利用剛才獲得的ID去請求服務器生成的二維碼,通過上面的ID我們組合得到以下的URL地址:
https://login.weixin.qq.com/qrcode/DeA6idundY9VKn?t=webwx
該請求返回的便是我們需要的二維碼,此時需要用戶在微信的手機版本中掃描這個二維碼(我就搞不明白微信官方是如何想的,登錄Web版本竟然還需要手機微信去配合登錄,難道沒有考慮我被迫選擇Web微信就是因為手機不在身邊這樣的情形么?)
3.輪詢手機端是否已經掃描二維碼并確認在Web端登錄
當獲得二維碼之后,就需要用戶去手機端去掃描二維碼,并獲得用戶的授權,此時我們并不知道用戶何時完成這個操作,所以我們只有輪詢,而輪詢的地址就是:
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=DeA6idundY9VKn&tip=1&_=1377482045264(注意UUID和最后時間這兩個參數)
如果服務器返回:
window.code=201;
則說明此時用戶在手機端已經完成掃描,但還沒有點擊確認;
如果服務器返回:
window.redirect_uri=一個URL地址
則說明此時用戶已經在手機端完成了授權過程,保存下這個URL地址下一步驟中使用。
4.訪問登錄地址,獲得uin和sid
通過訪問上一步驟中獲得的URL地址,可以在服務器返回的Cookies中獲得到wxuin和wxsid這兩個值,這兩值在后續的通信過程中都要使用到這兩個值,并且Cookies中也需要包括這兩項。
5.初使化微信信息
前面的步驟算是完成了這個復雜的登錄過程,如果我們需要使用微信就需要獲得當前用戶的信息、好友列表等,還有一個關鍵的就是同步信息(后續與服務器輪詢中需要使用同步信息),通過訪問以下的鏈接:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1377482058764(r依然是時間)
訪問該鏈接需要使用POST,并且在Body中帶上以下的JSON信息:
{"BaseRequest":
{"Uin":"2545437902","Sid":"QfLp+Z+FePzvOFoG","Skey":"","DeviceID":"e1615250492"}}
這個JSON串中Uin和Sid分別是上面步驟中獲得的那兩個Cookie值,DeviceID是一個本地生成的隨機字符串(分析了官方的總是e+一串數字,所以我們也保持這樣的格式)。
服務器就會返回一個很長的JSON串,這其中包括:BaseResponse中的值用來表示請求狀態碼,ContactList主要用來表示聯系人(此列表不全,只包括了類似通訊錄助手、文件助手、微信團隊和一些公眾帳號等,后面會通過另一接口去獲得更全面的信息),SyncKey是用戶與服務器同步的信息,User就是當前登錄用戶自己的信息。
6.獲得所有的好友列表
在上一步驟中已經獲得了部分好友和公眾帳號,如果需要獲得完整的好友信息,就需要訪問以下的鏈接:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r=1377482079876(r依然是時間)
訪問該鏈接同樣需要POST方式,但Body為空JSON:{},服務器對身份的判定是通過Cookies,所以需要保持之前訪問的Cookies不被修改(在Objective-C中會自動保存相關的Cookies,無需程序特殊處理),在返回的JSON串中,MemberList中就包含了所有的好友信息。
7.保持與服務器的信息同步
與服務器保持同步需要在客戶端做輪詢,該輪詢的URL如下:
https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?callback=jQuery18309326978388708085_1377482079946&r=1377482079876&
sid=QfLp+Z+FePzvOFoG&uin=2545437902&deviceid=e1615250492&synckey=(見以下說明)&_=1377482079876
其中的參數r和_都是time,sid,uin,deviceid與上面步驟的值相對應,此處的synkey是上步步驟獲得的同步鍵值,但需要按一定的規則組合成以下的字符串:
1_124125|2_452346345|3_65476547|1000_5643635
就是將鍵和值用_隔開,不同的鍵值對用|隔開,但記得|需要URL編碼成%7C,通過訪問上面的地址,會返回如下的字符串:
window.synccheck={retcode:”0”,selector:”0”}
如果retcode中的值不為0,則說明與服務器的通信有問題了,但具體問題我就無法預測了,selector中的值表示客戶端需要作出的處理,目前已經知道當為6的時候表示有消息來了,就需要去訪問另一個接口獲得新的消息。
8.獲得別人發來的消息
當一個步驟中知道有新消息時,就需要去獲取消息內容,通過訪問以下的鏈接:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=QfLp+Z+FePzvOFoG&r=1377482079876
上面鏈接中的參數sid對應上面步驟中的值,r為時間,訪問鏈接需要使用POST方式,Body中包括JSON串,該JSON串格式如下:
{"BaseRequest" : {"Uin":2545437902,"Sid":"QfLp+Z+FePzvOFoG"},
"SyncKey" : {"Count":4,"List":[{"Key":1,"Val":620310295},{"Key":2,"Val":620310303},{"Key":3,"Val":620310285},{"Key":1000,"Val":1377479086}]},
"rr" :1377482079876};
以下的信息中BaseRequest中包括的Uin與Sid與上面步驟中的值對應,SyncKey也是上面步驟中獲得的同步鍵值對,rr為時間,訪問成功之后服務器會返回一個JSON串,其中AddMsgList中是一個數組,包含了所有新消息。
9.向用戶發送消息
用戶主動發送消息,通過以下的URL地址:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?sid=QfLp+Z+FePzvOFoG&r=1377482079876
上面的sid和r參數不再解釋了,訪問該URL采用POST方式,在Body中的JSON串形如以下的格式:
{
"BaseRequest":{
"DeviceID" : "e441551176",
"Sid" : "S8wNi91Zry3024eg",
"Skey" : "F820928BBA5D8ECA23448F076D2E8A915E1349E9FB4F4332",
"Uin" : "2545437902"
},
"Msg" : {
"ClientMsgId" : 1377504862158,
"Content" : "hello",
"FromUserName" : "wxid_2rrz8g8ezuox22",
"LocalID" : 1377504862158,
"ToUserName" : "wxid_j4nu420ojhsr21",
"Type" : 1
},
"rr" = 1377504864463
}
其中BaseRequest都是授權相關的值,與上面的步驟中的值對應,Msg是對消息的描述,包括了發送人與接收人,消息內容,消息的類型(1為文本),ClientMsgId和LocalID由本地生成。rr可用當前的時間。
在返回JSON結果中BaseResponse描述了發送情況,Ret為0表示發送成功。
網頁微信客戶端封包大全
http://www.langyeweb.com/Program/70.html
網頁版微信功能只有一個:聊天。根據 Copyright (C) 狼夜我這兩天研究發現, 網頁版微信可以脫離手機微信,也就是手機微信退出、手機關機,都不影響網頁端微信的 在線以及聊天,關于如何使用加好友、朋友圈、搖一搖功能,我有個思路就是抓手機封包 @Icenowy 在微博上有抓手機包的計劃 然后使用,不過這個想法因為時間問題沒有去實踐, 希望大家能研究出來的話在本頁面留一個鏈接,十分感謝!
以下是Post/Get的封包大全,如果能看懂這個,基本上你就可以做出來了。
獲取uuid
https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1388994062250
獲取二維碼
https://login.weixin.qq.com/qrcode/{$uuid}?t=webwx
等待掃描Get
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=454d958c7f6243&tip=1&_=1388975894359
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=454d958c7f6243&tip=1&_=1388975873359
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=454d958c7f6243&tip=1&_=1388975883859
掃描了(但還沒有確認)-返回
window.code=201;
未掃描返回空
掃描之后-第一次請求成功
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatreport?type=1&r=1388975895453
{"BaseRequest":{"Uin":0,"Sid":0},"Count":1,"List":[{"Type":1,"Text":"/cgi-bin/mmwebwx-bin/login, First Request Success, uuid: 454d958c7f6243"}]}
掃描之后-第二次請求開始
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatreport?type=1&r=1388975895453
{"BaseRequest":{"Uin":0,"Sid":0},"Count":1,"List":[{"Type":1,"Text":"/cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: 454d958c7f6243"}]}
等待確認Get
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=454d958c7f6243&tip=0&_=1388975895453
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=454d958c7f6243&tip=0&_=1388975900953
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=454d958c7f6243&tip=0&_=1388975906453
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=454d958c7f6243&tip=0&_=1388975911953
手機確認-返回
window.code=200;
window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=03f725a8039d418ab79c69b6ffbd771b&lang=zh_CN&scan=1388975896";
未確認返回空
get 登陸獲取Cookie
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=03f725a8039d418ab79c69b6ffbd771b&lang=zh_CN&scan=1388975896&fun=new
WX2新協議
https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=b03aa3dfbe8d4130981ddf771137ae7b&lang=zh_CN&scan=1419126125&fun=old
設置Cookie 返回一個狀態
post 第二次請求成功
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatreport?type=1&r=1388976086218
{"BaseRequest":{"Uin":0,"Sid":0},"Count":1,"List":[{"Type":1,"Text":"/cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: 454d958c7f6243, time: 190765ms"}]}
post 表示登陸成功-返回重要的數據SKey
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1388976086484
DeviceID 是e + 隨機數
http://www.tanhao.me/talk/1466.html
{"BaseRequest":{"Uin":"750366800","Sid":"e75TXbI7TnKUevmI","Skey":"","DeviceID":"e519062714508114"}}
post 應該是向服務器端提供的一次驗證-返回SyncKey
http://freezingsky.iteye.com/blog/2055502
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=e75TXbI7TnKUevmI&r=1388976086734
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI"},"SyncKey":{"Count":4,"List":[{"Key":1,"Val":620916854},{"Key":2,"Val":620917961},{"Key":3,"Val":620917948},{"Key":1000,"Val":1388967977}]},"rr":1388976086734}
post 可能是獲取當前會話列表
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r=1388976086734
{}
post 可能是在手機上顯示的提示信息
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify?r=1388976086750
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI","Skey":"","DeviceID":"e519062714508114"},"Code":3,"FromUserName":"langyeie","ToUserName":"langyeie","ClientMsgId":"1388976086750"}
get 獲取頭像圖片
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1388335457&username=langyeie
get 同理可以獲取其他微信好友的頭像
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgeticon?seq=620917759&username=wxid_xx3mtgeux5511
post 更改什么狀態?標記已讀?
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=1388976086812
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI","Skey":"","DeviceID":"e519062714508114"},"Count":10,"List":[{"UserName":"z_zer0v","ChatRoomId":3445229833},{"UserName":"huobao002","ChatRoomId":3445229833},{"UserName":"wxid_jo4qxoep4go411","ChatRoomId":3445229833},{"UserName":"jijunlong123456","ChatRoomId":3445229833},{"UserName":"wxid_toyaj4qwrynb21","ChatRoomId":3445229833},{"UserName":"wxid_6655286553012","ChatRoomId":3445229833},{"UserName":"wxid_rankrke1kkyd12","ChatRoomId":3445229833},{"UserName":"wxid_chcblpm846k022","ChatRoomId":3445229833},{"UserName":"tw297554396","ChatRoomId":3445229833},{"UserName":"wxid_3076050756212","ChatRoomId":3445229833}]}
聊天室頭像
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=620917806&username=3445229833chatroom@
get 監聽會話
https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?callback=jQuery18308660551080269895_1388975862078&r=1388976091937&sid=e75TXbI7TnKUevmI&uin=750366800&deviceid=e519062714508114&synckey=1_620916854%7C2_620917963%7C3_620917948%7C11_1388976090%7C1000_1388967977&_=1388976091937
https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?callback=jQuery18308660551080269895_1388975862078&r=1388976119062&sid=e75TXbI7TnKUevmI&uin=750366800&deviceid=e519062714508114&synckey=1_620916854%7C2_620917963%7C3_620917948%7C11_1388976090%7C1000_1388967977&_=1388976119078
https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?callback=jQuery18308660551080269895_1388975862078&r=1388976173375&sid=e75TXbI7TnKUevmI&uin=750366800&deviceid=e519062714508114&synckey=1_620916854%7C2_620917963%7C3_620917948%7C11_1388976090%7C1000_1388967977&_=1388976173390
https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?callback=jQuery18308660551080269895_1388975862078&r=1388976146265&sid=e75TXbI7TnKUevmI&uin=750366800&deviceid=e519062714508114&synckey=1_620916854%7C2_620917963%7C3_620917948%7C11_1388976090%7C1000_1388967977&_=1388976146265
正常返回結果
window.synccheck={retcode:"0",selector:"0"}
有消息返回結果
window.synccheck={retcode:"0",selector:"6"}
發送消息返回結果
window.synccheck={retcode:"0",selector:"2"}
朋友圈有動態
window.synccheck={retcode:"0",selector:"4"}
獲取消息-post-設置Cookie
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=e75TXbI7TnKUevmI&r=1388977398062
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI"},"SyncKey":{"Count":5,"List":[{"Key":1,"Val":620916854},{"Key":2,"Val":620917978},{"Key":3,"Val":620917975},{"Key":201,"Val":1388977392},{"Key":1000,"Val":1388967977}]},"rr":1388977398062}
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=e75TXbI7TnKUevmI&r=1388977583250
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI"},"SyncKey":{"Count":5,"List":[{"Key":1,"Val":620916854},{"Key":2,"Val":620917980},{"Key":3,"Val":620917975},{"Key":201,"Val":1388977400},{"Key":1000,"Val":1388967977}]},"rr":1388977583250}
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=e75TXbI7TnKUevmI&r=1388977660750
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI"},"SyncKey":{"Count":5,"List":[{"Key":1,"Val":620916854},{"Key":2,"Val":620917982},{"Key":3,"Val":620917975},{"Key":201,"Val":1388977585},{"Key":1000,"Val":1388967977}]},"rr":1388977660750}
post 發送消息
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?sid=e75TXbI7TnKUevmI&r=1388977830140
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI","Skey":"D6EBA5FA425CAE258F24E75CF51F2E1B4EEA9C5338BE456C","DeviceID":"e519062714508114"},"Msg":{"FromUserName":"langyeie","ToUserName":"pp80000","Type":1,"Content":"55","ClientMsgId":1388977830140,"LocalID":1388977830140}}
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=e75TXbI7TnKUevmI&r=1388977830390
{"BaseRequest":{"Uin":750366800,"Sid":"e75TXbI7TnKUevmI"},"SyncKey":{"Count":5,"List":[{"Key":1,"Val":620916854},{"Key":2,"Val":620917986},{"Key":3,"Val":620917975},{"Key":201,"Val":1388977776},{"Key":1000,"Val":1388967977}]},"rr":1388977830390}
get 有消息來,響鈴
https://res.wx.qq.com/zh_CN/htmledition/swf/msg17ced3.mp3
獲取消息中的圖片
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetmsgimg?type=slave&MsgID={MsgID值}&skey=%40{skey值}
獲取視頻
/cgi-bin/mmwebwx-bin/webwxgetvideo?type=flv&msgid={MsgID值}&skey={SKey值}
/cgi-bin/mmwebwx-bin/webwxgetvideo?fun=download&msgid={MsgID值}&skey={SKey值}
獲取語音
webwxgetvoice
@import url(http://www.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted on 2017-05-09 13:14
聶文龍 閱讀(3710)
評論(1) 編輯 收藏 引用