开源微信协议分析和机器人实现云客服 - LiberXue|FullStack|独立开发者|jekyll blog|GitHub blog

# 开源微信协议分析和机器人实现云客服

发布时间：2016-01-15 00:00:00 博客分类: 微信 阅读次数: comments
云客服 (1) 微信协议 (1) http (1) 微信 (2) 微信机器人 (1) 多开 (1)

# 开源微信协议分析和机器人实现云客服

2016-01-15 00:00:00

云客服 (1) 微信协议 (1) http (1) 微信 (2) 微信机器人 (1) 多开 (1)

## 打开首页，分配一个随机uuid，

### 根据该uuid获取二维码图片。

### 微信客户端扫描该图片，在客户端确认登录。

### 调用登录接口

浏览器不停的调用一个接口，如果返回登录成功，则 此时可以获取联系人列表，可以发送消息。然后不断调用同步接口。 如果同步接口有返回，则可以获取新消息，然后继续调用同步接口。

## Java版实现源码：

https://github.com/biezhi/wechat-robot 或 http://git.oschina.net/biezhi/wechat-robot

## Python实现：

https://github.com/Urinx/WeixinBot

## C#实现：

https://github.com/sherlockchou86/WeChat.NET

## QT实现：

https://github.com/xiangzhai/qwx

## liberxue

https://github.com/Liberxue/WechatYUNchart

#### 微信多开多账号机器人 云客服系统 微商营销 系统web协议一键登录

非公众号微信机器人微信群管家 微信自动回复 微信定时发送消息 微信多账号登录

### 逆向是工具，是我们学习他人软件的方法，而不是用来做一些非法的事情。

- 微信网页版本协议多开

- 一键登录

- 红包数量提醒

- wx用户识别男女签名备注，群发

- 自动发消息 定时发消息 群消息监控

- 机器人回复 ，定时回复，超时回复

- 聊天记录保存，聊天记录查看

git.oschina ： http://git.oschina.net/bolanzw/WechatYUNchart

git.GitHub：https://github.com/Liberxue/WechatYUNchart

##### 即时通讯交流：https://gitter.im/wechatliberxue/Lobby

##### Issues提交：https://github.com/Liberxue/WechatYUNchart/issues

### 协议分析：http://www.liberxue.com/%E5%BE%AE%E4%BF%A1/wechart.html

## 已实现功能

- 非公众号微信机器人微信群管家 微信自动回复 微信定时发送消息 微信多账号登录

- 逆向是工具，是我们学习他人软件的方法，而不是用来做一些非法的事情。

- 微信网页版本协议多开

- 一键登录

- 红包数量提醒

- wx用户识别男女签名备注，群发

- 自动发消息 定时发消息 群消息监控

- 机器人回复 ，定时回复，超时回复

- 聊天记录保存，聊天记录查看

t

## 该项目已停止更新维护不提供Issues

### 协议分析：

http://www.liberxue.com/wechart/wechart

## 执行流程

    sequenceDiagram
    GetUUID->>GetContact: QRCode Scane
    GetUUID->>GetQRCode: Login!

## WebWechat API

### 获取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"

## 显示二维码（参考方法 showQrCode）

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

### 等待登录（参考方法 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";

## 登录获取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中的 skey, wxsid, wxuin, pass_ticket

## 微信初始化（参考方法 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
    }

这一步中获取 SyncKey, User 后面的消息监听用。

## 开启微信状态通知（参考方法 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": ""
        },
        ...
    }

## 获取联系人列表（参考方法 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

## 消息检查（参考方法 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):

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

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

## 获取最新消息（参考方法 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,
        ...
    }

## 发送消息（参考方法 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": ""
        },
        ...
    }

本文由 liberxue 创作，采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外，均为本站原创或翻译，转载前请务必署名
最后编辑时间为:2016-01-15 00:00:00