1. 程式人生 > >WEB版微信協議部分功能分析

WEB版微信協議部分功能分析

更新

不知道是不是因為網頁版微信的console.log問題被發現(可以看看知乎這裡),中秋假期裡出了新版本,有一些地方改了。但具體哪裡改了還沒時間去深究,不過可以發現同步更新的時間間隔改成了25s,如下圖:
同步間隔25s

可以對比原來的27s間隔(點我)

有發現其他改變的地方的朋友有興趣的話可以提出來,大家一起交流。

2016-09-20更新

因為專案需要,對網頁版微信的通訊過程做了一番研究。以下是探索過程中的分析筆記。

登入

1. 獲取UUID

首先,我們開啟瀏覽器端發起登陸請求,系統返回一個唯一的uid,並將uid的資訊繪製成二維碼返回給使用者。
這裡寫圖片描述

請求:

method GET
Params appid:wx782c26e4c19acffb,應用ID(固定值)
redirect_uri:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
fun : new
lang : en_US 或 zh_CN,瀏覽器的語言
_ : 1466394395577,時間戳(ms,js中的實現為new Date)

%2F是’/ ‘的URL編碼

返回資料(String):
window.QRLogin.code = 200; window.QRLogin.uuid = "xxx"
如下:
這裡寫圖片描述

2. 顯示二維碼

得到uuid之後,請求二維碼:
https://login.weixin.qq.com/qrcode/wYGuImiikg==

返回的資料:
一張二維碼圖片

3. 等待掃碼登入

method GET
params loginicon : true
uuid : 獲取到的uuid
tip : 1-未掃描 0-已掃描
r : 1698811404(時間戳取反,js中的實現:~new Date)
_ : 時間戳


返回資料(String):

window.code=xxx;

xxx值可以是:
    408 登陸超時
    201 掃描成功
    200 確認登入

如下:
(1)如果一直沒有掃描,則得到408返回碼
這裡寫圖片描述

(2)掃描成功後,得到201返回碼:
這裡寫圖片描述

掃描成功後網頁上會出現你的賬號頭像,userAvatar後面的字串是將要登入賬號的頭像(直接將userAvatar後面的字串放入位址列就可以得到你的頭像)

(3)登入成功,得到200返回碼:
這裡寫圖片描述

登入成功後的返回資料(String):

window.code=200;
window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/[email protected]_0&uuid=wYGRJ91k7A==&lang=en_US&scan=1466408041";

PS:scan值為時間戳(s),js中的實現為Date.now()


登入成功之前,每隔27s左右就會重新確認狀態,如下:
這裡寫圖片描述

4. 獲取登入引數(uin、skey、sid、pass_ticket)

請求:
https://wx.qq.com/cgi-bin/mmwebwx-bin/[email protected]_0&uuid=AaGxsJd1kQ==&lang=zh_CN&scan=1467183053&fun=new&version=v2
PS:其實這個請求是在window.redirect_uri最後拼接”&fun=new&version=v2”


返回資料(XML):

<error><ret>0</ret><message>OK</message><skey>xxx</skey><wxsid>xxx</wxsid><wxuin>xxx</wxuin><pass_ticket>xxx</pass_ticket><isgrayscale>1</isgrayscale></error>

解析可以得到:skeysiduinpass_ticket的值。

微信初始化

1. 獲取初始化資訊(賬號頭像資訊、聊天好友、閱讀等)

請求:

PS:DeviceID值的由來:e+15位隨機數,JS中的實現如下:

getDeviceID: function() {
    return "e" + ("" + Math.random().toFixed(15)).substring(2, 17)
},


返回資料(JSON):
這裡寫圖片描述
部分分析:
本次ContactList裡只有10個好友or群組,應該是最近的10個活躍物件(個數不是固定的);
另外,可以通過UserName來區分好友or群組,一個”@”為好友,兩個”@”為群組。
MPSubscribeMsg為公眾號推送的閱讀文章
User其實就是自己賬號資訊(用在頂部的頭像)

2. 開啟微信狀態通知

請求:


返回的資料(JSON):

{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
}
,
"MsgID": "8219790123546360012"
}

3. 獲取好友列表(webwxgetcontact)

請求:


返回資料(JSON):
這裡寫圖片描述
PS:
這個列表中包含好友、群組、公眾號。
好友和公眾號是通過”ContactFlag”區分的,值為1是好友,值為3是公眾號。

關於NickName,可以帶表情之類,所以有的人暱稱是這樣的:
"NickName": "<span class=\"emoji emoji270a\"></span>Wade"

部分欄位說明:

"Uin": 0,
"UserName": 使用者名稱稱,一個"@"為好友,兩個"@"為群組
"NickName": 暱稱
"HeadImgUrl":頭像圖片連結地址
"ContactFlag": 1-好友, 2-群組, 3-公眾號
"MemberCount": 成員數量,只有在群組資訊中才有效,
"MemberList": 成員列表,
"RemarkName": 備註名稱
"HideInputBarFlag": 0,
"Sex": 性別,0-未設定(公眾號、保密),1-男,2-女
"Signature": 公眾號的功能介紹 or 好友的個性簽名
"VerifyFlag": 0,
"OwnerUin": 0,
"PYInitial": 使用者名稱拼音縮寫
"PYQuanPin": 使用者名稱拼音全拼
"RemarkPYInitial":備註拼音縮寫
"RemarkPYQuanPin": 備註拼音全拼
"StarFriend": 是否為星標朋友  0-否  1-是
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 119911,
"Province":"City":"Alias": 
"SnsFlag": 17,
"UniFriend": 0,
"DisplayName": "",
"ChatRoomId": 0,
"KeyWord": 
"EncryChatRoomId": ""

4. 請求群組列表(webwxbatchgetcontact)

請求:

method POST
params BaseRequest:
{
    DeviceID:”xxx”
    Sid:”xxx”
    Skey:”xxx”
    Uin:xxx
}
Count:4
List:
[
    0:{UserName: “xxx”, EncryChatRoomId: “”}
    1:{UserName: “xxx”, ChatRoomId: “”}
    …
]

Q:EncryChatRoomId與ChatRoomId有什麼區別?

(1) 第一次請求得到最近一段時間內活躍的群組(但不知道騰訊是怎麼定義這段時間的):
POST表單提交的內容:
這裡寫圖片描述

上面LIST的內容是從微信初始化時(webwxinit)返回的資料中得到的:
這裡寫圖片描述

返回到結果如下:
這裡寫圖片描述
裡面有群組的名稱、群組成員等資訊

(2) 第二次請求得到剩下的(最近沒有交流的)群組:
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=xxx&lang=zh_CN&pass_ticket=xxx

POST表單提交的內容:
這裡寫圖片描述
PS:應該都是在獲取好友列表(webwxgetcontact)的返回資料中提取出來的(通過判斷”@@”即可)

返回到結果如下:
這裡寫圖片描述
PS: 裡面有群組的名稱、群組成員等資訊


訊息更新

1.訊息檢查(syncCheck)

method GET
params r=時間戳(ms)
skey=xxx
sid=xxx
uin=xxx
deviceid=xxx
synckey=1_654585659%7C2_654585745%7C3_654585673%7C1000_1467162721
_=1467184052133

PS:%7C是’| ‘的URL編碼

返回資料(String):

window.synccheck={retcode:"xxx",selector:"xxx"}

其中各個返回值的含義如下:

retcode:
    0 正常
    1100 失敗/退出微信
selector:
    0 正常
    2 新的訊息
    7 進入/離開聊天介面

2. 獲取最新訊息(webwxsync)

請求:

method POST
params BaseRequest:
{
    DeviceID:”xxx”
    Sid:”xxx”
    Skey:”xxx”
    Uin:xxx
}
SyncKey:
{
    Count: 8
    List:
    [
        0:{Key: 1, Val: 654585659}
        …
        7:{Key: 1001, Val: 1467198392}
    ]
}
rr:1678170712


rr: 時間戳取反
SyscKey值:
    第一次更新時POST提交的SyncKey部分是從前面webwxinit請求的返回資訊中得到的,如下圖;
    之後的每次更新都會使用最新的SyncKey進行請求。
這裡寫圖片描述

返回的資料(JSON):
這裡寫圖片描述


傳送訊息

傳送訊息(webwxsendmsg)

請求:

method POST
params BaseRequest:
{
    DeviceID:”xxx”
    Sid:”xxx”
    Skey:”xxx”
    Uin:xxx
}
Msg:
{
    ClientMsgId:”14672041846800613”
    Content:”hello, myself.”
    FromUserName:”xxx”
    LocalID:”14672041846800613”
    ToUserName:”filehelper”
    Type:1
}
Scene:0

可以看到我往<檔案傳輸助手>傳送了”hello,myself”

欄位說明:

Type: 1 文字訊息,3 圖片訊息(先把圖片上傳得到MediaId再呼叫webwxsendmsg傳送),其他訊息型別沒試。
Content: 要傳送的訊息(傳送圖片訊息時該欄位為MediaId)
FromUserName: 自己的ID
ToUserName: 好友的ID
ClientMsgId: 時間戳左移4位隨後補上4位隨機數 
LocalID: 與clientMsgId相同

返回的資料(JSON):

{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
}
,
"MsgID": "5897491620102102783",
"LocalID": "14672043702850802"
}


分析完這些就可以用程式碼實現互動過程啦。


  筆記中有些內容的展示參考了一些前人的表達方式。而且像很多人直接套用了Bootstrap框架導致千篇一律一樣,Markdown簡潔的標記語法也讓很多文章的格式上相似。但這正是Markdown出現的目的之一吧,簡潔、統一。

相關推薦

WEB協議部分功能分析

更新 不知道是不是因為網頁版微信的console.log問題被發現(可以看看知乎這裡),中秋假期裡出了新版本,有一些地方改了。但具體哪裡改了還沒時間去深究,不過可以發現同步更新的時間間隔改成了25s,如下圖: 可以對比原來的27s間隔(點我) 有發

WEB協議詳註(待續)

WEB微信協議詳註 微信機器人 當初寫微信機器人也是為了個紅包,雖然紅包拿到了,過程還是蠻有意思的,下面給下詳細說明。 微信入口主要有兩個(wx和wx2),wx老號 wx2新號,我微信是老號了,為了測試方便采用的是老號入口。 1.入口抓包,獲取uuid

WEB協議詳註(續)

心跳檢測 心跳同步 先放一張效果圖以上的基礎都是建立在正確同步心跳之上;呵呵,界面做的很醜哈,不過關鍵是功能實現了。再次強調一次: 同步中所用的synckey 第一次所需的synckey是在微信初始化時返回的字串中,在開啟同步心跳的時候第一次提交的synckey就是來源於此;

WiFi還能走多久?Wi-Fi功能最新測試結果分析

自從2014年騰訊推出“微信連Wi-Fi”功能以來,“微信WiFi”一度成為商業公眾號的吸粉利器。手機連線WiFi即可自動開啟公眾號,或者掃描二維碼開啟公眾號。既滿足了客戶WiFi上網,又可以滿足商家漲粉的需要。 一晃四年過去了,各種微信認證路由器、微信WiFi廣告產品一度風起雲湧。但是,根據我們的

Java 支付功能分享

微信支付越來越成為電商們熱衷的支付方式,微信官方也給分享了微信支付的原始碼,但缺少詳細的指引,對於新手來說會浪費大量的時間。 本場 Chat 主要適用於有微信支付需求但未進行過微信支付開發的開發者們,以案例的形式詳細的講述微信支付的整個流程,參與活動我會給大夥分享可以跑通 Java 原始碼,只需修

Android SDK分享功能中的最全過程步驟分析

在前面有一章已經分析過怎麼用官方的demo分享微信資訊了,在這裡我就不再多說,其中關於在自己應用分享說得很簡單,本文作者也是經過一番折騰才弄成功,為了以後讓大家都少走彎路,決定在這裡從頭到尾介紹怎麼在自己的應用中分享功能 !!注意:順序不能亂!! 1、建立自己的應用 Tes

利用Wireshark軟體對協議分析---qpic

閱讀文章 http://www.docin.com/p-658948771.html?qq-pf-to=pcqq.group pdf 下載地址 http://download.csdn.net/detail/zhangmiaoping23/8722179

Android小代碼(轉)

一個 get 登錄 switch racer 指點 然而 系統 sha 以下代碼僅適用於Android版微信; //switchtabpos:讓微信tab更貼合Android Design 如果你並不喜歡微信Android版和iOS端同用一套UI,現在有一個小方法可以實現T

破解開通狀態過濾助手檢測工具

手無論購買什麽東西,大家最關註的幾個地方無非是:價格、質量、品牌等;微信營銷可以說已經成為當今最熱門的一個創業行業,無論是微商城或者是當下最火爆的消耗品微商,在其他在微信上進行營銷的項目。有一個好的微信檢測軟件固然關鍵。這也是一個必要途徑。 做微商最關鍵首要任務是如何增朋友圈的好友,微信不像

破解開通過濾軟件

作為一個營銷人,尤其是網絡營銷人,寫作能力應該說是基本功,是每個營銷人都應該具備的能力。無論是寫營銷策劃方案,寫軟文、公關稿件,還是策劃事件,宣傳文案,無一不要求寫作能力。可是,相當一部分營銷人卻不擅長寫作,對寫作非常的頭疼。 其實,寫作不是什麽難事,是有套路和規律可遵循的。今天和大家分享下

JAVA-語音.speex轉.wav

-a 微信 nothing reat making btool com ase 1.8 功能介紹:PC端將.speex文件解碼為*.wav文件 ### 環境:1. MAC OS 10.12.5/Linux2. Xcode 3. Gcc4. JDK 1.85. speex 1

客戶端協議思考,對比協議

而且 data- 漢字 生產力 時間 string blob 真的 struct 做了長時間的後臺,越來越感覺到客戶端和服務器之間的協議,是個很值得思考的東西。 一是消息的序列化,二是消息的推送,三是要不要支持多點登陸,就是一個賬號同時使用多個客戶端。

專業定制汽車網站開發支持電腦+手機++小程序

系統 ges 維護 一條龍服務 ice 郵箱 get 手機 小程序 網站開發采用:PHP+MySQL+ThinkPHP框架 服務器選擇: 服務器購買地址:http://www.erduyun.com/services/cloudhost/域名購買地址

控工具xp模塊-開發[(wechat)二次開發模塊]

ota raw qq群 loaded 好友 def 如果 chat 模塊安裝 http://repo.xposed.info/module/com.easy.wtool 微控工具xp模塊-開發版[微信(wechat)二次開發模塊] 基於xposed框架的微信二次開

頁面模板_頁面模板功能_頁面模板怎麽用?

頁面模板 微信頁面模板功能 微信頁面模板怎麽用 眾所周知,微信公眾平臺在前一段推出了一個功能,稱其名為“頁面模板”;那麽有些朋友就要問我了?這是個什麽鬼東西呀,可以做什麽呀!現在呢,我就跟大家一一道來。 頁面模板:是一個幫助公眾號建立網頁閱讀功能,幫助公

iOS6.5.21發布 適配iPhone X

left 微信 升級 接受 ges image 一個 記錄 添加 昨日,iOS版微信迎來v6.5.21正式版發布,本次升級主要適配iPhone X,在聊天中查找聊天內容時,可以查找交易消息。可以給聊天中的消息設置日期提醒。上一個正式版v6.5.16發布於9月13日,時隔51

識別圖片功能實現(以讀取銀行卡為例)

支付 ref gb2312 sta mil img 身份證識別 manager his 一,需求講解 如圖所示,掃描圖片的時候,實現銀行卡號和銀行名稱自動回填。 二,代碼 2.1,html頁面 1 <input type="file

小程序 功能函數 把數字1,2,3,4換成春,夏,秋,冬

cas i++ substr length tail efault 微信 ++ 數字 let season =‘1,2,3’; // console.log(season.length) if (season){ if (season.length==1){ season

ios系統web公眾號)開發遇到的問題及解決方案

編輯 doc pretty ram body abs 系統 stc 大神 1.1. 頁面滾動不流暢(2017-09-25) 現象: 網頁豎向滾動或橫向滾動不流暢。 解決方案: 為滾動元素添加css樣式: -webkit-overflow-scrolling: tou

IOS上看到的模板消息是一片空白

發送模板消息 是不是 alt 問題: 圖片 意思 找到 微信 直接 【1】問題:發送模板消息,微信顯示一片空白使用微信公眾號發送模板消息時,安卓上面的微信可以正常顯示消息,如下圖所示但是IOS系統上的微信接收到模板消息為一片空白,如下圖所示發送模板消息的接口返回的結果如下圖