摘要:還有一個很騷的點就是這個參數雖然是毫秒級的位時間戳,但是在微信第一次獲取后他不會再去了,就是一直致謝本項目受到以下項目的啟發
前言
工作之余突然對微信的網頁版的協議通信感興趣可以搞一波了解下。畢竟網頁版容易抓,靠一個瀏覽器的開發者工具的Network就開始抓包解析了。
這是我2019年03月寫的文檔。因為微信的協議可能隨時存在變動,以下內容可以參考一波。本人爬蟲的方法很簡單,就是盡一切方法模仿被爬蟲者的行為。
該文檔目前只寫到獲取最新消息。先記錄一波。有空更新
項目地址:楠尼瑪大帝 / wxWebR(Java版)流程步驟
(這里只說到成功登錄到微信并獲取最新消息,因為只是模仿到這里,其他的全部都已經清清楚楚只是看你調不調用而已了。該拿到的參數都有了)
去獲取一個uuid,可以根據這個uuid獲取一張二維碼登錄的圖片
微信客戶端掃描該二維碼,在客戶端確認登錄。
瀏覽器不停的調用一個接口,如果返回登錄成功,則調用登錄接口
循環遍歷一個檢查是否有新消息的接口。
如果新消息的接口返回有新消息的狀態碼去獲取消息接口。(完)
WebWechat API(這里也只說到成功登錄到微信并獲取最新消息。其他可以自行去抓包或者參考其他文檔比如碼云參考->python版(老版本)
第一步獲取UUID(參考方法 getUUID)API | 獲取 UUID |
---|---|
url | https://login.wx.qq.com/jslogin |
method | POST |
data | URL Encode(text/javascript) |
params |
appid: 應用ID 參考:wx782c26e4c19acffb redirect_uri 轉發地址 參考:https://wx.qq.com/cgi-bin/mmw... fun: 應用類型 參考:new lang: 語言 參考:zh_CN _: 時間戳 參考:當前時間毫秒級13位數的時間戳 |
返回數據(String):
window.QRLogin.code = 200; window.QRLogin.uuid = "xxx"
注:目前看來參數除了_ 當前時間毫秒級13位數的時間戳 其他都是固定的值。在微信給的js里面index_ad43596.js里搜索API_jsLogin可以得到這些參數。而且大部分不理解參數都可以從這個js文件得到答案。
顯示二維碼就不浪費時間直接就是拿第一步拿到的uuid拼接就是二維碼地址:https://login.weixin.qq.com/q...{uuid}
第二步等待掃碼登錄即微信確認登錄API | 獲取二維碼掃描登錄狀態 |
---|---|
url | https://login.wx.qq.com/cgi-b... |
method | GET(text/javascript) |
params |
tip :這個東西根據瀏覽器走的話就是第一次為1,后面都是為0,網上說是掃碼狀態 loginicon 參考:true uuid : 獲取到的uuid _ : 當前時間毫秒級13位數的時間戳 |
返回數據(String):
window.code=xxx; xxx: 【未掃碼的話】 -> window.code=408; 【手機掃碼但是未登錄】 -> window.code = 201; 【手機取消登錄】 -> window.code=400; 【手機授權登錄】 -> window.code=200; 當返回200時: wechatLoginStatus:window.code=200; window.redirect_uri= "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=XXX&uuid=XXX&lang=XXX&scan=XXX"; 當返回201時可以獲取掃碼用戶頭像的base64數據哦(好像沒啥用)
注: 像這種成功的話得到這種參數自己一定存起來,下一步肯定要用即ticket,lang,uuid,scan第三步掃描成功去獲取你的登錄憑據
API | 獲取登錄憑據 |
---|---|
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 |
返回數據(XML):
0 OK xxx xxx xxx xxx 1
核心數據點: skey, wxsid, wxuin, pass_ticket
注: 切記,第三步會返回cookie,存下來,這里這個接口會得到cookie的。 cookie哪里用到我會說明的。第四步微信初始化
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這個參數是通過js的一個 ~new Date 這是一個類似二進制反轉的一個,可自行百度或者打開控制臺輸出一下就知道了。
DeviceID這個參數是一個簡單js拼接出來的參數 "e"+(Math.random().toFixed(15)).substring(2, 17)
返回數據(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 后面的消息監聽用。
第五步消息檢查是否有新消息(這里要帶上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 |
返回數據(String):
window.synccheck={retcode:"xxx",selector:"xxx"} retcode: 0 正常 1100 失敗/登出微信 1101 在其他地方登錄了微信 1102 無憑據或者憑據已失效 selector: 0 正常 2 新的消息 7 進入/離開聊天界面
注: deviceid 和上面的DeviceID這個參數是一樣的:一個簡單js拼接出來的參數 "e"+(Math.random().toFixed(15)).substring(2, 17)
我們叫他時間戳取反吧
_是一個當前時間毫秒級13位數的時間戳第六步獲取最新消息(要帶上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: 時間戳取反 } |
返回數據(JSON):
{ "BaseResponse": {"ErrMsg": "", "Ret": 0}, "SyncKey": { "Count": 不確定個數, "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, ... }
注 這一塊比較要特別注意,得到消息后發現返回的信息也是有SyncKey 這個要更新一波直接拿下來替換自己的舊的,不然第五步檢查消息是會出現問題就是刷的特別快,而且消息是不正確的。因為真正成功訪問的到是微信的請求不會立即返回,一個請求會跑的比較久至少幾十秒,因為防止瘋狂遍歷,不用擔心因為一旦有數據返回微信服務器會立刻返回數據給你進入下一階段的循環。這一步也是比較坑的就是SyncKey要記得更新就行了。還有一個很騷的點就是_這個參數雖然是毫秒級的13位時間戳,但是在微信第一次獲取后他不會再去new了,就是一直+1+1;致謝
本項目受到以下項目的啟發:
Zhao / wxBot
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73980.html
摘要:相關資料博客微信第三方登錄接口開發端微信掃碼登錄文檔移動端網頁微信公眾平臺授權登錄微信開放平臺登錄與微信公眾平臺授權登錄區別在哪微信登錄接口幾個問題微信登錄的和區別百分號編碼在線轉換第三方登錄 微信登錄接口開發須知 APP登錄接口 PC網站登錄接口 微信移動網頁登錄接口(又稱微信公眾號授權登錄) 移動端非微信自帶瀏覽不支持微信登錄 微信移動網頁登錄接口(又稱微信公眾號授權登錄) ...
摘要:關于本教程有任何建議或者疑問,都歡迎郵件與我聯系,或者在上提出教程流程簡介教程將會從如何分析微信協議開始,第一部分將教你如何從零開始獲取并模擬擴展個人微信號所需要的協議。 現在的日常生活已經離不開微信,難免會生出微信有沒有什么API可以使用的想法。 那樣就可以拿自己微信做個消息聚合、開個投票什么的,可以顯然沒有這種東西。 不過還好,有網頁版微信不就等于有了API么,這個項目就是出于這個...
摘要:查詢是否掃描二維碼登錄顯示了二維碼以后,用戶必須用手機微信掃描這個二維碼才能登錄。 我的小站 網頁版微信掃碼登錄流程 1. 請求頁面 先打開https://wx.qq.com/顯示出頁面,這時候會加載一堆的html,js等資源。 2. 獲取會話UUID 微信Web版本不使用用戶名和密碼登錄,而是采用掃描二維碼登錄,所以服務器需要首先分配一個唯一的會話ID,用來標識當前的一次登錄。 使用...
摘要:實現流程圖運行流程用戶訪問微信網頁版,微信服務器為這個會話生成一個全局唯一的,上面的中就是這個,此時系統并不知道訪問者是誰。用戶打開自己的手機微信并掃描這個二維碼,并提示用戶是否確認登錄。 Web 掃碼登錄實現 基于 Workerman 做了一個掃碼登錄示例,給有需要的朋友參考一下。發現問題,歡迎指正。 實現流程圖 showImg(https://segmentfault.com/im...
閱讀 1075·2021-11-23 09:51
閱讀 2418·2021-09-29 09:34
閱讀 3158·2019-08-30 14:20
閱讀 1060·2019-08-29 14:14
閱讀 3188·2019-08-29 13:46
閱讀 1083·2019-08-26 13:54
閱讀 1640·2019-08-26 13:32
閱讀 1434·2019-08-26 12:23