您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2020-10-16 09:47:40  来源:  作者:

上班都快一周了,一直想更新,奈何小伙还没有从假期的快乐中缓过来,今天终于耐下心来更新一小篇。抠一下某品会的JS代码,接着使用抠取的JS代码加密密码进行登录。友情提示:为避免不必要的纠纷,本文中所有网址都进行了一定隐藏。

私信小编01即可获取大量Python/ target=_blank class=infotextkey>Python学习资料

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

 

目标

标题已经阐明了本文的目的:

  1. 密码加密解密;
  2. 利用第一步加密方法加密后进行登录;
  3. 完整代码中尝试了多账号号批量登录(由于篇幅有限,移动到了 阅读原文 中);

抠出代码

找到目标网站,进入登录页面(对各位来说都很easy):

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

 

像以往一样输入错误的账号密码,看看提交的数据,点击登录后,提交账号密码 url 如下:

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

 

继续看 FormData ,如下图:

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

 

图中的 loginName 为你输入的用户名, password 为密码,可以看出被加密了,如果你熟悉了各类JS加密方式,心里应该能大概确定这就是 MD5 加密结果。暂时不用管其它的四个参数,接下来无非就是把加密JS代码抠出来,可以通过调用栈进去,也可以全局搜索 password 来定位JS文件,具体使用哪种方法就看各位看官的喜好了,我这里是从调用栈进去的(既然我们是在登录,那就点带有 login 字样的js文件进去好了):

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

 

进来后你可以搜一下 password 关键字,应该马上就能定位到想要的位置,定位的时候别忘了挂上一个断点,就像下图一样:

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

 

一看加密方法名就是熟悉的 MD5 ,接下来的操作应该更加熟悉了,激活断点(输入账号密码,点击登录,前提是你挂上了断点)。

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

 

点击后就进入了加密方法里:

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

 

function md5(string, key, raw) {
                if (!key) {
                    if (!raw)
                        return hex_md5(string);
                    return raw_md5(string)
                }
                if (!raw)
                    return hex_hmac_md5(key, string);
                return raw_hmac_md5(key, string)
            }

可以看出md5方法一共有三个参数,第一个 striing 即为密码, key 和 raw 是 undefined。接下笨一点的办法就是一步一步运行,把跳转的所有代码都扣下来,如果是刚开始学习抠代码,这个方法能增加很多调试”感觉”,慢慢抠得越来越顺手。取巧一点的无非就是找到大括号:

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

 

一直往上找到,应该马上就能找到正括号:

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

 

这样里面的代码其实就是本次要抠的代码,但是要使用 python 调用,还要进行一点改动。本次要抠的加密代码其实很简单,毕竟只是 md5 。经过稍微改写后,我们尝试使用python里 execjs 库执行:

唯品会密码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 。

flowchat
st=>start: 开始
e=>end: 结束
op0=>operation: 输入账号密码
op1=>operation: 执行js代码加密密码
op=>operation: 组装formdata
op2=>operation: 把formdata post到登录url
op3=>operation: 分析返回

st->op0->op1->op->op2->op3->e

好了,流程知道了开始写代码,友情提示: 由于可能引起一些不必要的纷争,代码中的url和cookies值都隐藏了,大家按照自己的添加即可 。创建了一个 VipLogin 类,下面是部分模块的代码。

执行js代码

@property
    def 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 False
        session = requests.Session()
        vip_name = self.encrypt_phone(user)
        times_key = "times_"+user
        data = {
            "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=data,verify=False)
        ret = json.loads(resp.text)
        logger.info("账号{}返回结果为:{}".format(self._encrypt_phone(user),ret))
        if ret.get("result","") == "success":
            return True
        return False

登录结果

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

 

登录成功的标志为 'result': 'success ‘如下:

{
    'result': 'success', 
    'errorCode': 0,
     'data': {
         'redirectUrl': 'https://www.xxx.com', 
         'captchaFlowData': None, 
         'extend': None,                  
         'bindMobile': True, 
         'illegalState': False
         }, 
     'redirectUrl': 'https://www.xxx.com'
 }


Tags:JS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script> console.log(returnCitySN["cip"]+&#39;,&#39;+returnCitySN["cname"]) </script> JS命名空间是...【详细内容】
2022-07-14  Tags: JS  点击:(4)  评论:(0)  加入收藏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>计时</title> </head> <body> <div style="display: flex; justify-content: center; align-item...【详细内容】
2022-07-12  Tags: JS  点击:(8)  评论:(0)  加入收藏
在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastify 构建一个 Full-stack 应用程序。在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastif...【详细内容】
2022-07-12  Tags: JS  点击:(9)  评论:(0)  加入收藏
今天,我们来总结下我们平常使用的工具函数,希望对大家有用。 1、封装fetch 源码: /** * 封装fetch函数,用Promise做回调 * @type {{get: (function(*=)), post: (function(*=,...【详细内容】
2022-07-07  Tags: JS  点击:(17)  评论:(0)  加入收藏
let arr = ["2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24", "27", "30", "33", "36...【详细内容】
2022-07-06  Tags: JS  点击:(24)  评论:(0)  加入收藏
前言在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct;如果想要获取值就需要先做断言将其转换为 map 或...【详细内容】
2022-07-05  Tags: JS  点击:(19)  评论:(0)  加入收藏
作为轻量级的本地存储方式,对于构建不依赖服务器的小型项目,用LowDB存储和管理数据是十分理想的选择。在Nodejs, Electron and browser等一些小型项目中经常能看到LowDB的身影...【详细内容】
2022-07-04  Tags: JS  点击:(30)  评论:(0)  加入收藏
在过去的五个月里,我一直在我当前的项目中使用 Spring Webflux,我还编写了很多 Nodejs 应用程序,并且使用 Promise 样式编码(async/await)的方式也几乎相同,而 Webflux 使用 Mon...【详细内容】
2022-06-27  Tags: JS  点击:(21)  评论:(0)  加入收藏
最近开发的项目上需要把数据导出为 xlsx 文档,找了一圈,发现 node-xlsx 简单好用,分享给各位。关于 node-xlsx在 web 开发中,管理后台生成 excel 报表并且下载,一个很常用的功能...【详细内容】
2022-06-24  Tags: JS  点击:(98)  评论:(0)  加入收藏
统一资源定位符(URL),是对 Web 资源(网页、图像、文件)的引用。URL 是指定资源位置和检索资源的一种协议(如http、ftp、mailto)。如下代码,这是今日头条发布文章的URL地址:https://...【详细内容】
2022-06-24  Tags: JS  点击:(43)  评论:(0)  加入收藏
▌简易百科推荐
1. 前言了解响应式编程,首先我们需要了解函数式操作和Stream的操作,下面我们简单的复习一下喽。1.1 常用函数式编程函数式接口中我们先来回顾一下Java中的函数式接口。常见的...【详细内容】
2022-07-15  二哥学Java    Tags:编程   点击:(1)  评论:(0)  加入收藏
在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastify 构建一个 Full-stack 应用程序。在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastif...【详细内容】
2022-07-12  qaseven    Tags:全栈   点击:(9)  评论:(0)  加入收藏
好的软件开发网站有哪些?做软件开发哪些网站能提供帮助呢?这些很多做软件开发的小伙伴都会问到的问题。007出海全球社交流量导航网站,整合了多方出海跨境网站资源,为你介绍出海...【详细内容】
2022-07-08  Chuhai007    Tags:软件开发   点击:(10)  评论:(0)  加入收藏
我们用monkey做压力测试后,会保存一个monkey日志,那如果想快速的分析日志中有哪些异常,我们可以用批处理工具进行快速的筛查,我们一起来看看吧。先编写个小脚本,然后修改为bat后...【详细内容】
2022-07-08  溪流涌动    Tags:monkey   点击:(13)  评论:(0)  加入收藏
白盒测试落地实践分为两个大方向,一个是静态分析,一个是动态分析,当然啦,也可以叫做静态测试和动态测试。那我们如何高质量保效率的做好白盒测试呢?Parasoft已经为您准备好了成熟...【详细内容】
2022-07-08  Parasoft中国    Tags:白盒测试   点击:(11)  评论:(0)  加入收藏
Altium Designer 自带脚本功能的开发项目,可以调用官方AD API接口对原理图或者PCB进行自动操作,本文主要分享开发的流程,和一些基本的概念信息,本文介绍的脚本工具例子可以用在P...【详细内容】
2022-07-07  电子工程师伟哥    Tags:Altium Designer   点击:(21)  评论:(0)  加入收藏
一、目录介绍 前置知识点 NIO Netty 的核心组件 Channel Callback Future 和 Promise 事件和 ChannelHandler Hello World二、前置知识点1、NIO首先我们需要回顾一...【详细内容】
2022-07-06  架构师jickly    Tags:聊天系统   点击:(16)  评论:(0)  加入收藏
1.事件流事件流是对事件执行过程的描述,了解事件的执行过程有助于加深对事件的理解,提升开发实践中对事件运用的灵活度。2.捕获和冒泡捕获阶段是【从父到子】的传导过程,冒泡阶...【详细内容】
2022-07-06  金乾坤    Tags:API   点击:(13)  评论:(0)  加入收藏
刷盘策略CommitLog的asyncPutMessage方法中可以看到在写入消息之后,调用了submitFlushRequest方法执行刷盘策略:public class CommitLog { public CompletableFuture<PutMe...【详细内容】
2022-07-06  Java码农之路    Tags:RocketMQ   点击:(16)  评论:(0)  加入收藏
最近读了本好书-《深度学习推荐系统》,读完不觉全身通畅,于是就有了写这篇文章的想法,把自己的理解和总结分享给大家。 本文将按照从算法到工程的顺序,先介绍一下推荐系统整体...【详细内容】
2022-07-05  InfoQ    Tags:推荐系统   点击:(22)  评论:(0)  加入收藏
站内最新
站内热门
站内头条