Web微信
基于Django開發Web微信
引子:
開發Web微信對我們沒有實際意義,為啥要開發它是為了讓我們通過現有的知識去知道騰訊的微信網頁版是怎么做的,分析它里面的一些通信流程,從而模仿他們。
一 Web微信通信流程分析
''' 微信是怎么做的?首先我們登陸微信網頁版 “https://wx.qq.com/” ,然后用Django搭建一個登陸頁面,微信回車走你有二維碼,自己搭的頁面走你,沒有二維碼。那我們是不是想要模仿微信網頁版,所以我們也要知道這個二維碼怎么來的。 '''1.訪問wx.qq.com獲取二維碼,然后檢查二維碼圖片的鏈接,發現每次后綴都會發生變化。
刷新后: 那我們能把它的路徑直接copy過來么?是不是不能呀,以為它是在變的。
2.分析network里面的響應數據,jslogin里面的response包含著我們想要的隨機碼。
3.接下來我們要對jslogin這個地址進行訪問,發現他每次的后綴都會發生改變,那我們進行猜測也是一個隨機碼,只不過這個碼看起來比較熟悉!你們猜一下它像什么?是不是你們經常看到的時間戳(然后去演示下),只不過這個時間戳是 * 1000的出的int類型。
所以接下里我們又得對jslogin這個鏈接進行拼接了:
# https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_= + '時間戳'4.經過分析后再次發現微信的后天隔一段時間不停地發送同一個請求:
# https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=Idzk7j7CnA==&tip=0&r=-147281961&_=1550630346300''' 需要變得值:1.uuid=Idzk7j7CnA==2._=1550630346300 '''奇怪了,為啥會這樣呢?最后發現原來微信后臺會隔一段時間發請求判斷你用戶有沒有掃碼,掃碼的話會顯示狀態碼:201,沒有則顯示狀態碼:406。如果重新發送請求也會顯示406。掃碼成功
騰訊用了一個請求機制叫做輪訓機制,就是不停的往服務端發送ajax請求。引出長輪訓,如果輪訓的話是不是會反復地發請求,這就會使服務器承受著巨大的壓力。那長輪詢就是設置隔多長時間發送一次請求,并且服務器一直hold住你的請求,騰訊的hold住30秒后再次發送請求。那這樣發請求就沒那么頻繁,對服務器造成的壓力就降低了很多。 # 長輪詢訪問地址 https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=odaPRDNX5A==&tip=0&r=-149192961&_=1550630346321輪詢與長輪詢 輪詢: 就是瀏覽器定時向后臺發送請求,怎么實現?JS里面是不是有個setiterval()可以每兩秒發送一次請求,但是效率很低。 長輪詢: 這里一個長輪詢地時候一直等著,相當于服務端給你寫了一個time.sleep,hold住了這次請求。二維碼出來了以后瀏覽器立即往微信發送一次請求。微信把你的請求給hold住了,最多hold30秒,30秒以后就再次發送一次請求。 長輪詢與輪詢的比較:長輪詢效率比較高,可以實時拿后臺數據,并且對服務器的壓力相對較低!''' 后臺寫一個長輪詢:有變化的只有 1 和 4,其他都不需要變1.uuid=odaPRDNX5A==2.tip=03.r=-1491929614._=1550630346321 '''狀態嗎: 408
狀態嗎: 201
在長輪詢的階段,假如你掃碼了,就會返回狀態碼201并且獲取自己的頭像圖片,接著拿到圖片渲染到你的頁面上。通過userAvatar獲取圖片地址。
這就是你想要的圖片地址來源。。。
狀態嗎: 200 掃碼并且登陸成功
# 狀態碼200表示登陸成功給我返回一個redirect_uri # 此時不知道是用來干嘛的?但是它給你肯定是有目的的,應該是讓你跳轉到用戶主頁 # 例子: 支付寶支付后跳轉到支付成功頁面 那么我們去微信那看下到底給我返回的是什么, # 有沒有給我返回跳轉后的請求結果, 清楚緩存后繼續測試跳轉的地址1:
# 登陸成功后跳轉的地址: # https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=A50oEH3MyI7d2XwV2BgLikxL@qrticket_0&uuid=IdjAm3DB0Q==&lang=zh_CN&scan=1550648853&fun=new&version=v2# 這個地址并不是我們的主頁,而是一個xml文檔 <!-- 用戶登陸后的xml文檔 --> <error> <ret>0</ret> <message></message> <skey>@crypt_23bb7547_131bebdf5855d4e497f8b8811e848926</skey> <wxsid>gw2/q1FskP/Tykh1</wxsid> <wxuin>1684358041</wxuin> <pass_ticket>GXaeST1uv4HugKXDoSJLDOAvmfU2iPGzvktiCxdgZuQQzsjBypoKwePVDsig2pzq</pass_ticket> <isgrayscale>1 </isgrayscale> </error>跳轉的地址2:
# 接著往這個地址發送一次請求,我們來分析這個地址里面攜帶的pass_ticket我們是不是在哪里見過!其實就是在我們上面登陸的xml里面。pass_ticket里面是不是有一大堆的值。所以我們需要把這些結果保存起來,以后做初始化需要用到。# https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-165558533&pass_ticket=GXaeST1uv4HugKXDoSJLDOAvmfU2iPGzvktiCxdgZuQQzsjBypoKwePVDsig2pzq跳轉的地址3:
# 這個地址里面的json數據我沒猜錯的話應該是你微信當前好友的聊天記錄。總結
- 上一篇: 谷歌地图街景服务涉嫌侵犯隐私遭起诉
- 下一篇: 张五常:功课不行 照样成才