微信协议分析和机器人实现
- 打开首页,分配一个随机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
执行流程
+--------------+ +---------------+ +---------------+| | | | | || 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 <br> fun : new <br> lang: zh_CN <br> _ : 时间戳 |
返回数据(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 <br/> _ : 时间戳 |
<br>
3. 等待登录(参考方法 waitForLogin)这里是微信确认登录
API | 二维码扫描登录 |
---|---|
url | https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login |
method | GET |
params | tip : 1:未扫描 0:已扫描 <br> uuid : 获取到的uuid <br> _ : 时间戳 |
返回数据(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 <br> uuid : xxx <br> lang : zh_CN <br> scan : xxx <br> 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
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> BaseRequest: { <br> Uin: xxx, <br> Sid: xxx, <br> Skey: xxx, <br> DeviceID: xxx, <br> } <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
}
这一步中获取 SyncKey
, User
后面的消息监听用。
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 | { <br> BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, <br> Code: 3, <br> FromUserName: 自己的ID, <br> ToUserName: 自己的ID, <br> ClientMsgId: 时间戳 <br> } |
返回数据(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 | { <br> BaseRequest: { <br> Uin: xxx, <br> Sid: xxx, <br> Skey: xxx, <br> DeviceID: xxx, <br> } <br> } |
返回数据(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 | { <br> BaseRequest: { <br> Uin: xxx, <br> Sid: xxx, <br> Skey: xxx, <br> DeviceID: xxx, <br> } <br> } |
返回数据(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 |
{ <br> BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, <br> SyncKey: xxx, <br> rr: 时间戳取反 <br> }
|
返回数据(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 | { <br> BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, <br> Msg: { <br> Type: 1 文字消息, <br> Content: 要发送的消息, <br> FromUserName: 自己的ID, <br> ToUserName: 好友的ID, <br> LocalID: 与clientMsgId相同, <br> ClientMsgId: 时间戳左移4位随后补上4位随机数 <br> } <br> } |
返回数据(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
微信协议分析和机器人实现相关推荐
- Web版微信协议分析—版本2
微信web协议分析(微信网页版 wx2.qq.com) 1.打开首页,分配一个随机uuid, 2.根据该uuid获取二维码图片. 3.微信客户端扫描该图片,在客户端确认登录. 4.浏览器不停的调用一个 ...
- python web微信应用(一) 微信协议分析
文章目录 前言 一.__get_uuid,获取 uuid 二.__gen_qrcode,生成二维码 三.__login,手机扫码登录 四.__get_params,获取登录参数信息 五.__initi ...
- 网页微信协议分析(一)——登录
参考:https://www.52pojie.cn/thread-836149-1-1.html 1,先分析二维码,多次刷新页面对比,红色部分属于变动的参数 二维码请求地址:https://login ...
- 微信协议分析 pc端记录
android端的之前参考如下帖子: https://blog.csdn.net/yy405145590/article/details/79963999 但是这个帖子出来之后,微信在pack之后又封 ...
- 微信web协议分析和实现微信机器人
微信web协议分析和实现微信机器人(微信网页版 wx2.qq.com) 1.打开首页,分配一个随机uuid, 2.根据该uuid获取二维码图片. 3.微信客户端扫描该图片,在客户端确认登录. 4.浏览 ...
- webqq2协议分析和qq聊天机器人简单实现(转)
webqq2协议分析和qq聊天机器人简单实现 转之http://hfutxf.javaeye.com/blog/800866 通过webqq接口,可以实现发送qq消息接收qq消息等,这样,想实现一个q ...
- 初出茅庐-----微信好友分析与微信机器人
初出茅庐-----微信好友分析与微信机器人 一.微信好友分析 1.简介 对微信的好友进行分析,统计好友的人数,省市的分布,并排序,并统计好友签名用词的特点.用pyechart图像显示,并存为网页文件. ...
- python hook pc微信_一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~...
原文链接一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~mp.weixin.qq.com 导语 众所周知,前段时间微信彻底关闭了网页版微信登录入口.于是一大波基于itchat ...
- 微信安卓协议分析笔记
一.查资料 网上没找到SDK可以分析,关于微信安卓协议的文章也比较少,比较有用的是<微信交互协议和加密模式研究>,这篇论文里介绍了微信使用RSA2048与AES-CBC-128结合的加密算 ...
最新文章
- 一个简单的程序来使用WiredTiger 存储引擎
- android资料整理
- shiro 全局变量定义
- 使用JDBC改变Oracle的session參数 NLS_DATE_FORMAT
- 鸡蛋该放在哪些篮子里?多少合适?
- 数据规范化理论(2NF,3NF,BCNF)[zz]
- ios相机黑边_黑边很碍眼很难看 苹果iPhone6黑边有什么用呢?
- 第一篇 - 手把手教你理清EOS各种开发环境搭建来龙去脉
- 视觉SLAM笔记(3) 视觉SLAM框架
- 中南大学计算机院转专业要求,机电工程学院2018级本科学生转专业的实施细则...
- 荣耀2021年度手机颜值天花板首销!2699元起
- 【jvm】jvm优化 jvm linux 大页
- ERROR InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0
- 深度学习2.0-34.ResNet 与 DenseNet
- 优先队列/oriority queue 之最大优先队列的实现
- 全网最全的 JavaScript 数组各个方法用途的思维导图
- C++结构体变量的初始化和结构体char数组成员初始化
- No provider available from registry
- 记:疯狂的程序员 (连续n天写n个代码)
- java银联在线支付开发_银联在线支付案例代码
热门文章
- 仿360手机助手下载按钮
- 在校大学生如何利用编程赚钱?
- 网络上的推广方式都有哪些?常见的网络推广形式!
- root用户无法打开xclock_oracle安装过程中图像界面启动问题(xdmcp) | 学步园
- 卡巴斯基起诉江民杀毒软件侵权
- [leetcode 10-4] 三、分割数组最多方案(双周赛第四题)
- phpcms mysql设置_PHPCMS mysql优化教程_PHPCms教程
- 微信企业号开发二:TOKEN缓存处理
- matlab接入交易,金字塔与MATLAB通过数据库交易对接
- echarts绘制四川地图