摘要:還有一個(gè)很騷的點(diǎn)就是這個(gè)參數(shù)雖然是毫秒級(jí)的位時(shí)間戳,但是在微信第一次獲取后他不會(huì)再去了,就是一直致謝本項(xiàng)目受到以下項(xiàng)目的啟發(fā)
前言
工作之余突然對(duì)微信的網(wǎng)頁(yè)版的協(xié)議通信感興趣可以搞一波了解下。畢竟網(wǎng)頁(yè)版容易抓,靠一個(gè)瀏覽器的開發(fā)者工具的Network就開始抓包解析了。
這是我2019年03月寫的文檔。因?yàn)槲⑿诺膮f(xié)議可能隨時(shí)存在變動(dòng),以下內(nèi)容可以參考一波。本人爬蟲的方法很簡(jiǎn)單,就是盡一切方法模仿被爬蟲者的行為。
該文檔目前只寫到獲取最新消息。先記錄一波。有空更新
項(xiàng)目地址:楠尼瑪大帝 / wxWebR(Java版)流程步驟
(這里只說到成功登錄到微信并獲取最新消息,因?yàn)橹皇悄7碌竭@里,其他的全部都已經(jīng)清清楚楚只是看你調(diào)不調(diào)用而已了。該拿到的參數(shù)都有了)
去獲取一個(gè)uuid,可以根據(jù)這個(gè)uuid獲取一張二維碼登錄的圖片
微信客戶端掃描該二維碼,在客戶端確認(rèn)登錄。
瀏覽器不停的調(diào)用一個(gè)接口,如果返回登錄成功,則調(diào)用登錄接口
循環(huán)遍歷一個(gè)檢查是否有新消息的接口。
如果新消息的接口返回有新消息的狀態(tài)碼去獲取消息接口。(完)
WebWechat API(這里也只說到成功登錄到微信并獲取最新消息。其他可以自行去抓包或者參考其他文檔比如碼云參考->python版(老版本)
第一步獲取UUID(參考方法 getUUID)API | 獲取 UUID |
---|---|
url | https://login.wx.qq.com/jslogin |
method | POST |
data | URL Encode(text/javascript) |
params |
appid: 應(yīng)用ID 參考:wx782c26e4c19acffb redirect_uri 轉(zhuǎn)發(fā)地址 參考:https://wx.qq.com/cgi-bin/mmw... fun: 應(yīng)用類型 參考:new lang: 語(yǔ)言 參考:zh_CN _: 時(shí)間戳 參考:當(dāng)前時(shí)間毫秒級(jí)13位數(shù)的時(shí)間戳 |
返回?cái)?shù)據(jù)(String):
window.QRLogin.code = 200; window.QRLogin.uuid = "xxx"
注:目前看來參數(shù)除了_ 當(dāng)前時(shí)間毫秒級(jí)13位數(shù)的時(shí)間戳 其他都是固定的值。在微信給的js里面index_ad43596.js里搜索API_jsLogin可以得到這些參數(shù)。而且大部分不理解參數(shù)都可以從這個(gè)js文件得到答案。
顯示二維碼就不浪費(fèi)時(shí)間直接就是拿第一步拿到的uuid拼接就是二維碼地址:https://login.weixin.qq.com/q...{uuid}
第二步等待掃碼登錄即微信確認(rèn)登錄API | 獲取二維碼掃描登錄狀態(tài) |
---|---|
url | https://login.wx.qq.com/cgi-b... |
method | GET(text/javascript) |
params |
tip :這個(gè)東西根據(jù)瀏覽器走的話就是第一次為1,后面都是為0,網(wǎng)上說是掃碼狀態(tài) loginicon 參考:true uuid : 獲取到的uuid _ : 當(dāng)前時(shí)間毫秒級(jí)13位數(shù)的時(shí)間戳 |
返回?cái)?shù)據(jù)(String):
window.code=xxx; xxx: 【未掃碼的話】 -> window.code=408; 【手機(jī)掃碼但是未登錄】 -> window.code = 201; 【手機(jī)取消登錄】 -> window.code=400; 【手機(jī)授權(quán)登錄】 -> window.code=200; 當(dāng)返回200時(shí): wechatLoginStatus:window.code=200; window.redirect_uri= "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=XXX&uuid=XXX&lang=XXX&scan=XXX"; 當(dāng)返回201時(shí)可以獲取掃碼用戶頭像的base64數(shù)據(jù)哦(好像沒啥用)
注: 像這種成功的話得到這種參數(shù)自己一定存起來,下一步肯定要用即ticket,lang,uuid,scan第三步掃描成功去獲取你的登錄憑據(jù)
API | 獲取登錄憑據(jù) |
---|---|
url | https://wx2.qq.com/cgi-bin/mm... |
method | GET(text/plain;charset=utf-8) |
params |
ticket : ticket uuid : uuid lang : lang scan : scan fun : 參考:new version 參考:v2 |
返回?cái)?shù)據(jù)(XML):
0 OK xxx xxx xxx xxx 1
核心數(shù)據(jù)點(diǎn): skey, wxsid, wxuin, pass_ticket
注: 切記,第三步會(huì)返回cookie,存下來,這里這個(gè)接口會(huì)得到cookie的。 cookie哪里用到我會(huì)說明的。第四步微信初始化
API | 微信初始化 |
---|---|
url | https://wx2.qq.com/cgi-bin/mm...lang&pass_ticket=pass_ticket |
method | POST |
data | JSON(application/json; charset=UTF-8) |
header | Content-Type: application/json; charset=UTF-8 |
params | { ???? BaseRequest: { ???????? Uin: wxuin, ???????? Sid: wxsid, ???????? Skey: skey, ???????? DeviceID: xxx, ???? } } |
注:r這個(gè)參數(shù)是通過js的一個(gè) ~new Date 這是一個(gè)類似二進(jìn)制反轉(zhuǎn)的一個(gè),可自行百度或者打開控制臺(tái)輸出一下就知道了。
DeviceID這個(gè)參數(shù)是一個(gè)簡(jiǎn)單js拼接出來的參數(shù) "e"+(Math.random().toFixed(15)).substring(2, 17)
返回?cái)?shù)據(jù)(JSON):
{ "BaseResponse": { "Ret": 0, "ErrMsg": "" }, "Count": 11, "ContactList": [...], "SyncKey": { "Count": 4, "List": [ { "Key": 1, "Val": 635705559 }, ... ] }, "User": { "Uin": xxx, "UserName": xxx, "NickName": xxx, "HeadImgUrl": xxx, "RemarkName": "", "PYInitial": "", "PYQuanPin": "", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "HideInputBarFlag": 0, "StarFriend": 0, "Sex": 1, "Signature": "Apt-get install B", "AppAccountFlag": 0, "VerifyFlag": 0, "ContactFlag": 0, "WebWxPluginSwitch": 0, "HeadImgFlag": 1, "SnsFlag": 17 }, "ChatSet": xxx, "SKey": xxx, "ClientVersion": 369297683, "SystemTime": 1453124908, "GrayScale": 1, "InviteStartCount": 40, "MPSubscribeMsgCount": 2, "MPSubscribeMsgList": [...], "ClickReportInterval": 600000 }
第四步中獲取 SyncKey, User 后面的消息監(jiān)聽用。
第五步消息檢查是否有新消息(這里要帶上cookie)API | synccheck |
---|---|
url | https://webpush.wx2.qq.com/cg...skey&sid=wxsid&uin=wxuin&deviceid=xxx&synckey=Synckey&_=xxx |
method | POST |
data | JSON(text/javascript) |
header | ContentType: application/json; charset=UTF-8 |
params |
返回?cái)?shù)據(jù)(String):
window.synccheck={retcode:"xxx",selector:"xxx"} retcode: 0 正常 1100 失敗/登出微信 1101 在其他地方登錄了微信 1102 無(wú)憑據(jù)或者憑據(jù)已失效 selector: 0 正常 2 新的消息 7 進(jìn)入/離開聊天界面
注: deviceid 和上面的DeviceID這個(gè)參數(shù)是一樣的:一個(gè)簡(jiǎn)單js拼接出來的參數(shù) "e"+(Math.random().toFixed(15)).substring(2, 17)
我們叫他時(shí)間戳取反吧
_是一個(gè)當(dāng)前時(shí)間毫秒級(jí)13位數(shù)的時(shí)間戳第六步獲取最新消息(要帶上Cookie)
API | webwxsync |
---|---|
url | https://wx2.qq.com/cgi-bin/mm...wxsid&skey=Skey |
method | POST |
data | JSON(text/plain) |
header | ContentType: application/json; charset=UTF-8 |
params | { ???? BaseRequest: { Uin: User下的Uin, Sid: wxsid, Skey: skey, DeviceID: DeviceID}, ???? SyncKey: syncKey, ???? rr: 時(shí)間戳取反 } |
返回?cái)?shù)據(jù)(JSON):
{ "BaseResponse": {"ErrMsg": "", "Ret": 0}, "SyncKey": { "Count": 不確定個(gè)數(shù), "List": [ {"Val": 636214192, "Key": 1}, ... ] }, "ContinueFlag": 0, "AddMsgCount": 1, "AddMsgList": [ { "FromUserName": "", "PlayLength": 0, "RecommendInfo": {...}, "Content": "", "StatusNotifyUserName": "", "StatusNotifyCode": 5, "Status": 3, "VoiceLength": 0, "ToUserName": "", "ForwardFlag": 0, "AppMsgType": 0, "AppInfo": {"Type": 0, "AppID": ""}, "Url": "", "ImgStatus": 1, "MsgType": 51, "ImgHeight": 0, "MediaId": "", "FileName": "", "FileSize": "", ... }, ... ], "ModChatRoomMemberCount": 0, "ModContactList": [], "DelContactList": [], "ModChatRoomMemberList": [], "DelContactCount": 0, ... }
注 這一塊比較要特別注意,得到消息后發(fā)現(xiàn)返回的信息也是有SyncKey 這個(gè)要更新一波直接拿下來替換自己的舊的,不然第五步檢查消息是會(huì)出現(xiàn)問題就是刷的特別快,而且消息是不正確的。因?yàn)檎嬲晒υL問的到是微信的請(qǐng)求不會(huì)立即返回,一個(gè)請(qǐng)求會(huì)跑的比較久至少幾十秒,因?yàn)榉乐汞偪癖闅v,不用擔(dān)心因?yàn)橐坏┯袛?shù)據(jù)返回微信服務(wù)器會(huì)立刻返回?cái)?shù)據(jù)給你進(jìn)入下一階段的循環(huán)。這一步也是比較坑的就是SyncKey要記得更新就行了。還有一個(gè)很騷的點(diǎn)就是_這個(gè)參數(shù)雖然是毫秒級(jí)的13位時(shí)間戳,但是在微信第一次獲取后他不會(huì)再去new了,就是一直+1+1;致謝
本項(xiàng)目受到以下項(xiàng)目的啟發(fā):
Zhao / wxBot
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73980.html
摘要:場(chǎng)景主要的場(chǎng)景有如下幾個(gè)掃二維碼登錄版系統(tǒng)比如微信版,在手機(jī)端微信登錄的前提下,掃二維碼確認(rèn),自動(dòng)登錄網(wǎng)頁(yè)版。小結(jié)二維碼掃描登錄是個(gè)挺潮流的功能,這要求既有系統(tǒng)增加改造,也要求針對(duì)這種形式的登錄帶來潛在的攻擊進(jìn)行安全防范。 序 本文主要來研究一下二維碼登錄的相關(guān)場(chǎng)景和原理。 場(chǎng)景 主要的場(chǎng)景有如下幾個(gè): app掃二維碼登錄pc版系統(tǒng) 比如微信web版,在手機(jī)端微信登錄的前提下,掃二維碼...
摘要:相關(guān)資料博客微信第三方登錄接口開發(fā)端微信掃碼登錄文檔移動(dòng)端網(wǎng)頁(yè)微信公眾平臺(tái)授權(quán)登錄微信開放平臺(tái)登錄與微信公眾平臺(tái)授權(quán)登錄區(qū)別在哪微信登錄接口幾個(gè)問題微信登錄的和區(qū)別百分號(hào)編碼在線轉(zhuǎn)換第三方登錄 微信登錄接口開發(fā)須知 APP登錄接口 PC網(wǎng)站登錄接口 微信移動(dòng)網(wǎng)頁(yè)登錄接口(又稱微信公眾號(hào)授權(quán)登錄) 移動(dòng)端非微信自帶瀏覽不支持微信登錄 微信移動(dòng)網(wǎng)頁(yè)登錄接口(又稱微信公眾號(hào)授權(quán)登錄) ...
摘要:關(guān)于本教程有任何建議或者疑問,都?xì)g迎郵件與我聯(lián)系,或者在上提出教程流程簡(jiǎn)介教程將會(huì)從如何分析微信協(xié)議開始,第一部分將教你如何從零開始獲取并模擬擴(kuò)展個(gè)人微信號(hào)所需要的協(xié)議。 現(xiàn)在的日常生活已經(jīng)離不開微信,難免會(huì)生出微信有沒有什么API可以使用的想法。 那樣就可以拿自己微信做個(gè)消息聚合、開個(gè)投票什么的,可以顯然沒有這種東西。 不過還好,有網(wǎng)頁(yè)版微信不就等于有了API么,這個(gè)項(xiàng)目就是出于這個(gè)...
摘要:查詢是否掃描二維碼登錄顯示了二維碼以后,用戶必須用手機(jī)微信掃描這個(gè)二維碼才能登錄。 我的小站 網(wǎng)頁(yè)版微信掃碼登錄流程 1. 請(qǐng)求頁(yè)面 先打開https://wx.qq.com/顯示出頁(yè)面,這時(shí)候會(huì)加載一堆的html,js等資源。 2. 獲取會(huì)話UUID 微信Web版本不使用用戶名和密碼登錄,而是采用掃描二維碼登錄,所以服務(wù)器需要首先分配一個(gè)唯一的會(huì)話ID,用來標(biāo)識(shí)當(dāng)前的一次登錄。 使用...
摘要:實(shí)現(xiàn)流程圖運(yùn)行流程用戶訪問微信網(wǎng)頁(yè)版,微信服務(wù)器為這個(gè)會(huì)話生成一個(gè)全局唯一的,上面的中就是這個(gè),此時(shí)系統(tǒng)并不知道訪問者是誰(shuí)。用戶打開自己的手機(jī)微信并掃描這個(gè)二維碼,并提示用戶是否確認(rèn)登錄。 Web 掃碼登錄實(shí)現(xiàn) 基于 Workerman 做了一個(gè)掃碼登錄示例,給有需要的朋友參考一下。發(fā)現(xiàn)問題,歡迎指正。 實(shí)現(xiàn)流程圖 showImg(https://segmentfault.com/im...
閱讀 1067·2021-11-23 09:51
閱讀 2412·2021-09-29 09:34
閱讀 3149·2019-08-30 14:20
閱讀 1043·2019-08-29 14:14
閱讀 3182·2019-08-29 13:46
閱讀 1076·2019-08-26 13:54
閱讀 1633·2019-08-26 13:32
閱讀 1425·2019-08-26 12:23