当初写微信机器人也是为了个红包,虽然红包拿到了,过程还是蛮有意思的,下面给下详细说明。
微信入口主要有两个(wx和wx2),wx老号 wx2新号,我微信是老号了,为了测试方便采用的是老号入口。
1.入口抓包,获取uuid
开启浏览器F12功能,对https://wx.qq.com抓包,拿到我们需要的入口地址,获取uuid
参数说明:appid 固定值
redirect_uri 固定值
fun 固定值
lang 固定值
_ 标准时间戳
返回:
window.QRLogin.code = 200; window.QRLogin.uuid = "wZ1Pov3CSw==";
这一步拿到uuid,进而uuid拿到登陆用户头像
2.获取二维码
参数说明:
https://login.weixin.qq.com/qrcode/+uuid 其中uuid为上一步获取
此处需注意返回的二维码是jpg图像,在delpgi处理的时候转换处理
3.获取登陆用户头像
参数说明:
loginicon:true 固定值
- uuid:wb1sJ27NXA== 上一步拿到的uuid
- tip:1 固定值
- r:-1747051986 可选,没明白这个是什么
- _:1522165474425 时间戳
返回:
window.code=201;window.userAvatar = 'data:img/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABQODxIPD.......
window.code=200;
window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=Af-yYTSZi- [email protected]_0&uuid=wb1sJ27NXA==&lang=zh_CN&scan=1522165494";
window.code 登陆状态
201 扫码成功 ,此时可获取登陆用户头像,但是base64编码字符串
200 登陆成功 ,此时需获取ticket,sacn,下一步需要ticket和scan
408 超时
头像处理:
4.获取skey, wxsid, wxuin, pass_ticket
这一步最关键的是要注意返回的cookie信息,得保存cookie信息,后面取好友头像都需要;且需获取skey, wxsid, wxuin, pass_ticket留着下一步用,其中wxsid等同sid,wxuin等同uin
delphi中获取cookie:
5.WEB微信初始化 并且获取最近联系人信息
参数说明:
r 时间戳
DeviceID:"e556747131131712" e开头后面为15位随机数
- Sid:"SnROJhZtphzwfrVN" 上一步获取的wxsid
- Skey:"@crypt_3644f5c5_cda37df8947228dea79115d5353586db" 之前获取的skey
- Uin:"1152509820" 上一步中的wxuin
返回:
此处可获取登陆用户的个人信息,其中UserName需保存留做下一步微信初始化;
此处需特别注意synckey这个json串,这个必须得处理,是后面心跳同步必须的参数。且synckey还得处理为这种形式:1_669512273|2_669514056|3_669513917|1000_1521781562。
6.开启微信状态通知
参数说明:
- ClientMsgId:1522165487663 时间戳
- Code:3 固定值
- FromUserName:"@e89318a6092d99a68ca4884bd194c221" 上一步中的username
- ToUserName:"@e89318a6092d99a68ca4884bd194c221"
7.获取全部好友列表
参数说明:
- pass_ticket:w%2FAWW%2BCIv6aHWOjucFm%2BS3z2GB7i8cq%2B0GqzGAXZXHCdYzHUEUA96EHdGExvR4rx
- r:1522165488107
- seq:0 固定值
- skey:@crypt_3644f5c5_cda37df8947228dea79115d5353586db
返回:
MemberList中包括了好友的一些基本信息,包括好友头像。
8.获取好友头像
其中url可以从上一步中的好友列表中获取到,也可以从微信初始化返回串中获取到,只是前者是部分好友,后者是全部好友;但这一步需要提交cookie,具体所需cookie见图
关于头像格式问题,我好友里面有2种格式jgp和png ,其余的没有,至于上面说的4种格式,是百度的。这一步需要格式转换,当然也可以替换成我们所想看见的头像,比如这样:
9.开启心跳检测,检测是否有新消息
这一步中以json提交的参数中最重要的就是synckey,在微信初始化获取的返回值中,url中得处理成1_669514562|2_669515616|3_669515447|1000_1522139642这个样子,但提交的参数中得以json串的形式提交。
返回:
window.synccheck={retcode:"0",selector:"2"}
retcode: 0正常
1100失败/登出微信
selector: 0正常
2新的消息
心跳同步中有一机制:第一次提交返回都是2,此时需要再次提交,提交所需的synckey来源于第一次提交后返回的synckey,只有这样才能正确同步。
10.
获取心跳检测后新消息
Request URL:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=eUHDYUDwG/zBTQI5&[email protected]_3644f5c5_fb23dd323ac02e87c4837e7fbb149a81&pass_ticket=fSIBCYjascLrYzTOgnZaQcXSHcMZ3kc0ZCTrx7DQD2oAFdV%252FggeRCPk%252BFnNhCVrL
Request Method:POST
sid:eUHDYUDwG/zBTQI5
skey:@crypt_3644f5c5_fb23dd323ac02e87c4837e7fbb149a81
pass_ticket:fSIBCYjascLrYzTOgnZaQcXSHcMZ3kc0ZCTrx7DQD2oAFdV%2FggeRCPk%2BFnNhCVrL
这一步提交需要以json方式且需提交cookie,成功后返回新的消息内容和最为重要的synckey信息。
-------------------------------------------------------我是分割线------------------------------------------------------------------------
放2张成功同步心跳的
原文地址:http://blog.51cto.com/hji116/2091858