微信网页版协议分析和实现机器人
- 打开首页,分配一个随机uuid,
- 根据该uuid获取二维码图片。
- 微信客户端扫描该图片,在客户端确认登录。
- 浏览器不停的调用一个接口,如果返回登录成功,则调用登录接口
- 此时可以获取联系人列表,可以发送消息。然后不断调用同步接口。
- 如果同步接口有返回,则可以获取新消息,然后继续调用同步接口。
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中的 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 | {
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
后面的消息监听用。
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
微信网页版协议分析和实现机器人相关推荐
- 微信网页版协议的java封装
链接: http://pan.baidu.com/s/1sk4jyQL 密码: 26q6 直接上代码,不多说了.看看demo类就会用了.ps:我只处理了群消息,需要处理普通消息的在心跳线程改一下.@@ ...
- 微信网页版前端源码分析(一)源码结构和公众号处理逻辑
(原创,转载请注明出处) 一.微信网页版前端结构 微信网页版为angular应用. angular应用启动代码 angular.bootstrap(document, ["webwxApp& ...
- facebook网页版登录_微信网页版关闭登录将影响一大批使用itchat等Web Api方案的微信机器人...
微信网页版限制登录或禁止登录将影响一大批使用itchat等Web Api方案的微信机器人 网页版微信 API 被封了,像使用 itchat wxpy wxbot等基于 web API 的微信 robo ...
- 浅谈扫描二维码登录微信网页版与摇一摇传图的实现原理
前言:简单体验了下微信网页版通过二维码登录和摇一摇传图功能,从技术角度看,网上专家吹捧的 [隔空取物]其实并不神秘,我先简单分析一下. 1. 微信移动端扫描二维码登录(C-S-C模式) CSC模式为: ...
- 基于C#简单实现的微信网页版接口
一.想法来源 作为程序员,对自己工具不满,就要去改造,对于微信已经厌恶极久了.总有人不合时宜的发语音,总有老板无时无刻的艾特,总有微商群发各种消息.重点是不能忍受语音.当现有客户端 ...
- 网页版登录入口_企业微信网页版怎么登录?企业微信客户端和网页版有什么区别?...
文丨语鹦企服私域管家原创,未经授权不得转载 企业微信有网页版也有客户端,很多小伙伴可能搞不清,今天语鹦企服就带你一起看看,企业微信客户端和网页版有什么区别?以及如何登录使用. ▎企业微信网页版: 与微 ...
- [微信] 微信网页版扫码登录的实现
我们先来回顾一下微信网页版的扫码登录过程 1. 打开微信网页版,https://wx.qq.com/ 2. 打开手机微信客户端,扫一扫 3. 点击确定,登录 看似简单的操作流程,中间涉及的数据交互有很 ...
- 微信网页版营销软件 防撤回 自动同意加好友
微信网页版营销软件,可实现微信自动同意加好友.微信发消息防撤回.微信群消息防撤回.好友消息自动回复等功能. 还可以实现各种群发好友信息. 此外好友发来的图片等,可以实现自定义的保存到本地文件夹. 详细 ...
- 基于.Net平台C#的微信网页版API
git上有很多类似的项目,但大多都是python和js的,为了便于.Net windows平台的使用,我重构了一个.Net版本的,已整理开源 https://github.com/leestar54/ ...
最新文章
- 第十章 使用机器学习的建议-机器学习老师板书-斯坦福吴恩达教授
- php跳转404_php伪静态.htaccess实现403,404跳转
- 初学者学MvcMovie遇到的问题解决办法
- 用生动的例子花式解释:python类中一定需要有 __init__方法么?没有会怎样?
- HDU1181:变形课(DFS)
- Error: Cannot create file “D:xampp\xampp-controlin“.拒绝访问。
- spring boot 2.0.3+spring cloud (Finchley)6、配置中心Spring Cloud Config
- ADO.NET数据访问方式:SqlDataReader
- 在linux中安装字体
- Android Studio 统计代码行数插件 — Statistic 申请软著写源程序量
- 如何使用手机打开CAJ文件?
- js外链跳转_给网站外链进行重定向跳转
- powerdesigner16 license key过期问题
- “领导喊你去办公室”电信诈骗现沪 专骗公务员
- 深圳mba学费一览表
- Cad二次开发小工具
- php音视频边下边播,视频个别片段加旁白,就是我边播放视频边录制旁白或声音...
- FME模板兴趣班第十八期(面遮挡处理) 任务小结
- 火狐代理127.0.0.1无法访问网页解决方法
- 基于中台思想的物流系统设计(三):构建物流地址能力
热门文章
- window.showModalDialog();会弹出当前页面脚本发生错误部分解决方法
- anbu三年模拟_暗部共享三年模拟软件库
- lua中面向对象(class)实现探索(一)(转)
- 找了这么多毕业设计题目,反而不知道选哪个了
- Win10系统为什么又提示重装打印机驱动?
- 第13课:scratchjr火箭发射升空
- office2013关闭登录账户登录功能
- linux下安装java编译器,编译器构造工具:安装 JFlex 和 CUP - 具 - 精华区 - 优秀的Free OS(Linux)版 - 北大未名BBS...
- STM32CUBEMX简单几步,DIY基于STM32的可编程USB鼠标,硬件自动化助手
- 通过analyzer分析dart代码