某产权交易

说明

# URL
https://www.ccprec.com/projectSecPage/#/cqzr

# 接口
https://www.ccprec.com/honsanCloudAct

代码实现

enc_dec.js

codeStr = ""
pubPass = "BX1o65CoobwcDP33iQW6ld1OyIPsNzF1"
pubPassNum = []
publicKey = ""
var uuidCount = 29
uuid = function (t, n) {
    void 0 === t && (t = 16),
    void 0 === n && (n = !1),
    !n && t < 16 && (console.error("uuid useCase=false 时 len 不能小于 16"),
        t = 16),
    n && t < 12 && (console.error("uuid useCase=true 时 len 不能小于 12"),
        t = 12);
    var i = ((new Date).getTime() + 1e14).toString();
    return i += ("000" + uuidCount.toString()).substr(-3, 3),
        i = n ? parseInt(i).to62() : parseInt(i).toString(36),
        i += randomStr(t),
        i = i.substr(0, t),
        i
}

setPass = function (e) {
    pubPassNum = stringChangeASCIINumberArrs(e)
}
stringChangeASCIINumberArrs = function (e) {
    for (var t = [], n = 0; n < e.length; n++)
        t.push(e.charCodeAt(n));
    return t
}
random = function (e, t) {
    return void 0 === e && (e = 0),
    void 0 === t && (t = 1e4),
        Math.floor(Math.random() * (t - e) + e)
}
randomStr = function (e) {
    for (var t = [], n = 0; n < e; n++)
        t.push(random(0, 35).toString(36));
    return t.join("")
}

encryptCode = function (e) {
    for (var t = encodeURI(e), n = [], i = 0, r = "", o = random(16, 32), a = randomStr(o), s = stringChangeASCIINumberArrs(a), l = 0, c = 0, u = 0, h = 0; h < t.length; h++)
        i = t.charCodeAt(h),
        l == pubPassNum.length && (l = 0),
            i += pubPassNum[l],
            l++,
        c == s.length && (c = 0),
            i += s[c],
            c++,
            u += i,
        u > 65535 && (u -= 65535),
            r = i.toString(36),
            r = ("00" + r).substr(-2, 2),
        1 == r.length && (r = "0" + r),
            n.push(r);
    var d = "";
    return d = u.toString(36),
        d = ("0000" + r).substr(-4, 4),
        n.unshift(a),
        n.unshift(o.toString(36)),
        n.unshift(d),
        n.join("")
}

encode = function (e) {
    var t = "";
    try {
        t = JSON.stringify(e)
    } catch (n) {
        return console.error(n + "这不是一个正确的json对象"),
            ""
    }
    console.log('final json:')
    console.log(t)
    return encryptCode(t)
}
setPass(pubPass)


decryptCode = function (e) {
    var t = ""
        , n = 0
        , i = ""
        , r = []
        , o = []
        , a = 0
        , s = 0;
    t = e.substr(4, 1),
        n = parseInt(t, 36),
        i = e.substr(5, n),
        r = stringChangeASCIINumberArrs(i),
        t = e.substr(5 + n, e.length - 5 - n);

    for (var l = "", c = 0, u = 0, h = 0; h < t.length / 2; h++)
        l = t.substr(u, 2),
            u += 2,
            c = parseInt(l, 36),
        s == r.length && (s = 0),
            c -= r[s],
            s++,
        a == pubPass.length && (a = 0),
            c -= pubPassNum[a],
            a++,
            l = String.fromCharCode(c),
            o.push(l);
    return t = o.join(""),
        t = decodeURI(t),
        t
}

decode = function (e) {
    var t;
    try {
        t = JSON.parse(decryptCode(e))
    } catch (n) {
        return void console.error(n + "json对象转出失败")
    }
    console.log(t)
    return t
}

decryptCode = function (e) {
    var t = ""
        , n = 0
        , i = ""
        , r = []
        , o = []
        , a = 0
        , s = 0;
    t = e.substr(4, 1),
        n = parseInt(t, 36),
        i = e.substr(5, n),
        r = stringChangeASCIINumberArrs(i),
        t = e.substr(5 + n, e.length - 5 - n);
    for (var l = "", c = 0, u = 0, h = 0; h < t.length / 2; h++)
        l = t.substr(u, 2),
            u += 2,
            c = parseInt(l, 36),
        s == r.length && (s = 0),
            c -= r[s],
            s++,
        a == pubPass.length && (a = 0),
            c -= pubPassNum[a],
            a++,
            l = String.fromCharCode(c),
            o.push(l);
    return t = o.join(""),
        t = decodeURI(t),
        t
}

function get_param(page) {
    let e = {
        "id": uuid(),
        "projectKey": "honsan_cloud_ccprec",
        "clientKey": "rtrsuj1nz2o4h1ka",
        "token": null,
        "clientDailyData": {},
        "acts": [{
            "id": uuid(),
            "fullPath": "/ccprec.com.cn.web/client/info/cqweb_nonphy_cqzr",
            "args": [page, 20, null]
        }]
    };
    let e_param = JSON.stringify(e);
    console.log('first json:')
    console.log(e_param)
    return encode(e_param)
}

spider.py

import requests, execjs, json

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'text/xml;charset=UTF-8',
    'Origin': 'https://www.ccprec.com',
    'Pragma': 'no-cache',
    'Referer': 'https://www.ccprec.com/projectSecPage/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
}

js_compile = execjs.compile(open('day16-01.js', 'r', encoding='utf-8').read())
# 需要获取的数据页码
cipher_data = js_compile.call("get_param", 1)
print('request data: ')
print(cipher_data)

response = requests.post('https://www.ccprec.com/honsanCloudAct', headers=headers, data=cipher_data)
print('response data:')
print(response.text)

plain_data = js_compile.call("decode", response.text)
print('response plain data: ')
print(plain_data)
print(type(plain_data))

# 信息提取
print('信息提取:')
for item in plain_data['results'][0]['args'][0]['list']:
    print(item)

易混淆问题

解密的时候如果直接在js中调用decode返回结果如下

{
  results: [ { err: null, args: [Array], id: 'rtrsz67y380bbd8g' } ],
  token: null,
  reqDate: 1739957350477,
  id: 'rtrsz67y380wn3vm',
  resDate: 1739957350500
}

注意⚠️ 上方返回结果不是报错,而是数据存在于返回结果中的 args: [Array] 中

# 可用下方代码进行打印
console.log(data.results[0]['args'][0]['list'])

Last updated