不知道大家沒有沒接觸過微信自動添加好友的軟件,還有第三方基于微信做的功能,如分流搶票中的微信通知,可以指定人發消息,還有一些,微信集成機器人的功能.總之我對這一類的軟件始終保持著強烈的求知欲和好奇心.終于有一天我忍不住揭開它神秘的面紗,看看她誘人的絲襪下掩蓋著著的到底是怎樣一雙美腿. 終于,終于,我找到了揭開那層面紗的關鍵詞.微信web端通信協議
善用搜索的人,可能已經讀過一篇解析微信網頁版api的文章了,我也是看了那篇文章才想細細的研究一遍,求甚解.
打開微信網頁版 你會看到一個二維碼,打開控制臺,點擊netweok你會看到所有請求.
通過分析不難發現,頁面優先調取了一個https://login.wx.qq.com/jslogin 接口 獲取uuid,然后使用uuid去獲取二維碼https://login.weixin.qq.com/qrcode/IeJfvSS6vw==
最后調取一個接口去監聽用戶掃描二維碼.
那么掃描就分為了三部分
部分截圖
一步一步說
代碼寫的有點糙了,大佬湊合著看吧.
接口詳細描述
地址:url: https://login.wx.qq.com/jslogin參數:appid: wx782c26e4c19acffb // 隨便寫fun: new // 固定newlang: zh_CN // 固定zh_CN_: 1554721401246 // 當前時間戳
router.get('/', function (req, res, next) { let getUUID = function () { axios.get('https://login.wx.qq.com/jslogin', { params: { appid: global.appId, redirect_uri: 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage', fun: 'new', lang: 'zh_CN', _: +new Date() } }).then(loginRes => { console.log(loginRes.data) uuid = loginRes.data.split(';')[1].split('= ')[1].replace(/"/g, "") global.uuid = uuid console.log('UUID為____' + uuid) res.render('index', { title: 'Express', imgData: `https://login.weixin.qq.com/qrcode/${uuid}` }); }) } getUUID()});
此處注意坑點1:該接口返回結果不是json而是text
需要自己處理轉換
uuid就是上一步的返回值https://login.weixin.qq.com/qrcode/${uuid}
// 監聽掃描結果方法async function _queryScanStatus(tip) { let url = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/login' let body = { tip: tip, uuid: global.uuid, _: +new Date(), loginicon: true } let res = await axios.get(url, {params: body}) return dataToJson(res.data)}// 監聽掃描結果入口async function getScanResult() { let scanRes = await _queryScanStatus(1) if (scanRes['window.code'] == 201) { let confirmRes = await _queryScanStatus(0) if (confirmRes['window.code'] == 200) { let data = queryToJson(confirmRes['window.redirect_uri']) return data } }}function queryToJson(url) { let index = url.indexOf('?') let apiURL = url.substr(0, index) let query = url.substr(index + 1) let data = dataToJson(query, '&') data.apiURL = apiURL return data}// 監聽第一階段router.get('/listnScan', function (req, res) { _queryScanStatus(1).then(scanRes => { if (scanRes['window.code'] == 201) { res.json({scanRes}) } })})// 監聽第二階段router.get('/listnScanConfirm', function (req, res) { _queryScanStatus(0).then(confirmRes => { if (confirmRes['window.code'] == 200) { let data = queryToJson(confirmRes['window.redirect_uri']) res.json({data}) } })})
此處一開始我很難理解, 或者去監聽用戶掃描了,困擾了我很久,但當我注意到調取這個接口會,服務一直處于pending狀態我就立即明白了,原來用了那么low的處理啊.
注意這里需要二次調取接口,一次是用戶掃描,一次是用戶點擊了確定登錄的按鈕.
代碼如上:
接口詳細描述:
接口地址url: https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login請求方式method: get參數loginicon: true // 固定rueuuid: 4db-Azt7kA== // 第一步獲取的uuidtip: 0 // 固定值 0獲取1 0:是否掃描; 1:是否確定登錄r: 56037589 // _: 1554722097962 // 當前時間戳
代碼地址
整個過程還是挺有意思的,目前代碼才剛寫到用戶點擊確定登錄的監聽, 初始化用戶數據還沒做. 我會慢慢加上去的,后續還考慮封裝api供第三方使用.如果你也想參與請在下方評論留言
除了那個監聽用戶掃描狀態的接口比較耗時了一些,還有就是解析返回結果
用戶掃描后,會返回用戶頭像的接口這個接口奇坑無比. 有多種數據格式返回,需要做兼容.具體請看代碼
另外需求注意的一點是 生成二維碼和去監聽掃描決不能同時去請求, 否則會報超時返回408
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
臺灣藝人阿ken身高?林肯恩,1978年1月25日出生于臺灣,影視演員。他曾就讀于紐約李斯特拉斯堡戲劇學院和臺北延平中學。身高172cm英雄本色1和,英雄本色2拍攝只差一年,為什么周潤發的造型差了這么多?仔細看看小編的問題。也許是周潤發在英雄電影1和2中造型的不同設計?1有點土,但2沒有土,對吧?你用“變化很大”這個詞。我想是這樣的在電影英雄1中,mark Chow扮演香港偽造集團總干事的角色,因...
北京十中初中部怎么樣?第十中學非常好。其校長知名度高于官校,但在學校的教育理念和精耕細作上頗有建樹。是中央和各大部委選送的學校,共建單位都很優秀。是東城區最好的中學,生源出口比較理想。是一所與主流社會緊密相連的小學,外語教學特色令人印象深刻,令人羨慕。北京十中初中部怎么樣?在豐臺排名第三。我從初一開始就在十中讀書,現在高中還在十中。我覺得十中初中部比高中好。高三實驗班還可以,普通班就沒那么好了。另...
testflight 3.0怎么用?Testflight是一款面向開發人員的測試應用軟件。作為開發人員,您可以通過電子郵件邀請測試。如果你不知道如何使用它,你可以看看下面的教程。打開iPhone上的app store軟件進行搜索,或直接從當前軟件園下載最新版本的testflight;1。如果提示您是否允許[推送通知],則我們選擇允許;2?,F在,軟件中沒有內容,您需要等待開發人員邀請測試,然后才能正...