转载自:https://segmentfault.com/a/1190000004471678

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 <br/> _ : 时间戳

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 后面的消息监听用。

部分分析: 
本次ContactList里只有10个好友or群组,应该是最近的10个活跃对象(个数不是固定的); 
另外,可以通过UserName来区分好友or群组,一个”@”为好友,两个”@”为群组。 
MPSubscribeMsg为公众号推送的阅读文章 
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
}

PS: 
这个列表中包含好友、群组、公众号。 
好友和公众号是通过”ContactFlag”区分的,值为1是好友,值为3是公众号。

关于NickName,可以带表情之类,所以有的人昵称是这样的: 
"NickName": "<span class=\"emoji emoji270a\"></span>Wade"

部分字段说明:

"Uin": 0,
"UserName": 用户名称,一个"@"为好友,两个"@"为群组
"NickName": 昵称
"HeadImgUrl":头像图片链接地址
"ContactFlag": 1-好友, 2-群组, 3-公众号
"MemberCount": 成员数量,只有在群组信息中才有效,
"MemberList": 成员列表,
"RemarkName": 备注名称
"HideInputBarFlag": 0,
"Sex": 性别,0-未设置(公众号、保密),1-男,2-女
"Signature": 公众号的功能介绍 or 好友的个性签名
"VerifyFlag": 0,
"OwnerUin": 0,
"PYInitial": 用户名拼音缩写
"PYQuanPin": 用户名拼音全拼
"RemarkPYInitial":备注拼音缩写
"RemarkPYQuanPin": 备注拼音全拼
"StarFriend": 是否为星标朋友  0-否  1-是
"AppAccountFlag": 0,
"Statues": 0,
"AttrStatus": 119911,
"Province": 省
"City": 市
"Alias":
"SnsFlag": 17,
"UniFriend": 0,
"DisplayName": "",
"ChatRoomId": 0,
"KeyWord":
"EncryChatRoomId": ""

请求群组列表(webwxbatchgetcontact)

请求:

url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=xxx&lang=zh_CN&pass_ticket=xxx
method POST
params BaseRequest:
{
    DeviceID:”xxx”
    Sid:”xxx”
    Skey:”xxx”
    Uin:xxx
}
Count:4
List:
[
    0:{UserName: “xxx”, EncryChatRoomId: “”}
    1:{UserName: “xxx”, ChatRoomId: “”}
    …
]

Q:EncryChatRoomId与ChatRoomId有什么区别?

(1) 第一次请求得到最近一段时间内活跃的群组(但不知道腾讯是怎么定义这段时间的): 
POST表单提交的内容: 

上面LIST的内容是从微信初始化时(webwxinit)返回的数据中得到的: 

返回到结果如下: 
 
里面有群组的名称、群组成员等信息

(2) 第二次请求得到剩下的(最近没有交流的)群组: 
https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=xxx&lang=zh_CN&pass_ticket=xxx

POST表单提交的内容: 
 
PS:应该都是在获取好友列表(webwxgetcontact)的返回数据中提取出来的(通过判断”@@”即可)

返回到结果如下: 
 
PS: 里面有群组的名称、群组成员等信息

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:"0",selector:"2"}
retcode:0 正常1100 失败/登出微信
selector:0 正常2 新的消息4 通过时发现6 删除时发现,对方通过好友验证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位随机数 
     } 
}

字段说明:

Type: 1 文字消息,3 图片消息(先把图片上传得到MediaId再调用webwxsendmsg发送),其他消息类型没试。
Content: 要发送的消息(发送图片消息时该字段为MediaId)
FromUserName: 自己的ID
ToUserName: 好友的ID
ClientMsgId: 时间戳左移4位随后补上4位随机数
LocalID: 与clientMsgId相同

返回的数据(JSON):

{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
}
,
"MsgID": "5897491620102102783",
"LocalID": "14672043702850802"
}

转载于:https://my.oschina.net/u/3508297/blog/1541747

微信web协议分析和实现微信机器人(微信网页版 wx2.qq.com)相关推荐

  1. 微信web协议分析和实现微信机器人

    微信web协议分析和实现微信机器人(微信网页版 wx2.qq.com) 1.打开首页,分配一个随机uuid, 2.根据该uuid获取二维码图片. 3.微信客户端扫描该图片,在客户端确认登录. 4.浏览 ...

  2. 协议分析(微信网页版 wx2.qq.com)

    转自:http://biezhi.me/2016/02/21/wechat-protocol-analysis/ 打开首页,分配一个随机uuid, 根据该uuid获取二维码图片. 微信客户端扫描该图片 ...

  3. Web 连接远程桌面(3389登陆器) 网页版

    Web 连接远程桌面(3389登陆器) 网页版 转载于:https://blog.51cto.com/obnus/489596

  4. 微信安卓协议分析笔记

    一.查资料 网上没找到SDK可以分析,关于微信安卓协议的文章也比较少,比较有用的是<微信交互协议和加密模式研究>,这篇论文里介绍了微信使用RSA2048与AES-CBC-128结合的加密算 ...

  5. 利用python实现微信自动回复群发等操作(不需要登录网页版微信)

    目前微信网页版限制登录,wxpy等模块操作微信的手段都无法使用了,前阵时间发现了WechatPCAPI这个模块,通过dll注入的手段实现操作微信,下面分享一下该模块的使用方法. 运行环境 Wechat ...

  6. 微信群控系统制作系列一——java模拟登录网页版微信

    PS:很多人咨询我怎么做手机群控系统,因此我开了个制作群控系统的系列,准备分五期讲解群控系统的制作.前两篇是基础内容. 今天做个简单的java模拟登录网页版微信. 既然要做模拟登录,那么我们一定要了解 ...

  7. web端 刷卡器_web端专用读卡器/网页版专用读卡器

    建和诚达打造了一款网页版专用IC卡读卡器,免除了WEB开发使用IC卡的麻烦,实现免驱动.免开发.即插即用等便捷,无需对软件做任何更改,可以直接使用IC卡,对IC卡进行读卡操作,是现在B/S结构下开发首 ...

  8. 微信安卓协议分析【源码】

    部分安卓协议源码截图: 废话不多说,直接上下载地址:微信协议源码下载

  9. 越南版微信 zalo 协议分析

    声明:文章内容仅供学习参考,严禁用于商业用途,否则由此产生一切后果与作者无关,如有侵权请联系作者进行删除. 2022.04.20 前言:frida, jadx,ida,unidbg,apk版本22.0 ...

最新文章

  1. Java高并发编程(五):Java中的锁Lock
  2. 利用该0 day漏洞的攻击活动情况
  3. 信息系统项目管理知识--项目沟通管理
  4. hdu2110(普通母函数)
  5. c语言删除文件remove_C程序删除文件
  6. Gartner调查显示政府部门数字化转型尚处萌芽期
  7. Ubuntu14.04 下截图工具与设置快捷键
  8. 爱奇艺副总裁离职?本人回应了 曾一手打造现象级节目《中国有嘻哈》
  9. php请求要通过什么协议,php – 发送多个应用程序协议请求(类似于mailto:)
  10. 5 张图带你搞懂容器网络的工作原理
  11. linux队列运行任务查看,Linux work queue工作队列小结与使用
  12. C++ Primer Plus 第六版课后习题答案(第五章)
  13. 左程云 Java 笔记--二叉树
  14. 【20191025】考试
  15. Springboot + Spring Security 实现前后端分离登录认证及权限控制
  16. JS字符串格式化函数 string.format
  17. 移动电影院迎来2.0版本,5部影片在移动电影院上举办“首映礼”
  18. 桌面图标文件不能拖动的解决方法
  19. Atom - 介绍和使用方法(好用的文本编辑器,代码提示高亮、Markdown)
  20. 三个维度看全球半导体格局变迁

热门文章

  1. 加速度传感器的安装夹具介绍
  2. 一月虚假网银地址活跃 江民杀毒软件即时屏蔽
  3. MySQL子查询篇(精选20道子查询练习题)
  4. Linux下的目录配置
  5. 健康上链——医疗健康行业数字化转型的关键路径|链塔智库
  6. 台式计算机硬盘,台式机硬盘排行 强力推荐两款
  7. 如何解决海康大华摄像头接入国标GB28181协议视频平台EasyGBS播放视频流,出现多个播放器的问题?
  8. 【如何选择云主机】云主机比较与测评
  9. python 实现链家网房源数据信息的爬取
  10. 计算机启动一下就停机,电脑主机亮一下就灭了,电脑开机3秒就循环重启怎么办...