一、前言

目的:打算用golang写一个淘宝抢购插件,但是每次抢购前都需要手动登录,这样太麻烦了,因此想实现自动登录获取cookie。

结果:失败的尝试。

既然这次尝试是失败的,我为啥又要记下来呢?我只是想今后有同样的操作时,可以在这里找到一点经验。在找相关资料时,我发现Python有个库——Selenium可以模拟浏览器行为,自然就能实现自动登录。

二、登录请求参数

打开淘宝登录页面,首先正常登录,利用Fiddler抓取请求参数(如下图),然后分析请求参数的来源。ncoToken:参与生成ua的令牌;TPL_password_2:rsa加密后的密码;ua:包含浏览器信息等等(谷歌一下淘宝ua,一推关于ta的介绍。);um_token:登录令牌;其他参数就不解释了,好像有58个请求参数,不过有些是空值参数,也有固定值。

二、分析参数来源

打开浏览器的开发者模式,直接定位到nlogin.js(如下图),(使用编辑器格式化代码,方便阅读。)

1. ncoToken和um_token

这两个令牌不是由js生成的,在第一次访问页面时,就已经包含在页面中了。因此,我使用一个go程,开始是每隔三个小时请求一下登录页面,然后从响应中截取这个两个参数。

2. TPL_password_2

在nlogin.js搜TPL_password_2,发现elPasswordRSA的值就是TPL_password_2,如下图。

继续定位elPasswordRSA,发现赋值代码:

try {
 this.elPasswordRSA.val(this.password.encrypt(a)),this.form.all("form")0].elements.loginASRSuc.value = "1", this.password.input.val("")
    } catch (b) {}

然后定位密码加密算法(this.password.encrypt),从而发现了密码加密的原理,可以自动生成密码了:

encrypt: function (a) {
            return a && this.pbk && this.exponent ? (this.rsa || (this.rsa = new e, this.rsa.setPublic(this.pbk, this.exponent)), a = this.rsa.encrypt(a)) : a
        }

3. ua

这个参数很蛋疼,找遍了所有js,还是没有完全弄懂ta的原理,可能是我js水平不够。然后谷歌这个参数,发现有博主根据这个ua参数的代表信息,原理写了一篇文,就直接拿来用了。https://livezingy.com/ua_inputid-in-taobao-ua/

现在几个关键参数都弄到了,就开始构造请求模拟登录了,事实证明,是我想的太简单了,响应是服务器内部错误,wtf。

三、开始自闭

1. 检查参数正误

2. 修改获取令牌的时间

3. 检查加密算法、ua算法

期间不知道修改了多少次,请求了多少次,反正响应都是服务器内部错误。真想说一句mmp。

四、巧施美色,诱敌两伤

最终,我把整个登录页面都抓取 了下来,包括所有静态资源,重新部署在本地上。go build,创建了一个本地登录页面,只不过将form表单的action改成了本地restfulAPI,输入账号密码,借助本地路由请求到淘宝,响应正常了,真是surprise。如下图:

 将响应另存为html文件,点击后跳转到了淘宝首页,显示是已经登录的状态。还不能高兴的太早,我要的是登录cookie,不是这种响应。带着正常响应后的cookie去请求个人中心页面,响应是正常的,将响应另存为html文件,点击后跳转到了淘宝vip页面,但是并不是登录状态。心态有点炸。

五、简而言之

留下几个猜想后面去尝试,但是结果就不记下来了。

1. 两个页面会话的cookie并没有共享,通过获取两个页面正常登录后的cookie,构造请求,分别请求两个页面就可以验证了。只要响应不是如下图,基本就正常了。

2. 把之前能正常响应中的url截取出来,自上而下分别请求ta们,带着请求后的cookie去请求抢购页面,看响应是否任需要登录。