唯品会密码JS解密与python模拟登录( 二 )


唯品会密码JS解密与python模拟登录文章插图
成功运行出结果 , 抠取完毕 。
登录FormData通过上一节 , 我们已经可以得到加密后的密码 , 既然要登录 , 那就要回到 FormData 中 , 看看几个参数的含义与取值 , 经过一番测试 , 总结如下 , 感兴趣的也可以自己去试一下 。
参数取值loginName用户名password加密后的密码remUser是否记住用户名(0或者1)whereFrom可为空captchaId验证码(可为空)captchaTicket可为空
Cookies现在的登录都需要携带 cookies ,看一下本站登录时候的Cookies:
唯品会密码JS解密与python模拟登录文章插图
看起来很多 , 但是经过测试并不需要全部携带 , cookies应该是服务端产生的 , 所以还是老老实实带上吧 , 没有捷径 。 经过粗略测试 , 携带以下几个即可登录:
cookies = {' mars_pid': '你的',' cps': '你的',' mars_sid': '你的','times_XXXXX': '你的',' VipRUID': '你的',' VipRNAME': '',' VipDegree': '你的',' user_class': '你的',' VipCI_te': '你的','mars_cid': '你的'}有兴趣的可以继续试试这里面还有没有可以不用携带的 。
Header不管是登录还是爬取某个网页 , 请求头是绝对绕不过的 , 现在一起看看本站的请求头都有哪些:
唯品会密码JS解密与python模拟登录文章插图
好家伙 , 各种都有 , 不过大家不用担心 , 经过测试在本文实际爬取过程中只用携带 user-agent , 平时的爬取过程中 , 有些可能会检查上一个网页是在哪里 , 即要携带 referer ,还有 origin 和 host 也是可能会携带的 。
正式登录本次登录的几个要点在前面应该算已经阐述清楚了 , 现在要做的无非就是把 FormData 里的数据 post 到 login_url。
flowchatst=>start: 开始e=>end: 结束op0=>operation: 输入账号密码op1=>operation: 执行js代码加密密码op=>operation: 组装formdataop2=>operation: 把formdata post到登录urlop3=>operation: 分析返回st->op0->op1->op->op2->op3->e好了 , 流程知道了开始写代码 , 友情提示: 由于可能引起一些不必要的纷争 , 代码中的url和cookies值都隐藏了 , 大家按照自己的添加即可。 创建了一个 VipLogin 类 , 下面是部分模块的代码 。
执行js代码@propertydef exec_js(self):"""你自己的js路径:return:"""with open('..//js//weipinhui.js', encoding='utf-8') as f:weipinhui = f.read()js = execjs.compile(weipinhui)return js加密密码def get_pwd(self,password):key = ""raw = ""pwd = self.js.call('md5', password, key, raw)logger.info("加密结果为:{}".format(pwd))return pwd用户名加密def encrypt_phone(self,phone):return phone[:3]+"*"*5+phone[-3:]提交数据def login(self,user,passwd):if not user.isdigit or len(user) != 11:logger.error("目前仅支持手机号方式登录:{}".format(user))return Falsesession = requests.Session()vip_name = self.encrypt_phone(user)times_key = "times_"+userdata = http://kandian.youth.cn/index/{"loginName": user,"password": passwd,"remUser": "0","whereFrom":"","captchaId":"" ,"captchaTicket":"",}ck_dict = {' mars_pid': '你的',' cps': '你的',' mars_sid': '你的',times_key: '你的',' VipRUID': '你的',' VipRNAME': vip_name,' VipDegree': '你的',' user_class': '你的',' VipCI_te': '你的','mars_cid': '你的'}requests.utils.add_dict_to_cookiejar(session.cookies,ck_dict)resp = session.post(self.login_url,headers=self.headers,data=http://kandian.youth.cn/index/data,verify=False)ret = json.loads(resp.text)logger.info("账号{}返回结果为:{}".format(self._encrypt_phone(user),ret))if ret.get("result","") == "success":return Truereturn False