Python crawlers slowly buy historical low prices to crawl js reverse entry

[This article is for learning only, please do not use it for illegal purposes, and will not be responsible for illegal use]

Preface:

Recently, I plan to switch from Java to crawlers. I have nothing to do during the holidays and I want to find something to do, so I wonder if I can climb down the historical prices of the products I bought slowly. (PS: The author usually likes to use Slow Buy to view historical prices when shopping, but he uses the app :-)

text

First use the Google browser to open the slowly buy webpage, F12 and then click on a product at will, check the interface: insert image description here
find the price we need, and then look at the parameters:
insert image description here
request header:
insert image description here

emmm, the parameters are quite simple, there is only one cxid which we don’t know, so I took a look at the website: http://cu.manmanbuy.com/discuxiao_4076382.aspx. emmm, the parameters are complete? I immediately opened Pycharm and wrote the following code:

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)

output:

{"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\"],
...

Because the content is too long, a lot is omitted when obtaining it. After comparing the information on the page, it can be found that the first list in the returned dataPrice field is the date and time stamp, the second is the price, and the third is the full discount information .

I thought this climbed down? So I went to search and found a few more products to experiment with:
insert image description here
This is a JD product parameter, emmm seems to replace cxid with bjid? So I brought the bjid parameter back to the code test just now and found that it can run normally. I checked the page to see if the bjid can be obtained
insert image description here
emmm, and it can be obtained, no problem. But what the hell is it that the first two bjids are 0? I went on to look at the two products with bjid 0, insert image description here
but they couldn’t be loaded? jump to seeinsert image description here

There is such a page, and the interface of the call is not the same? WF? There is still this kind of operation, so I looked at the parameters again, and insert image description here
there was an extra token. emmm, this TM is cheating, don't think it must be generated by the front-end js, you can only start to debug js slowly.

First, press CTRL+F on the left side of F12 to open the search box, and search for token (after all, it is a token parameter, this string cannot exist in js, right?) After observing, you can
insert image description here
see that the following tokens are all in the URL. It is definitely necessary to obtain the token first before passing the token with the token, so you don’t need to look at it, mainly browse the first few js files. After my unremitting observation, I finally found that the token is in the cutomRequest.js file, why? Look at the picture below:
insert image description here
there is an operation of assigning a value to the token, and if you look carefully, there is also an ajaxPost operation. I will not take a screenshot here to see the next question. Now that I have found the token, it will be easy to handle. Click Source to enter the source code (check the above interface) The tab is the network, and the source is generally on the left side of the network.) insert image description here
From the previous Network diagram, you can find that the cutomRequest.js file is in the tool.manmanbuy.com/Scripts directory. What? Didn't you see it? Then let me show you the screenshot: At
insert image description here
this time, we open the file just now under the source (Google browser will open the source file and there will be a pretty-print prompt, please confirm, this is the formatted js code, otherwise the glasses will be blind It can’t be shown), put a breakpoint at the position of the token just now, what? Breakpoints won't hit? Look at the picture below.
insert image description here
When the color turns blue, the breakpoint is set. At this time, you can refresh the page to debug and see the data information.
insert image description here
Now take a closer look at the parameters, WF? What the hell are these variables? Don't look at it, it must be the ghost of js confusion. Since you start debugging from the first line of this method (after all, you need to know the input parameters to know how the token is generated) emmm, so that a method and a product link can be obtained
insert image description here
. Then go down to debug. Nani? You don't know how to debug? Set a breakpoint on the line you want to jump to and then click the blue right arrow in the upper right corner. The first one is to define variables and don’t worry about it. Jump to the bottom and set the t parameter:
insert image description here
Select the mouse and hover for a while to display the result of the entire block operation, as shown in the above picture, emmm, although my js is not very good, but the general meaning should be to first create a Date object and then call the valueOf method, continue to the next line emmm, see the debug information insert image description here
above That line should generate a millisecond-level timestamp of the current moment, which can be compared with the timestamp analysis platform, and will not be compared here. As can be seen from the above debug, the incoming data should be stored in the current timestamp with the t parameter first, and then continue down:
insert image description here
foreach should be a loop, and the key of the data is mentioned above and sorted (according to characters from small to small) Big, I won’t take a screenshot here) come out, here should be the traversal traversal key, continue down:
insert image description here
if it is method traversal, click the f line to jump, the logic of this whole loop is probably to put the previous parameters The json object is copied to a new json object. Interested friends can go to debug and try it by themselves. It won’t take up space here, and then we will continue: WF
insert image description here
? What is a secret? Here I directly use the quick detection method to detect whether the secret is fixed. What? How to detect? Refresh the page several times and wait for the debug to come here to compare whether the values ​​are the same. If they are the same, the high probability is a fixed value. Here I tested that the secret is fixed, so just write it down directly. Then look at the subsequent cycle, and simply debug it. It is judged that the two are not equal, and they are both established, so let’s directly look at the inner layer. The logic is fine:
insert image description here
it’s a nested function again, debug jumps over to see that it’s a summation function, that’s the sum of two parameters, and then look at the two parameters: a insert image description here
calling function is nested in the summation function , this broken function is to make xxx(a, b) become a(b) function call, so each parameter and the second parameter are to be called by encodeURIComponent, and then look at what the two parameters are:
insert image description here
It is found that the first parameter is the key and the link of the second parameter, this. . . Isn't it just the key and value of json? Then the logic of this cycle should be to urlencode the key and value and then splice them together? Continue to look down:
insert image description here
Sure enough, this line has += a secret, so there will be a secret at the end, the previous part is consistent with our analysis, continue to go down:
insert image description here
emmm, to capitalize once, go down: insert image description here
emmm , everyone should be able to guess that hex_md5 is md5. After md5 is finished, it needs to be capitalized again, so that the generation of token is completed. Here I write the whole logic in code:

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

At this point, the entire token acquisition process has been completed. Excited, I quickly wrote the code to test it:

# 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)

Didn't expect to return this to me

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

What? Are there hidden parameters? I went through the request header again, and found that there is an Authorization parameter
insert image description here
emmm, is it so tricky? There is no way, we can only continue to study. When we go back to the customRequest just now, we can see that there is an ajaxPost method, and the entire logic call is entered from here. Nani? You ask how do I know from here? I have debugged ajaxGet and others, and the process will not stop until it gets there. So now we have to look at the processing logic of the whole block of ajaxPost. insert image description here
We can see that this is the method of calling the front-end ajax. Let's take a look inside. There is definitely no way to set the request header for url, type, and data, so it should not be unexpected. It is in beforeSend (additional mention that the parameter value of data is the getParam method called, which is the method we just obtained t and token. Interested friends can debug it by themselves.) In the beforeSenc method, the first one is to insert image description here
create Don’t worry about the object, just debug into the if, the if condition must be true after debugging, so just look at the logic inside (the next step is the focus of this article )
insert image description here
first look at the first variable is the setRequestHeader function, it’s interesting, continue Next insert image description here
, isn't this the parameter we want? It is not easy to TAT, continue to look at the value behindinsert image description here

The local function, jumping to the past is the summation function (personally used to call the function (a,b) return a+b; the function is called the summation function, in fact, it may be a string splicing, the token above is the same), continue to After:
insert image description here
BasicAuth, explain that first add a string of BasicAuth plus a space, and continue down:
insert image description here
spell out a getTicket() method, emmm, then let's take a look at this method:
insert image description here
the first definition object is the same, let's not look at it , here the function reference of the local function is called, which should be roughly like this (function(a,b) return a(b))
insert image description here
what the hell, $ reference #ticket? Fortunately, I know a little bit of jquery. I know that $() can directly refer to dom in jquery, otherwise it will be cool. Then the logic here should be $("#ticket"), and then look at the val method insert image description here
? It is estimated that it should be $("#ticket").val()? I haven't written jquery for a long time. I don't know if it is written like this. It probably means to get the value of the page id as ticket? What? Can you still play like this? Who can know this without debugging, and it has been confused and can't be searched at all. . There is only one word in my heart: awesome. Let's go to the page to search for the ticket:
insert image description here
Good guy, I secretly buried my hand here. Let's continue to look at the logic after the js just now. After the ticket, we can adjust the page once to get:
insert image description here
The if condition is always true and always judges 176 > 4? Isn’t this nonsense, you can debug the logic in the if by yourself, and if you can’t knock it, let’s talk about the logic directly. It adjusts substr and substring, and the core logic is to get it from the ticket. Take 4 strings from 176 and put them in front, and then put the first to 172th ones in the back. ? ? ? At that time, I thought of black question marks, how can such a logic be confused so complicated? Using python to describe it is ticket[:176][-4:] + ticket[:172], brain pain. So the value of the Auth parameter is probably BasicAuth xxxxxxxxxxxx, so I changed it and wrote the following code

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)

Now the call interface can finally get the normal result

{
    
    "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,优惠券:满995\"],[1621440000000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1621526400000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1621612800000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1621699200000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1621785600000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1621872000000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1621958400000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622044800000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622131200000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622217600000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622304000000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622390400000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622476800000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622563200000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1622649600000,138.0,\"\"],[1622736000000,116.33,\"购买3,当前价:138.0,可叠加满减:每满20030,优惠券:满995\"],[1622822400000,116.33,\"购买3,当前价:138.0,可叠加满减:每满20030,优惠券:满995\"],[1622908800000,116.33,\"购买3,当前价:138.0,可叠加满减:每满20030,优惠券:满995\"],[1622995200000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1623081600000,133.0,\"购买1,当前价:138.0,优惠券:满995\"],[1623168000000,133.0,\"购买1,当前价:138.0,优惠券:满995\"]

For convenience, only a part of it is copied, and friends who want to try the effect can try it.
That's all for this article, if you like it, please help me save and pay attention, thank you all.
Finally, let me emphasize again, writing so much is only for js reverse learning and sharing, please do not use it for improper purposes~

Guess you like

Origin blog.csdn.net/qq_33129963/article/details/122291558