暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python js逆向入门(内含详细案例)

Python都知道 2022-07-26
504

温馨提示:本文由于篇幅过长, 读完本文预计需要花费5-10分钟,  建议预留充足的时间阅览


  • 前言

  • 快速试错

    • 1.检查参数

    • 2.多数据测试

  • js逆向过程

    • 1.定位参数接口

    • 2.debug分析过程

    • 3.编码测试

  • 总结

前言

大家好,我是一条有梦想的咸鱼。最近刚学习js(JavaScript, 后文统称js)逆向, 今天给大家分享一篇慢慢买获取商品历史价格的js逆向过程,一起学习成长。(PS:本文仅供学习参考, 请勿用于其他用途)

快速试错

1.检查参数

首先使用谷歌浏览器打开慢慢买网页,F12然后随意点击一个商品,查看接口:发现有我们需要的价格,然后再看看参数:请求头:

只有一个cxid咱不知道,于是看了一下网址:http://cu.manmanbuy.com/discuxiao_4076382.aspx。我马上打开PyCharm
编写了如下代码:

import requests
resp = requests.get('http://tool.manmanbuy.com/history.aspx?DA=1&action=gethistory&url=&bjid=&spbh=&cxid=4076382&zkid=&w=310&token=')
print(resp.text)

复制

输出:

{"datePrice":"[1602518400000,20.90,\"\"],[1602604800000,20.90,\"\"],[1602691200000,20.90,\"\"],[1602777600000,20.90,\"\"],[1602864000000,20.90,\"\"],[1602950400000,20.90,\"\"],[1603036800000,20.90,\"\"],[1603123200000,20.90,\"\"],[1603209600000,20.90,\"\"],[1603296000000,20.90,\"\"],[1603382400000,20.90,\"\"],[1603468800000,20.90,\"\"],[1603555200000,20.90,\"\"],[1603641600000,20.90,\"\"],[1603728000000,20.90,\"\"],[1603814400000,20.90,\"\"],[1603900800000,17.9000,\"\"],[1603987200000,17.90,\"\"],[1604073600000,17.90,\"\"],[1604160000000,17.90,\"\"],[1604246400000,17.90,\"\"],[1604332800000,17.90,\"\"],[1604419200000,17.90,\"\"],[1604505600000,17.90,\"\"],[1604592000000,17.90,\"\"],[1604678400000,17.90,\"\"],[1604764800000,17.90,\"\"],[1604851200000,17.90,\"\"],[1604937600000,17.90,\"\"],[1605024000000,17.90,\"\"],[1605110400000,17.90,\"\"],[1605196800000,17.90,\"\"],[1605283200000,17.90,\"\"],[1605369600000,17.90,\"\"],[1605456000000,17.90,\"\"],[1605542400000,17.90,\"\"],[1605628800000,17.90,\"\"],[1605715200000,17.90,\"\"],[1605801600000,17.90,\"\"],[1605888000000,17.90,\"\"],[1605974400000,17.90,\"\"],[1606060800000,17.90,\"\"],[1606147200000,17.90,\"\"],[1606233600000,17.90,\"\"],[1606320000000,17.90,\"\"],[1606406400000,17.90,\"\"],[1606492800000,17.90,\"\"],[1606579200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1606665600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1606752000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1606838400000,15.36,\"购买5件,当前价:16.80,满减:满3件,打9.5折,优惠券:满69减3\"],[1606924800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607011200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607097600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607184000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607270400000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607356800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607443200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607529600000,16.8,\"京东秒杀价:16.8\"],[1607616000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607702400000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607788800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607875200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1607961600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608048000000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1608134400000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1608220800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608307200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608393600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608480000000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608566400000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608652800000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608739200000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608825600000,10.90,\"购买1件,当前价:17.90,优惠券:满17减7\"],[1608912000000,15.60,\"购买5件,plus价格16.8,满减:满49减3,优惠券:满69减3\"],[1608998400000,15.60,\"购买5件,plus价格16.8,满减:满49减3,优惠券:满69减3\"],[1609084800000,15.60,\"购买5件,plus价格16.8,满减:满49减3,优惠券:满69减3\"],[1609171200000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609257600000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609344000000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609430400000,17.90,\"\"],[1609516800000,17.90,\"\"],[1609603200000,17.90,\"\"],[1609689600000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609776000000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],[1609862400000,16.40,\"购买4件,当前价:17.90,满减:满49减3,优惠券:满69减3\"],
...

复制

因内容太长截取的时候省略了很多,对比了一下页面的信息可以发现,返回的dataPrice字段里的列表第一个是日期时间戳
,第二个是价格
,第三个是满减信息

2.多数据测试

我心想: 这么简单这就爬下来了?于是我就去搜索多找了几个商品实验了一下:这是一个京东商品参数,感觉好像就是把cxid
换成了bjid
?于是我把bjid
参数带回刚刚的代码测试发现也是能正常跑通的,查看了页面想着bjid
能不能拿到:能拿到,没问题。但是发现两个bjid
为0的,于是又接着看bjid
为0的两个商品:发现加载不出来跳转过去看看:发现调的不是同一个接口,于是我又看了看参数:最终发现多了一个token
字段,没办法只能开始慢慢debug js了。

js逆向过程

1.定位参数接口

首先在左侧F12按下CTRL+F打开搜索框,搜索token
观察了一下可以看到后面几个token
都是在URL里的,这种肯定是先获取到token
才会传参带上token
的,就不用看了,主要浏览前面几个js文件。最终发现token
是在cutomRequest.js
文件里的,如下图:

2.debug分析过程

里面有给token
赋值的操作,而且仔细去看还有ajaxPost
操作,这里暂不截图,既然找到了token
,那就好办了,点击Source进入源码(查看接口的上面的tab是network,source一般在network左侧):从之前的Network的图中可以发现cutomRequest.js
文件是在tool.manmanbuy.com/Scripts
目录下的,如下图所示:这时候我们在source下打开刚刚的文件(谷歌浏览器打开源文件会有个pretty-print提示,点击确认来格式化js代码),在刚刚token
的位置打上断点,方式如下:颜色变蓝了就是打上断点了,这时候再刷新页面就可以可以debug停顿和看到数据信息了:现在仔细看看参数,全是js混淆参数,既然这样只能从这个方法第一行开始debug:如此那一个method和一个商品链接,能拿到,那就往下debug。要跳到哪一行就在哪一行打上断点然后点击右上角蓝色的向右箭头,第一个是定义变量不用管,跳到下面有个设置t
参数:鼠标选中悬停一会儿能够显示整个块运行的结果如上图,new一个Date对象再调用valueOf方法,继续去下一行:看debug信息上面那行应该是生成一个当前时刻的毫秒级时间戳,可以拿去时间戳解析平台对比下,这里就不对比了。从上面的debug可以看出来,先要把传入的数据加上t
参数存入当前时间戳,继续往下:foreach循环,上面把数据的key提了并进行排序(按字符从小到大,这里就不截图了)出来,这里应该是遍历遍历key,继续往下:如果是方法遍历的话点一下f这一行是可以跳转的,这一整块循环的逻辑大概是把之前参数的json对象复制到一个新的json对象,感兴趣的小伙伴可以自己去debug试试,这里就不占位置了,接着我们继续往下:又多了一个secret
参数, 我这里直接用快速探测法探测这个secret
是不是固定的。探测的方式只需刷新几次页面等debug到这里对比几个值是不是一样的,如果是一样的大概率就是固定值。这里我测试了一下secret
是固定的,所以直接记下来就可以了,再看之后的循环,简单debug了下,都是判断两不等于的,而且都是成立的,所以咱直接看里层的逻辑就可以了:又是嵌套函数,debug跳过去看看发现是求和函数,那就是求两个参数的和了,再看看两个参数:求和函数中又嵌套了一个调用函数,这破函数就是就是让xxx(a, b)变成a(b)函数调用,所以一个个参数和第二个参数都是要被encodeURIComponent
调用,再看看俩参数是什么:发现第一个参数是key,第二个参数的链接,这...不就是刚刚json的key和value吗?那这个循环的逻辑应该就是对key和value进行urlencode编码再拼接?继续往下看:果然如此,这一行又+=了一个secret
,所以最后还会有一个secret
,前面部分和我们分析的一致,继续往下走:要转一次大写,再往下:hex_md5
大家应该都能猜到是md5
md5
完之后还要再转一次大写,这样token
的生成就生成完了,我在这里把整个逻辑用代码写一遍就是:

import time
from urllib.parse import quote
import hashlib


def parse_req(d):
    # 设置当前时间ms
    d['t'] = int(time.time() * 1000)
    # 拷贝对象
    n = copy.deepcopy(d)
    # 提取key
    ks = list(n.keys())
    # key排序
    ks.sort()
    # secret
    ask = 'c5c3f201a8e8fc634d37a766a0299218'
    # token先拼一个secret
    mask = ask
    # 循环key
    for k in ks:
        # token拼接key和value urlencode后的结果
        # 这里说一下key都是英文,urlencode后没有什么变化的,所以就省略了
        # 还有一点urllib的quote库不会把/转为%2F, 所以这里自己转了下,大家有什么好用只对参数进行urlencode的包可以分享一下
        mask += f'{k}{quote(str(n[k])).replace("/""%2F")}'
    # token最后再拼一个secret
    mask += ask
    # token转大写
    mask = mask.upper()
    # md5 编码
    md5 = hashlib.md5()
    md5.update(mask.encode('utf-8'))
    # 获取md5编码后的结果再转一次大写就是token的值
    d['token'] = md5.hexdigest().upper()
    # 最后把含t和token的参数返回
    return d

复制

到这里就把整个token
获取流程搞定了,激动的我赶紧写了代码去测试一下:

# parse_req上面写了这里就不写了
req = parse_req({'key''https://detail.tmall.com/item.htm?id=638265162028''method''getHistoryTrend'})
headers = {
    'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    'Accept-Language''zh-CN,zh;q=0.9',
    'Content-Type''application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie''ASP.NET_SessionId=k55tyozvlmbcmbiwm1yn0ng1; Hm_lvt_85f48cee3e51cd48eaba80781b243db3=1641120605; Hm_lvt_01a310dc95b71311522403c3237671ae=1641120605; _ga=GA1.2.1386971910.1641120645; _gid=GA1.2.1891960103.1641120645; Hm_lpvt_85f48cee3e51cd48eaba80781b243db3=1641186149; Hm_lpvt_01a310dc95b71311522403c3237671ae=1641186149',
    'sec-ch-ua''" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile''?0',
    'sec-ch-ua-platform''Windows',
    'Sec-Fetch-Mode''cors',
    'Sec-Fetch-Dest''empty',
    'Sec-Fetch-Site''same-origin',
    'Accept-Encoding''gzip, deflate, br',
    'Sec-Fetch-User''?1',
    'Connection''keep-alive',
    'Host''tool.manmanbuy.com',
    'Origin''https://tool.manmanbuy.com',
    'Referer''https://tool.manmanbuy.com/HistoryLowest.aspx?url=https%3a%2f%2fitem.jd.com%2f100011493273.html',
}
print(headers)
print(req)
resp = requests.post(f'http://tool.manmanbuy.com/api.ashx', data=req, headers=headers)
print(resp.status_code)
print(resp.text)

复制

请求失败,得到如下响应结果:

{"msg":"无效的票据","code":1,"data":null,"count":0}

复制

于是又去检查一遍请求头,发现竟然还有个Authorization
参数:再回到刚刚的customRequest.js
里面,我们可以看到有一个ajaxPost
的方法,所以现在我们要再看看ajaxPost
整块的处理逻辑:可以看到这里就是调用前端ajax
的方法了,我们去看看里面,url
type
data
肯定都没办法设置请求头的,所以不出意外应该就是在beforeSend
里面了(额外提一下data
的参数值就是调用的getParam
方法,就是刚刚咱们获取t
token
的方法,感兴趣的小伙伴可以自己debug看看):beforeSenc
方法里面,第一个是创建对象不用管,直接debug到if里面,debug了下if条件一定为真,所以直接看里面的逻辑就可以了:先看第一个变量是setRequestHeader
函数,继续往下:终于找到我们需要的参数了,继续看后面值是咋弄的:

本地函数,跳转过去是求和函数(个人习惯把function(a,b) return a+b;的函数叫做求和函数,实际上可能是个字符串拼接,刚刚上面token
也是同理),继续往后:说明前面先添加一个"BasicAuth "
,继续往下:再拼一个getTicket()
方法,那咱再去看看这个方法:同理第一个定义对象咱不看,这里调用了本地函数的函数引用,大致应该就是这样(function(a,b) return a(b)):发现解析后是$("#ticket")
jquery
引用 id
ticket
元素,再往后看:发现最后调用了val方法,最终组合结果就是$('#ticket').val()
,获取页面元素id
ticket
value
值,我们再去页面搜索下ticket
咱先继续看刚刚js之后的逻辑,ticket之后咱可以调一次页面拿到:if条件是永远为真的,总是判断176 > 4 ,里面又是调substr
又是调substring
,核心逻辑就是实现从ticket中拿到的字符串从176往前取4个放在前面,再把第一个到第172个放在后面。用python描述下就是:

new_ticket = ticket[:176][-4:] + ticket[:172]

复制

3.编码测试

所以Auth
这个参数的值大概就是BasicAuth xxxxxxxxxxxx这样,于是我又改了下写了如下代码:

import copy
import requests

import time
from urllib.parse import quote
import hashlib


def parse_req(d):
    """
    这是解析请求啊,增加t和token参数
    """

    d['t'] = int(time.time() * 1000)
    n = copy.deepcopy(d)
    ks = list(n.keys())
    ks.sort()
    ask = 'c5c3f201a8e8fc634d37a766a0299218'
    mask = ask
    for k in ks:
        mask += f'{k}{quote(str(n[k])).replace("/""%2F")}'
    mask += ask
    mask = mask.upper()
    md5 = hashlib.md5()
    md5.update(mask.encode('utf-8'))
    d['token'] = md5.hexdigest().upper()
    return d

def parse_basic_auth(ticket):
    """
    这是解析ticket的值啊,就是上面说的那逻辑
    """

    return ticket[:176][-4:] + ticket[:172]

# 请求头从network里面先都copy过来吧,不知道服务器会校验哪些头
headers = {
    'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    'Content-Type''application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie''ASP.NET_SessionId=k55tyozvlmbcmbiwm1yn0ng1; Hm_lvt_01a310dc95b71311522403c3237671ae=1641120605; _ga=GA1.2.1386971910.1641120645; _gid=GA1.2.1891960103.1641120645; Hm_lvt_85f48cee3e51cd48eaba80781b243db3=1641120605,1641210384; sheng=广东; app-activity-download-close2=1; Hm_lpvt_85f48cee3e51cd48eaba80781b243db3=1641215142; Hm_lpvt_01a310dc95b71311522403c3237671ae=1641215142',
    'Upgrade-Insecure-Requests'"1",
    'sec-ch-ua''" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile''?0',
    'sec-ch-ua-platform''Windows',
    'Sec-Fetch-Mode''navigate',
    'Sec-Fetch-Dest''document',
    'Sec-Fetch-Site''same-origin',
    'Accept-Encoding''gzip, deflate, br',
    'Accept''text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-User''?1',
    'Connection''keep-alive',
    'Host''tool.manmanbuy.com',
    'Referer''https://tool.manmanbuy.com/ValidateAlibaba.aspx'
}
# 先调取页面获取ticket值,之前js里面读的就是页面的input标签的值啊,所以咱要先调一次页面搞到ticket的值
resp = requests.get('http://tool.manmanbuy.com/HistoryLowest.aspx?url=https://item.jd.com/100011493273.html', headers=headers)

from bs4 import BeautifulSoup

b = BeautifulSoup(resp.text, 'html.parser')
ticket = b.select('#ticket')[0]['value']
print(ticket)

# 测试请求参数
req = parse_req({'key''https://detail.tmall.com/item.htm?id=638265162028''method''getHistoryTrend'})

# 通过ticket构建auth
auth = parse_basic_auth(ticket)

# 这是调用api.ashx接口的请求头,能扣过来也都扣过来,免得检车不通过
headers = {
    'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    'Accept-Language''zh-CN,zh;q=0.9',
    'Content-Type''application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie''ASP.NET_SessionId=k55tyozvlmbcmbiwm1yn0ng1; Hm_lvt_01a310dc95b71311522403c3237671ae=1641120605; _ga=GA1.2.1386971910.1641120645; _gid=GA1.2.1891960103.1641120645; Hm_lvt_85f48cee3e51cd48eaba80781b243db3=1641120605,1641210384; sheng=广东; app-activity-download-close2=1; _gat_gtag_UA_145348783_1=1; Hm_lpvt_85f48cee3e51cd48eaba80781b243db3=1641216852; Hm_lpvt_01a310dc95b71311522403c3237671ae=1641216852',
    'sec-ch-ua''" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile''?0',
    'sec-ch-ua-platform''Windows',
    'Sec-Fetch-Mode''cors',
    'Sec-Fetch-Dest''empty',
    'Sec-Fetch-Site''same-origin',
    'Accept-Encoding''gzip, deflate, br',
    'Sec-Fetch-User''?1',
    'Connection''keep-alive',
    'Host''tool.manmanbuy.com',
    'Origin''https://tool.manmanbuy.com',
    'Referer''https://tool.manmanbuy.com/HistoryLowest.aspx?url=https%3a%2f%2fitem.jd.com%2f100011493273.html',
    'X-Requested-With''XMLHttpRequest',
    # 这个就是咱要加上的参数
    'Authorization''BasicAuth ' + auth,
}
print(headers)
print(req)
# 调用api获取历史价结果
resp = requests.post(f'http://tool.manmanbuy.com/api.ashx', data=req, headers=headers)
print(resp.status_code)
print(resp.text)

复制

这下调用接口终于能拿到正常结果了:

{"msg":"","code":0,"data":{"haveTrend":1,"changPriceRemark":"降幅4%","runtime":59,"zouShi_test":2,"changePriceCount":32,"spbh":"10|638265162028","spUrl":"https://item.taobao.com/item.htm?id=638265162028","spPic":"https://img.alicdn.com/bao/uploaded/i3/260808543/O1CN01wH0pMP2CykFkX6kO5_!!0-item_pic.jpg","currentPrice":133.0,"spName":"口红礼盒套装大牌正品全套盒化妆国风雕花小众彩妆生日礼物送女友","lowerDate":"2021-06-06T00:00:00","lowerPrice":116.33,"bjid":464502722,"zouShi":1,"siteId":10,"siteName":"天猫商城","datePrice":"[1613664000000,188.00,\"\"],[1613750400000,188.00,\"\"],[1613836800000,188.00,\"\"],[1613923200000,188.00,\"\"],[1614009600000,188.00,\"\"],[1614096000000,188.00,\"\"],[1614182400000,188.00,\"\"],[1614268800000,188.00,\"\"],[1614355200000,188.00,\"\"],[1614441600000,188.00,\"\"],[1614528000000,188.00,\"\"],[1614614400000,188.00,\"\"],[1614700800000,188.00,\"\"],[1614787200000,188.00,\"\"],[1614873600000,188.00,\"\"],[1614960000000,188.00,\"\"],[1615046400000,188.00,\"\"],[1615132800000,188.00,\"\"],[1615219200000,188.00,\"\"],[1615305600000,188.00,\"\"],[1615392000000,188.00,\"\"],[1615478400000,188.00,\"\"],[1615564800000,188.00,\"\"],[1615651200000,188.00,\"\"],[1615737600000,188.00,\"\"],[1615824000000,188.00,\"\"],[1615910400000,188.00,\"\"],[1615996800000,188.00,\"\"],[1616083200000,188.00,\"\"],[1616169600000,188.00,\"\"],[1616256000000,188.00,\"\"],[1616342400000,188.00,\"\"],[1616428800000,138.00,\"\"],[1616515200000,138.00,\"\"],[1616601600000,138.00,\"\"],[1616688000000,138.00,\"\"],[1616774400000,158.00,\"\"],[1616860800000,158.00,\"\"],[1616947200000,158.00,\"\"],[1617033600000,158.00,\"\"],[1617120000000,158.00,\"\"],[1617206400000,158.00,\"\"],[1617292800000,158.00,\"\"],[1617379200000,158.00,\"\"],[1617465600000,158.00,\"\"],[1617552000000,158.00,\"\"],[1617638400000,158.00,\"\"],[1617724800000,158.00,\"\"],[1617811200000,158.00,\"\"],[1617897600000,158.00,\"\"],[1617984000000,158.00,\"\"],[1618070400000,158.00,\"\"],[1618156800000,158.00,\"\"],[1618243200000,158.00,\"\"],[1618329600000,158.00,\"\"],[1618416000000,158.00,\"\"],[1618502400000,158.00,\"\"],[1618588800000,158.00,\"\"],[1618675200000,158.00,\"\"],[1618761600000,158.00,\"\"],[1618848000000,158.00,\"\"],[1618934400000,158.00,\"\"],[1619020800000,158.00,\"\"],[1619107200000,158.00,\"\"],[1619193600000,138.0000,\"\"],[1619280000000,138.00,\"\"],[1619366400000,138.00,\"\"],[1619452800000,138.00,\"\"],[1619539200000,138.00,\"\"],[1619625600000,138.00,\"\"],[1619712000000,138.00,\"\"],[1619798400000,138.00,\"\"],[1619884800000,138.00,\"\"],[1619971200000,138.00,\"\"],[1620057600000,138.00,\"\"],[1620144000000,138.00,\"\"],[1620230400000,138.00,\"\"],[1620316800000,138.00,\"\"],[1620403200000,138.00,\"\"],[1620489600000,138.00,\"\"],[1620576000000,138.00,\"\"],[1620662400000,138.00,\"\"],[1620748800000,138.00,\"\"],[1620835200000,138.00,\"\"],[1620921600000,138.00,\"\"],[1621008000000,138.00,\"\"],[1621094400000,138.00,\"\"],[1621180800000,138.00,\"\"],[1621267200000,138.00,\"\"],[1621353600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621440000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621526400000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621612800000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621699200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621785600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621872000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1621958400000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622044800000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622131200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622217600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622304000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622390400000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622476800000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622563200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1622649600000,138.0,\"\"],[1622736000000,116.33,\"购买3件,当前价:138.0,可叠加满减:每满200减30,优惠券:满99减5\"],[1622822400000,116.33,\"购买3件,当前价:138.0,可叠加满减:每满200减30,优惠券:满99减5\"],[1622908800000,116.33,\"购买3件,当前价:138.0,可叠加满减:每满200减30,优惠券:满99减5\"],[1622995200000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1623081600000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"],[1623168000000,133.0,\"购买1件,当前价:138.0,优惠券:满99减5\"]

复制

为了方便也只复制了一部分,想要尝试效果的小伙伴可以去试试。

总结

本文以慢慢买历史价格接口为案例,详细介绍了js逆向的每个步骤及处理方式。

最后,如果觉得文章不错的话,欢迎大家三连(点赞+在看+收藏),您的鼓励将是我们更新的动力(^▽^)

文章转载自Python都知道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论