协议分析(微信网页版 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 |
| --- | --------- |
| 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):

<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>

在这一步获取xml中的 skeywxsidwxuinpass_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 | { 
     BaseRequest: { 
         Uin: xxx, 
         Sid: xxx, 
         Skey: xxx, 
         DeviceID: xxx, 
     } 
} |

返回数据(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

时间: 2024-10-27 17:07:13

协议分析(微信网页版 wx2.qq.com)的相关文章

微信网页版的一些问题解答

1. 微信网页版的地址是什么? 微信网页版的地址是 wx.qq.com,用微信扫描网页上的二维码即可登录. 温馨提示:如果你使用爱微帮微信助手,那么自动打开的就是这个页面啦- 2. 我能用微信网页版干什么? 登录微信网页版,使用键盘来输入更方便.此外,还能使用文件传输助手. 3. 什么是文件传输助手? 文件传输助手,能够帮助你快速在手机与电脑间传输文件. 温馨提示:可以参考 [爱微帮技巧之-手机电脑文件轻松互传] 4. 如何登录微信网页版? 在浏览器输入wx.qq.com,用微信的"扫一扫&qu

利用浏览器进行微信网页版聊天的方法

  1.打开浏览器,然后输入微信网页版地址http://wx.qq.com/,回车; 2.接着打开手机上面的微信,找到"发现--扫一扫",然后对准扫描微信网页版界面上的二维码; 3.成功扫描之后,微信网页版就会提示"成功扫描 请在手机点击确认以登录",然后点击手机微信上的"我确认登录微信网页版"按钮; 4.这时就可以在浏览器上面看到微信聊天的界面了,可以开始聊天了. 5.如果想要想要退出网页版微信的话,点击手机上微信界面"退出"

微信网页版只能聊天?

  目前,不少网友都在使用微信网页版,方便自己浏览网页的同时,可以及时收到微信的信息,与微信好友聊天.不过,不少网友以为微信网页版只有在线聊天的功能,其实,微信网页版的功能还有非常多.感兴趣的网友可以一起来看看今天的微信网页版各大功能介绍! 微信网页版 微信网页版官方主页已经上线,是微信首次进入PC电脑领域,微信手机版和网页版打通之后,就可以直接在网页浏览器里收发手机微信消息.甚至是在电脑和手机之间传输文件.02月20日腾讯宣布推出QQ浏览器微信版.更为高效的微信沟通体验. 侧栏聊天形态 微信主

微信网页版有什么新功能

  功能介绍: 侧栏聊天形态 微信主界面以侧边栏形式展示聊天联系人,与网页左右并存 当和某个联系人聊天时,聊天面板会并列在联系人面板的右边,浮在网页之上.点击网页区域,聊天面板会自动收起. 如果电脑屏幕较宽,建议点击右上角的图钉按钮,固定住聊天面板.就可以方便的分屏操作,左屏聊微信,右屏看网页啦. 展开聊天 点击联系人面板右上角的新建聊天按钮,就可以选择与单个人聊天,或多个人群聊; 在与单个人聊天时,点击聊天面板右上角上的"+"号,可增加其他联系人新建群聊; 在与多个人群聊时,点击聊天

如何登陆微信网页版,那个二维码怎么玩的

如何登陆微信网页版 https://wx.qq.com/ 看到如下界面,这里我插入一张微信网页版的图片 我打开过这个界面好几次了.每次都在找输入微信账户的地方.却找不到.让我拿手机扫描这个页面,算什么. 我就如傻子一样对着电脑屏幕扫了一下(手机微信里面有个"扫一扫").结果手机弹出了 我点击确认,网页居然自动跳转到我的页面了. 然后我就可以在网页上玩微信了. 为什么要登陆网页版微信 1.我今天的主要目的是来看看微信公众的那些文章.手机上阅读毕竟没有电脑爽 2.这次是没有第二,所以看看微

微信网页版APP - 网页微信客户端电脑版体验

微信网页版很早就出来了,解决了很多人上班不能玩手机的问题.微信电脑版-网页微信客户端,直接安装在桌面的微信网页版,免去了开浏览器的麻烦.双击就启动了,和其他的应用程序一样:运行过程中可以隐藏在桌面右下角,有微信消息时会自动弹出一个小提示框,暂时没有快捷键提取消息.想查看更多订阅号历史消息可以用搜狗微信搜索噢. 微信网页版登陆首页:wx.qq.com 登录网页微信客户端和登录微信网页版一样,使用微信扫描二维码以登录,这点还是需要手机先安装微信才能扫描,如果比较早前的智能机或功能就没法装微信了,解决

微信网页版查询不到别人发的信息怎么办?

  先来看看微信网页版有什么功能? 当然首先微信网页版肯定是有聊天的功能.除了聊天之外,微信网页版的功能还包括:手机和电脑之间的文件传输,可以将手机视频.图片通过电脑微信网页版下载到电脑本地硬盘.类似的功能很多第三方应用都能做到(比如无线U盘),不知道微信网页版的传输速度如何. 故障分析:其实一般造成微信网页版查询不到别人发送的信息一般要么就是浏览器的问题,还有就是微信网页版导致信息查询不到的现象. 解决方法: 一.浏览器其中包括浏览器被中毒,浏览器不兼容的情况,尝试更换一个浏览器来登陆你的微信

java-请教下,微信网页版如何通过JAVA构建POST发图片给好友。

问题描述 请教下,微信网页版如何通过JAVA构建POST发图片给好友. 需求是针对微信网页版,通过抓包的查看需要的参数,然后通过JAVA在后台构建一个form 表单内直接上传到微信拿到MediaId后发送给好友,我现在主要是构建表表单一直弄不成功.主要是图片上的参数设置怎样设传,(非公众号)知道的讲解下,感激不尽!!! 解决方案 http://blog.csdn.net/jdsjlzx/article/details/8635884

微信网页版怎么查看我的收藏?

  用网页版微信确实可以方便很多人不用缩在小小手机面前,但是微信网页版怎么查看我的收藏呢?下面我们就来学一下网页微信收藏查看方法. 微信网页版怎么查看我的收藏 网页微信收藏查看方法 第一步.登陆手机微信的网页版微信,点击手机微信上的"文件传输助手". 第二步.在"文件传输助手"界面,点右下角的+号,之后点击"我的收藏". 第三步.点击你想要在微信网页版上查看的收藏,会弹出提示,点"是". 第四步.最后到网页版微信就能看到我的收