最近因业务需要研究了一下163邮箱登录流程,主要难点是登录验证码和两个cookie,密码rsa加密。mail.163.com登录有时是图形验证码,有时是网易易盾的点选汉字验证,对请求次数多的ip采用点选汉字验证。图形验证码当然更容易解析,而163.com主站登录为图形验证码,为了简便以此为例。 抓包分析请求的话直接用chrome开发者工具即可,记得勾选preserve log。其中有两个重要的cookie:JSESSIONID-WYTXZDL和jsessionid-cpta,以及密码rsa加密算法。
JSESSIONID-WYTXZDL是通过js脚本进行设置的,具体代码在这个请求中。
代码是经过压缩和转义的,首先格式化代码,然后通过debugger可以清晰的看到它做了什么。主要设置了JSESSIONID-WYTXZDL的值,并将未编码过的值暴露给了window对象。我们通过encodeURIComponent(window.jsessionidwytxzdl)
就能拿到完整的值。
同样jsessionid-cpta也是通过js进行设置的,具体代码在这个请求中,值同样暴露给了window对象。我们通过encodeURIComponent(window.jsessionidcpta)
拿到值。
输入帐号密码完成图形验证后,点击登录的请求中可以看到密码是加密过的。经过查找加密算法代码在这个请求中。加密算法为MP.encrypt2
方法,因脚本文件比较大,可以把加密算法部分单独拿出来。
有了上面3个值就可以通过HTTP client模拟请求登录了。因为3个值都是通过js设置的,服务端语言选择node就很方便了。图形验证码可以通过本地请求163的验证码并手动输入验证。登录请求比较多,这里就不贴了,主要是cookie和请求返回值的处理。
注: 因请求文件版本不同,三个请求地址可能会有变化,这里作为参考。
JSESSIONID-WYTXZDL: https://dl.reg.163.com/src/mp-agent-finger.html
jsessionid-cpta: http://ursdoccdn.nosdn.127.net/captcha/c_2.2.2.js
rsa加密算法: http://ursdoccdn.nosdn.127.net/webzj_cdn101/pp_index_dl_288a2baadb6e36e09a52563f2870b684.js