逆向20-优志愿

网址

1 分析页面

根据分析-得知sign 加密

image

copy出curl

import requests
headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json',
    'Origin': 'https://pv4y-pc.youzy.cn',
    'Pragma': 'no-cache',
    'Referer': 'https://pv4y-pc.youzy.cn/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'u-sign': 'f6a8052b16fbe01064e4c4e86441a642',
    'u-token': '',
}

json_data = {
    'keyword': '',
    'provinceNames': [],
    'natureTypes': [],
    'eduLevel': '',
    'categories': [],
    'features': [],
    'pageIndex': 2,
    'pageSize': 20,
    'sort': 11,
}

response = requests.post(
    'https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.api.college.query',
    headers=headers,
    json=json_data,
)

print(response.text)

会报错,有两种解决方法,都试试

image

法一:解决办法

# 将 import requests 换成下面
from curl_cffi import requests

......

response = requests.post(
    'https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.api.college.query',
    headers=headers,
    json=json_data,
    impersonate="chrome119", # 添加一句
)

法二:

request 发送的时候是json=
python中会对json=后的数据进行json序列化,防止他json序列化我们进行下面的操作

    xxx = json.dumps(json_data, separators=(',', ':')) # separators去掉json中的空格
  
    response = requests.post(
        ......
        data=xxx,
    )

2 加密流程分析

搜索关键字

image

刷新-定住

image

分析这个o函数

image

看看n的返回值

image

n(o) 是一个md5的值,我们利用 123456 来判断是一个标准的md5值

扣js

// 自己导入
const CryptoJS = require("crypto-js")
// 修改函数名
function get_sign(e, t) {
    var r, i = "9SASji5OWnG41iRKiSvTJHlXHmRySRp1", o = "", a = t || {}, s = (e = e || "").split("?");
    if (s.length > 0 && (r = s[1]),
    r) {
        var u = r.split("&")
          , c = "";
        u.forEach((function(e) {
            var t = e.split("=");
            c += "".concat(t[0], "=").concat(encodeURI(t[1]), "&")
        }
        )),
        o = "".concat(_.trimEnd(c, "&"), "&").concat(i)
    } else
        o = Object.keys(a).length > 0 ? "".concat(JSON.stringify(a), "&").concat(i) : "&".concat(i);
        console.log(o)
    return o = o.toLowerCase(),
      // 引用CryptoJS下面的MD5
    CryptoJS.MD5(o).toString()
}

python

import requests
import execjs
import json
headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json',
    'Origin': 'https://pv4y-pc.youzy.cn',
    'Pragma': 'no-cache',
    'Referer': 'https://pv4y-pc.youzy.cn/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    # 'u-sign': 'f6a8052b16fbe01064e4c4e86441a642',
    'u-token': '',
}
# 只取第一页数据
json_data = {
    'keyword': '',
    'provinceNames': [],
    'natureTypes': [],
    'eduLevel': '',
    'categories': [],
    'features': [],
    'pageIndex': 1,
    'pageSize': 20,
    'sort': 11,
}
js_code = open("20.js").read()
js_compile = execjs.compile(js_code)
sign = js_compile.call("get_sign", "/youzy.dms.basiclib.api.college.query", json_data)


xxx = json.dumps(json_data, separators=(',', ':'))
headers['u-sign'] = sign

response = requests.post(
    'https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.api.college.query',
    headers=headers,
    data=xxx,
)
print(response.text)

python取前10页

import requests
import execjs
import json
headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json',
    'Origin': 'https://pv4y-pc.youzy.cn',
    'Pragma': 'no-cache',
    'Referer': 'https://pv4y-pc.youzy.cn/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    # 'u-sign': 'f6a8052b16fbe01064e4c4e86441a642',
    'u-token': '',
}

def get_pages(page):
    json_data = {
    'keyword': '',
    'provinceNames': [],
    'natureTypes': [],
    'eduLevel': '',
    'categories': [],
    'features': [],
    'pageIndex': page,
    'pageSize': 20,
    'sort': 11,
}   
    js_code = open("20.js").read()
    js_compile = execjs.compile(js_code)
    sign = js_compile.call("get_sign", "/youzy.dms.basiclib.api.college.query", json_data)


    xxx = json.dumps(json_data, separators=(',', ':'))
    headers['u-sign'] = sign

    response = requests.post(
        'https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.api.college.query',
        headers=headers,
        data=xxx,
    )
    print(response.text)


if __name__ == '__main__':
    import time
    for i in range(1, 10):
        get_pages(i)
        time.sleep(1)

使用python实现md5

import requests
import execjs
import json
headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json',
    'Origin': 'https://pv4y-pc.youzy.cn',
    'Pragma': 'no-cache',
    'Referer': 'https://pv4y-pc.youzy.cn/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    # 'u-sign': 'f6a8052b16fbe01064e4c4e86441a642',
    'u-token': '',
}

def get_pages(page):
    json_data = {
    'keyword': '',
    'provinceNames': [],
    'natureTypes': [],
    'eduLevel': '',
    'categories': [],
    'features': [],
    'pageIndex': page,
    'pageSize': 20,
    'sort': 11,
}   
    import hashlib

    json_str = json.dumps(json_data, separators=(',', ':'))
    sign_str = json_str + "&" + "9SASji5OWnG41iRKiSvTJHlXHmRySRp1"   
    sign_str = sign_str.lower()  
		# 使用md5
    md5_hash = hashlib.md5(sign_str.encode('utf-8')).hexdigest()  
    headers['u-sign'] = md5_hash

    response = requests.post(
        'https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.api.college.query',
        headers=headers,
        data=json_str,
    )

    print(response.text)

get_pages(1)
posted @ 2024-10-16 14:17  流年中渲染了微笑  阅读(0)  评论(0)    收藏  举报