转自:http://biezhi.me/2016/02/21/wechat-protocol-analysis/
  1. 打开首页,分配一个随机uuid,
  2. 根据该uuid获取二维码图片。
  3. 微信客户端扫描该图片,在客户端确认登录。
  4. 浏览器不停的调用一个接口,如果返回登录成功,则调用登录接口
  5. 此时可以获取联系人列表,可以发送消息。然后不断调用同步接口。
  6. 如果同步接口有返回,则可以获取新消息,然后继续调用同步接口。

Java版实现源码:https://github.com/biezhi/wechat-robot Python实现:https://github.com/Urinx/WeixinBot C#实现:https://github.com/sherlockchou86/WeChat.NET QT实现:https://github.com/xiangzhai/qwx

执行流程

       +--------------+     +---------------+   +---------------+|              |     |               |   |               ||   Get UUID   |     |  Get Contact  |   | Status Notify ||              |     |               |   |               |+-------+------+     +-------^-------+   +-------^-------+|                    |                   ||                    +-------+  +--------+|                            |  |+-------v------+               +-----+--+------+      +--------------+|              |               |               |      |              ||  Get QRCode  |               |  Weixin Init  +------>  Sync Check  <----+|              |               |               |      |              |    |+-------+------+               +-------^-------+      +-------+------+    ||                              |                      |           ||                              |                      +-----------+|                              |                      |+-------v------+               +-------+--------+     +-------v-------+|              | Confirm Login |                |     |               |
+------>    Login     +---------------> New Login Page |     |  Weixin Sync  |
|      |              |               |                |     |               |
|      +------+-------+               +----------------+     +---------------+
|             |
|QRCode Scaned|
+-------------+

WebWechat API

1. 获取UUID(参考方法 getUUID)

API 获取 UUID
url https://login.weixin.qq.com/jslogin
method GET
data URL Encode
params appid : wx782c26e4c19acffb 
fun : new 
lang: zh_CN 
_ : 时间戳

返回数据(String):

window.QRLogin.code = 200; window.QRLogin.uuid = "xxx"

2. 显示二维码(参考方法 showQrCode)

| API | 显示二维码 | | — | ——— | | url | https://login.weixin.qq.com/qrcode/{uuid} | | method | POST | | params | t: webwx 
_ : 时间戳|

3. 等待登录(参考方法 waitForLogin)这里是微信确认登录

API 二维码扫描登录
url https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login
method GET
params tip : 1:未扫描 0:已扫描 
uuid : 获取到的uuid 
_ : 时间戳

返回数据(String): ``` window.code=xxx;

xxx: 408 登陆超时 201 扫描成功 200 确认登录

当返回200时,还会有 window.redirect_uri=”https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=xxx&uuid=xxx&lang=xxx&scan=xxx”; ```

4. 登录获取Cookie(参考方法 login)

API webwxnewloginpage
url https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
method GET
params ticket : xxx 
uuid : xxx 
lang : zh_CN 
scan : xxx 
fun : new

返回数据(XML): ```

0 OK xxx xxx xxx xxx 1

在这一步获取xml中的 `skey`, `wxsid`, `wxuin`, `pass_ticket`### 5. 微信初始化(参考方法 wxInit)| API | webwxinit |
| --- | --------- |
| url | https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit |
| method | POST |
| data | JSON |
| header | Content-Type: application/json; charset=UTF-8 |
| params | { <br> &nbsp;&nbsp;&nbsp;&nbsp; BaseRequest: { <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Uin: xxx, <br>    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sid: xxx, <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Skey: xxx, <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DeviceID: xxx, <br> &nbsp;&nbsp;&nbsp;&nbsp; } <br> } |返回数据(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 } ```

这一步中获取 SyncKeyUser 后面的消息监听用。

6. 开启微信状态通知(参考方法 wxStatusNotify)

API webwxstatusnotify
url https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify
method POST
data JSON
header Content-Type: application/json; charset=UTF-8
params
     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 
     Code: 3, 
     FromUserName: 自己的ID, 
     ToUserName: 自己的ID, 
     ClientMsgId: 时间戳 
}

返回数据(JSON): { "BaseResponse": { "Ret": 0, "ErrMsg": "" }, ... }

7. 获取联系人列表(参考方法 getContact)

API webwxgetcontact
url https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact
method POST
data JSON
header ContentType: application/json; charset=UTF-8
params
     BaseRequest: { 
         Uin: xxx, 
         Sid: xxx, 
         Skey: xxx, 
         DeviceID: xxx, 
     } 
}

返回数据(JSON): { "BaseResponse": { "Ret": 0, "ErrMsg": "" }, "MemberCount": 334, "MemberList": [{ "Uin": 0, "UserName": xxx, "NickName": "Urinx", "HeadImgUrl": xxx, "ContactFlag": 3,"MemberCount": 0, "MemberList": [], "RemarkName": "", "HideInputBarFlag": 0, "Sex": 0, "Signature":"我是二蛋", "VerifyFlag": 8, "OwnerUin": 0, "PYInitial": "URINX", "PYQuanPin": "Urinx","RemarkPYInitial": "", "RemarkPYQuanPin": "", "StarFriend": 0, "AppAccountFlag": 0, "Statues": 0,"AttrStatus": 0, "Province": "", "City": "", "Alias": "Urinxs", "SnsFlag": 0, "UniFriend": 0,"DisplayName": "", "ChatRoomId": 0, "KeyWord": "gh_", "EncryChatRoomId": "" }, ... ], "Seq": 0 }

8.消息检查(参考方法 syncCheck)

API synccheck
url https://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck
method GET
data JSON
header ContentType: application/json; charset=UTF-8
params
     BaseRequest: { 
         Uin: xxx, 
         Sid: xxx, 
         Skey: xxx, 
         DeviceID: xxx, 
     } 
}

返回数据(String): ``` window.synccheck={retcode:”xxx”,selector:”xxx”}

retcode: 0 正常 1100 失败/登出微信 selector: 0 正常 2 新的消息 7 进入/离开聊天界面 ```

9. 获取最新消息(参考方法 webwxsync)

API webwxsync
url https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=xxx&skey=xxx&pass_ticket=xxx
method POST
data JSON
header ContentType: application/json; charset=UTF-8
params
     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 
     SyncKey: xxx, 
     rr: 时间戳取反 
}

返回数据(JSON): { 'BaseResponse': {'ErrMsg': '', 'Ret': 0}, 'SyncKey': { 'Count': 7, '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, ... }

10. 发送消息(参考方法 webwxsendmsg)

API webwxsendmsg
url https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=xxx
method POST
data JSON
header ContentType: application/json; charset=UTF-8
params
     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 
     Msg: { 
         Type: 1 文字消息, 
         Content: 要发送的消息, 
         FromUserName: 自己的ID, 
         ToUserName: 好友的ID, 
         LocalID: 与clientMsgId相同, 
         ClientMsgId: 时间戳左移4位随后补上4位随机数 
     } 
}

返回数据(JSON): { "BaseResponse": { "Ret": 0, "ErrMsg": "" }, ... }

更多资料: https://github.com/xiangzhai/qwx https://github.com/Urinx/WeixinBot http://www.07net01.com/2016/01/1201188.html http://www.cnblogs.com/xiaozhi_5638/p/4923811.html

协议分析(微信网页版 wx2.qq.com)相关推荐

  1. 微信web协议分析和实现微信机器人(微信网页版 wx2.qq.com)

    转载自:https://segmentfault.com/a/1190000004471678 1.打开首页,分配一个随机uuid, 2.根据该uuid获取二维码图片. 3.微信客户端扫描该图片,在客 ...

  2. 微信网页版协议分析和实现机器人

    原文链接:https://github.com/biezhi/wechat-robot/blob/master/doc/protocol.md 分析微信网页版协议,使用普通微信号开发微信机器人. -- ...

  3. 微信网页版前端源码分析(一)源码结构和公众号处理逻辑

    (原创,转载请注明出处) 一.微信网页版前端结构 微信网页版为angular应用. angular应用启动代码 angular.bootstrap(document, ["webwxApp& ...

  4. facebook网页版登录_微信网页版关闭登录将影响一大批使用itchat等Web Api方案的微信机器人...

    微信网页版限制登录或禁止登录将影响一大批使用itchat等Web Api方案的微信机器人 网页版微信 API 被封了,像使用 itchat wxpy wxbot等基于 web API 的微信 robo ...

  5. 网页版登录入口_企业微信网页版怎么登录?企业微信客户端和网页版有什么区别?...

    文丨语鹦企服私域管家原创,未经授权不得转载 企业微信有网页版也有客户端,很多小伙伴可能搞不清,今天语鹦企服就带你一起看看,企业微信客户端和网页版有什么区别?以及如何登录使用. ▎企业微信网页版: 与微 ...

  6. 浅谈扫描二维码登录微信网页版与摇一摇传图的实现原理

    前言:简单体验了下微信网页版通过二维码登录和摇一摇传图功能,从技术角度看,网上专家吹捧的 [隔空取物]其实并不神秘,我先简单分析一下. 1. 微信移动端扫描二维码登录(C-S-C模式) CSC模式为: ...

  7. [微信] 微信网页版扫码登录的实现

    我们先来回顾一下微信网页版的扫码登录过程 1. 打开微信网页版,https://wx.qq.com/ 2. 打开手机微信客户端,扫一扫 3. 点击确定,登录 看似简单的操作流程,中间涉及的数据交互有很 ...

  8. 微信网页版营销软件 防撤回 自动同意加好友

    微信网页版营销软件,可实现微信自动同意加好友.微信发消息防撤回.微信群消息防撤回.好友消息自动回复等功能. 还可以实现各种群发好友信息. 此外好友发来的图片等,可以实现自定义的保存到本地文件夹. 详细 ...

  9. 用python 、itchat登录微信网页版 微商自动回复功能、抓取微信好友信息列表。

    最近用Python实现了一些微信的简单玩法 我们可以通过网页版的微信 微信网页版 ,扫码登录后去抓包爬取微信信息,还可以post去发送信息. >>安装itchat这个库 pip insta ...

最新文章

  1. python保存路径_Python IDLE的默认保存路径?
  2. Transformer LambdaNetworks
  3. HEVC与3D-HEVC简介
  4. 如何用pip指令将python包安装到虚拟环境中
  5. 将JavaScript集成到QML中
  6. MVC学习笔记2 认识项目的目录结构与核心的DLL
  7. C语言求解100的带分数形式的代码
  8. 第一节:用Cube学32之简单IO口操作(点灯及按键)
  9. 对于NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解
  10. mate20pro换鸿蒙系统,鸿蒙2.0下载
  11. IT管理员喜欢OpManager的十大原因
  12. 前剪枝算法和后剪枝算法区别
  13. Unity-lambda表达式
  14. OSPF LSA内容解析及SPF算法分析
  15. 笔记本电脑无法连接WiFi,如何解决
  16. 电脑插耳机有声音,扬声器没声音的解决方案(win10)
  17. gitee团队协作使用
  18. 全球知名浏览器盘点,跨境电商的你知道吗?
  19. python实现《直觉模糊集决策与对策分析方法》08直觉模糊数的矩阵对策解法
  20. IT研发人员的四种工作

热门文章

  1. SwiftUI 如何解决Generic parameter ‘SelectionValue‘ could not be inferred
  2. 《《《翻译》》》SUN RGB-D数据集
  3. vue中printJS打印表格---json
  4. Holt 线性趋势模型,指数趋势模型和阻尼形式
  5. PMP备考大全:经典题库(8月第4周)
  6. Google无限容量网盘
  7. 乐富支付:互联网金融下的民企新生态
  8. 【BZOJ1001】狼抓兔子
  9. 计算机 蓝牙鼠标卡顿,蓝牙鼠标卡顿、漂移现象的解决方法
  10. 微信小程序页面跳转方法总结