本帖最后由 木干鸟栖 于 2017-6-1 18:53 编辑
去年有写过一个微信好友提取的单子,因为需求简单,只要扫码登录,然后提取好友就可以了,所以只是简单分析了登录和获取好友,昨天没事儿了,突然想起,心血来潮,就好好分析一下,今天把昨天的一些东西分享出来,供新手学习,也供自己以后参阅,有不对的地方还望指正,大家一起交流。第一步:获取uuid ,获取二维码图片要用到uuid
请求地址:https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1496243303714
请求方式:GET
参数说明:appid是固定的 末尾是13位时间戳。
返回结果:window.QRLogin.code = 200; window.QRLogin.uuid = "4ZgGhinzAQ==";
code 200说明获取成功,code还可能有其他值,例如你把appid改一下,就400了
第二步:获取二维码图片
请求地址:https://login.weixin.qq.com/qrcode/4ZgGhinzAQ==
参数说明:红色部分就是uuid
请求方式:GET
返回结果:返回的字节集就是二维码图片
第三步:监测二维码状态
请求地址:https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4ZgGhinzAQ==&tip=0&r=-1594710725&_=1496243303716
请求方式:GET
参数说明:uuid就不说了吧,
r=-1594710725,我一开始以为这是一串随机数,但是后来发现不对了,随机的那么有规律?
先声明,这个r貌似不会检测,我测试不动他也能提交成功,如果嫌麻烦的朋友可以不看下边。
查询了一番后,发现是在JS里生成的, ~new date 意思是现行时间戳按位取反,就是把10位的时间戳,转成2进制,例如01010101这样的形式,然后把0变成1,把1变成0,然后转到10进制...... 凭咱这水平,不理解为啥要搞成这样比样......当然,我也不想用易语言代码来实现这个算法,直接用JS实现就好了。
易语言中用精易模块的类_脚本组件调用是这样的
变量名 | 类 型 | 静态 | 数组 | 备 注 | js | 类_脚本组件 | | | r | 文本型 | | |
js. 属性_语言 ()js. 添加代码 (“function r(){return ~new Date;}”)r = js. 运行 (“r”)调试输出 (r )返回 (r )
返回结果:window.code=值;根据code的值不同,后边跟不同的返回。
其中 code为201时,说明已经扫码,返回了头像
头像图片不是字节集形式返回,而是一串BASE64编码后的文本,只需要BASE64解码就是图片了,解码的部分不包含 data:img/jpg;base64,这个头部,是从/9j/4AA这里开始。
code为200时,说明在微信点击了确认登录。这时就可以下一步登录获取Cookie了。
code为408时,说明用户未操作。
code为400时,说明二维码图片失效,其实就是uuid失效,需要重新获取uuid然后获取新的二维码。
中午了,下午继续哈。
第四步:登录获取Cookie
请求地址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=Aalw0U65XU6KO33A8RfEolE7@qrticket_0&uuid=gexAchtPIg==&lang=zh_CN&scan=1496224825&fun=new&version=v2
请求方式:GET
参数说明:这个请求地址是在第三步返回的,就是当第三步的code值为200时,返回里有这个请求地址,后边加上&fun=new&version=v2
返回结果:返回里包含了skey、wxsid、wxuin、pass_ticket,这一步里返回了cookie,只需要取这一步的cookie即可。
第五步:微信初始化 webwxinit
请求地址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1576180982&pass_ticket=DoM2E5MFa0eoTTAi3b8tJbb0SgSkl%252FzNvNmeyatVe8T6jmv60Y6rZYSQMbVUTk2O
请求方式:POST
参数说明:r在前边说过了,pass_ticket是上一步返回的
提交数据:{"BaseRequest":{"Uin":"1107650341","Sid":"GlxIgMdgxgOKmEta","Skey":"@crypt_32e81ea3_7ff722a516ae3548a31ce49c7e0a0007","DeviceID":"e748606750801212"}}
标准的JSON,Uin、Sid、Skey、都在上一步有了,DeviceID是e后边加15位随机数,在JS中的实现如图
返回结果:返回JSON文本,里边包含了UserName和SyncKey,在后边会用到
第六步:获取微信通讯录
请求地址:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?pass_ticket=DoM2E5MFa0eoTTAi3b8tJbb0SgSkl%252FzNvNmeyatVe8T6jmv60Y6rZYSQMbVUTk2O&r=1496224888208&seq=0&skey=@crypt_32e81ea3_7ff722a516ae3548a31ce49c7e0a0007
请求方式:GET
参数说明:都是之前说过的
返回结果:标准的JSON文本,包含了微信号的好友、群、公众号。群是要保存到通讯录里的群,这里才会提取到,并不是提取你加入的所有群。
我的微信好友是129,公众号56,这样加起来是185,保存到通讯录的群是2个,这样是187,但是结果是190 ,我看了一下,190个里包含了自己,这样就是188个,还有2个是文件传输助手和微信支付。
未完待续.....................
|