【码上爬】第 5 题解题

第五题可以发现请求方式变成了post请求

可以看到请求的信息变成了一串加密的内容

通过搜索得到两个js文件,但只有一个js文件有xl

点击进去查看,发现:

xl ——> encryptedQuery ——> encrypt(jsonString) 然后encrypt(jsonString)就开始各种混淆了

这里个人懒得去理解上面的内容了

直接把整个文件存到本地,编辑loadPage改一下,让他只返回xl信息

通过Python的execjs去调js

js代码:

// 这个需要npm install crypto-js安装
const CryptoJS = require('crypto-js');

// 这下面没有改过,只有末尾函数改过
const _0x38addf = _0x66a7;

function _0x66a7(_0x7461a9, _0x14ffcc) {
    const _0x4f0d09 = _0x4f0d();
    return _0x66a7 = function (_0x66a780, _0x2abc15) {
        _0x66a780 = _0x66a780 - 0xc5;
        let _0x477d8f = _0x4f0d09[_0x66a780];
        return _0x477d8f;
    }, _0x66a7(_0x7461a9, _0x14ffcc);
}

(function (_0x59b24b, _0x16d38a) {
    const _0x3e5f1c = _0x66a7, _0x14ae46 = _0x59b24b();
    while (!![]) {
        try {
            const _0x5e1110 = parseInt(_0x3e5f1c(0xca)) / 0x1 + -parseInt(_0x3e5f1c(0xd4)) / 0x2 * (-parseInt(_0x3e5f1c(0xd5)) / 0x3) + parseInt(_0x3e5f1c(0xc8)) / 0x4 + -parseInt(_0x3e5f1c(0xcc)) / 0x5 * (-parseInt(_0x3e5f1c(0xd0)) / 0x6) + -parseInt(_0x3e5f1c(0xd3)) / 0x7 + -parseInt(_0x3e5f1c(0xcd)) / 0x8 + -parseInt(_0x3e5f1c(0xcf)) / 0x9;
            if (_0x5e1110 === _0x16d38a) break; else _0x14ae46['push'](_0x14ae46['shift']());
        } catch (_0x4fbd75) {
            _0x14ae46['push'](_0x14ae46['shift']());
        }
    }
}(_0x4f0d, 0x897b4), dd = {'a': CryptoJS});
let key = dd['a'][_0x38addf(0xd6)][_0x38addf(0xc7)][_0x38addf(0xc9)](_0x38addf(0xce)),
    iv = dd['a'][_0x38addf(0xd6)]['Utf8'][_0x38addf(0xc9)]('0123456789ABCDEF');

function _0x4f0d() {
    const _0x341c37 = ['2440720SaQcQw', 'jo8j9wGw%6HbxfFn', '9735516pjwmiO', '68862pbatqQ', 'mode', 'AES', '1923264HnviQd', '36906bPsIrd', '12hEJHOd', 'enc', 'pad', 'encrypt', 'Hex', 'Utf8', '689460JbShaf', 'parse', '957060HmuxSn', 'toString', '445UZKyxv'];
    _0x4f0d = function () {
        return _0x341c37;
    };
    return _0x4f0d();
}

function encrypt(jsonString) {
    const _0x4d843e = _0x38addf;
    let _0x2703a2 = dd['a'][_0x4d843e(0xd6)]['Utf8']['parse'](jsonString),
        _0x50fcf0 = dd['a'][_0x4d843e(0xd2)][_0x4d843e(0xc5)](_0x2703a2, key, {
            'mode': dd['a'][_0x4d843e(0xd1)]['CBC'],
            'padding': dd['a'][_0x4d843e(0xd7)]['Pkcs7'],
            'iv': iv
        });
    return _0x50fcf0['ciphertext'][_0x4d843e(0xcb)](CryptoJS[_0x4d843e(0xd6)][_0x4d843e(0xc6)]);
}

// 上面不变,此函数有改动
function loadPage(timestamp, pageNumber) {
    const params = {page: pageNumber, _ts: timestamp};
    const jsonString = JSON.stringify(params);
    let encryptedQuery = encrypt(jsonString);
    return encryptedQuery
}

// 调试代码
const timestamp = new Date().getTime();
console.log(loadPage(timestamp, 1))


python代码:

import json
import time
import execjs
import requests

# 读取本地js文件
with open('xl.js', encoding='utf-8') as f:
    js_code = f.read()


def request_page(sessionid: str, page: int):
    """
    请求对应页码信息
    :param sessionid: 用户session信息
    :param page: 页码
    :return: 结果列表
    """
    timestamp = int(time.time() * 1000)
    page_url = "https://stu.tulingpyton.cn/api/problem-detail/5/data/"
    headers = {
        # 标识登录用户
        "cookie": f"sessionid={sessionid}"
    }
    xl = execjs.compile(js_code).call('loadPage', timestamp, page)
    body = {"xl": xl}
    # 可以不加的,一般执行一次不会报错,除非你连续执行了多次可能出现:访问频率过快,请稍后再试
    while True:
        try:
            return requests.post(page_url, headers=headers, data=json.dumps(body)).json()['current_array']
        except:
            print(requests.post(page_url, headers=headers, data=json.dumps(body)).json()['error'])
            time.sleep(60)


if __name__ == '__main__':
    user_session = 'xxxxxxxxxx'
    number = 0
    for i in range(1, 21):
        number += sum(request_page(user_session, i))
    print(number)

得到结果

注意!!!不要请求太频繁,会被封的,不要问为什么,全是泪

分数阶傅里叶变换(Fractional Fourier Transform, FRFT)是对传统傅里叶变换的拓展,它通过非整数阶的变换方式,能够更有效地处理非线性信号以及涉及时频局部化的问。在信号处理领域,FRFT尤其适用于分析非平稳信号,例如在雷达、声纳和通信系统中,对线性调频(Linear Frequency Modulation, LFM)信号的分析具有显著优势。LFM信号是一种频率随时间线性变化的信号,因其具有宽频带和良好的时频分辨率,被广泛应用于雷达和通信系统。FRFT能够更精准地捕捉LFM信号的时间和频率信息,相比普通傅里叶变换,其性能更为出色。 MATLAB是一种强大的数值计算和科学计算工具,拥有丰富的函数库和用户友好的界面。在MATLAB中实现FRFT,通常需要编写自定义函数或利用信号处理工具箱中的相关函数。例如,一个名为“frft”的文件可能是用于执行分数阶傅里叶变换的MATLAB脚本或函数,并展示其在信号处理中的应用。FRFT的正确性验证通常通过对比变换前后信号的特性来完成,比如评估信号的重构质量、信噪比等。具体而言,可以通过计算原始信号与经过FRFT处理后的信号之间的相似度,或者对比LFM信号的关键参数(如初始频率、扫频率和持续时间)是否在变换后得到准确恢复。 在MATLAB代实现中,通常包含以下步骤:首先,生成LFM信号模型,设定其初始频率、扫频率、持续时间和采样率等参数;其次,利用自定义的frft函数对LFM信号进行分数阶傅里叶变换;接着,使用MATLAB的可视化工具(如plot或imagesc)展示原始信号的时域和频域表示,以及FRFT后的结果,以便直观对比;最后,通过计算均方误差、峰值信噪比等指标来评估FRFT的性能。深入理解FRFT的数学原理并结合MATLAB编程技巧,可以实现对LFM信号的有效分析和处理。这个代示例不仅展示了理论知识在
### 图灵测试与《上爬》第七解析 图灵测试是一种用于判断机器是否具备人类智能的方法。它通过让评估者与未知实体(可能是人类或计算机程序)进行交流,来判断该实体是否表现出与人类无异的行为[^1]。 #### 关于《上爬》第七的内容分析 假设《上爬》是一本涉及编程、人工智能以及数据处理的书籍,则其第七可能围绕以下几个方面展开: 1. **图灵测试的核心概念** 目可能会要求解释什么是图灵测试及其意义。这通常涉及到对艾伦·图灵提出的原始理论的理解,即如何定义一台机器能够思考的标准。 2. **模拟图灵测试的设计** 可能会设计一道目,让学生编写一段简单的对话系统代,尝试模仿真实的人类回应模式。以下是基于 Python 的一个基础示例: ```python import random responses = { "hello": ["Hi there!", "Hello! How can I assist you?"], "how are you": ["I'm just a program, but thanks for asking!", "I don't have feelings, but how about you?"], "default": ["Interesting...", "Tell me more.", "That's fascinating."] } def get_response(user_input): user_input = user_input.lower() if user_input in responses: return random.choice(responses[user_input]) else: return random.choice(responses["default"]) while True: user_input = input("You: ") if user_input.lower() == 'exit': break print(f"Bot: {get_response(user_input)}") ``` 3. **验证算法的有效性** 如果书中提到验证识别等内容[^2],则第七也可能扩展至讨论如何利用图像处理技术和自然语言理解相结合的方式提升系统的智能化水平。 4. **HTML 和语义结构的关系探讨** 结合引用中的说明[^3],目还可能考察学生对于网页内容语义化的认识程度,比如如何构建合理的 HTML 标签体系以便更好地支持 AI 对页面信息的理解。 5. **推荐使用的编程语言和技术栈** 提到的数据抓取部分建议采用更灵活高效的工具链,如 Python 脚本来完成网络请求发送、DOM 解析等功能[^4]。 #### 综合应用实例 下面是一个综合性的练习方向:给定若干条微博评论文本,训练模型自动分类正面情绪还是负面情绪;接着引入噪声干扰项(例如故意加入错别字),观察系统表现变化情况,并进一步优化策略。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值