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

博客分类: 微信 阅读次数: comments

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

打开首页,分配一个随机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协议一键登录

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

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

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

已实现功能

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": ""
    },
    ...
}