协议分析(微信网页版 wx2.qq.com)


  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
urlhttps://login.weixin.qq.com/jslogin
methodGET
dataURL Encode
paramsappid : 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二维码扫描登录
urlhttps://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login
methodGET
paramstip : 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”; ```

APIwebwxnewloginpage
urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage
methodGET
paramsticket : 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)

APIwebwxstatusnotify
urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify
methodPOST
dataJSON
headerContent-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)

APIwebwxgetcontact
urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact
methodPOST
dataJSON
headerContentType: 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)

APIsynccheck
urlhttps://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck
methodGET
dataJSON
headerContentType: 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)

APIwebwxsync
urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=xxx&skey=xxx&pass_ticket=xxx
methodPOST
dataJSON
headerContentType: 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)

APIwebwxsendmsg
urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=xxx
methodPOST
dataJSON
headerContentType: 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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值