commit 418a0411d125ddcd6291aa5005db4399ee2f3410 Author: Whale-Fall-Code <1690628247@qq.com> Date: Fri Oct 9 23:25:05 2026 +0800 Initialize encryption and JavaScript reverse-engineering study repository Document the project structure and setup while excluding local dependencies and IDE settings. Co-Authored-By: Claude Sonnet 5 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3bc41d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Python-generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv + +# Node.js dependencies +node_modules/ + +# IDE settings +.idea/ +.vscode/ + +# Local environment files +.env +.env.* +!.env.example diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2c07333 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a207e99 --- /dev/null +++ b/README.md @@ -0,0 +1,96 @@ +# tuling-code + +Python 与 JavaScript 加解密、JS 逆向学习示例,按学习日期和主题整理,包含基础算法演示、Webpack 结构分析以及网站接口参数加密与响应解密案例。 + +## 学习内容 + +- **对称加密**:DES、AES,CBC 模式、填充方式和 Base64 编解码。 +- **非对称加密**:RSA 公私钥生成、加解密,以及 JavaScript 与 Python 实现。 +- **自定义算法分析**:接口请求参数加密与响应数据解密。 +- **JavaScript 执行机制**:自执行函数、Promise 异步任务和 `_invoke` 方法。 +- **Webpack 逆向**:模块加载结构、运行环境与常见问题。 +- **Python 调用 JavaScript**:使用 ExecJS 执行加解密逻辑,并通过 Requests 调用接口。 + +## 目录结构 + +```text +tuling-code/ +├── 对称加密-2026-08-21/ # DES 示例与自然科学案例 +├── 对称加密-AES-2026-08-24/ # AES 示例、商业观察与建筑市场案例 +├── 魔改算法-2026-08-28/ # 吉林长春产权交易中心案例 +├── 非对称加密-2026-08-31/ # RSA 示例、中国移动登录与观鸟记录中心案例 +├── 非对称加密-2026-09-02/ # JS 执行机制与五矿集团案例 +├── webpack-2026-09-04/ # Webpack 结构分析与 36Kr 案例 +├── pyproject.toml # Python 项目与依赖配置 +├── uv.lock # Python 依赖锁定文件 +├── package.json # Node.js 依赖配置 +└── package-lock.json # Node.js 依赖锁定文件 +``` + +## 环境准备 + +需要 Python **3.11 或以上版本**、Node.js **20.19 或以上版本**(包含 npm),以及 Python 包管理工具 uv。ExecJS 调用 JavaScript 时需要可用的 JavaScript 运行时,建议使用 Node.js。 + +在仓库根目录安装依赖: + +```bash +uv sync +npm ci +``` + +主要依赖: + +| 环境 | 依赖 | 用途 | +| --- | --- | --- | +| Python | `pycryptodome` | DES、AES 等加解密 | +| Python | `rsa` | RSA 公私钥生成与加解密 | +| Python | `pyexecjs2` | 调用 JavaScript 代码 | +| Python | `requests` | HTTP 请求 | +| Node.js | `crypto-js` | JavaScript 对称加密与摘要算法 | +| Node.js | `jsencrypt`、`node-rsa` | JavaScript RSA 加解密 | + +## 运行示例 + +以下命令从仓库根目录执行。 + +### Python DES 示例 + +```bash +uv run python "对称加密-2026-08-21/2. python实现des加解密.py" +``` + +### Python AES 示例 + +```bash +uv run python "对称加密-AES-2026-08-24/2. python实现aes加解密.py" +``` + +### Python RSA 示例 + +```bash +uv run python "非对称加密-2026-08-31/python环境实现rsa加解密.py" +``` + +### JavaScript DES 示例 + +```bash +node "对称加密-2026-08-21/1. js环境实现des加解密.js" +``` + +### 网站接口案例 + +部分 Python 案例通过相对路径读取同目录的 JavaScript 文件,需要先进入对应案例目录再运行。例如: + +```bash +cd "对称加密-AES-2026-08-24/实战案例-建筑市场" +uv run python "python调用.py" +``` + +网站接口、请求参数和加密逻辑可能随时间变化;案例记录的是学习时的实现,不保证当前接口仍可直接使用。需要登录或会话信息的案例,应自行在本地配置有效凭证,不要将 Cookie、Token 或密码提交到仓库。 + +## 注意事项 + +- 本仓库用于学习与研究,网站案例仅应在获得授权并遵守相关服务规则的前提下使用。 +- 示例中的固定密钥、固定 IV、DES 和 1024 位 RSA 等写法用于演示,不应直接用于生产环境。 +- `node_modules/`、`.venv/`、Python 缓存、IDE 配置和本地 `.env` 文件不纳入版本控制;通过依赖配置与锁定文件恢复环境。 +- 文件名包含中文和空格,执行命令时请用引号包裹路径。 diff --git a/Snipaste_2026-09-17_21-43-26.png b/Snipaste_2026-09-17_21-43-26.png new file mode 100644 index 0000000..dac9aad Binary files /dev/null and b/Snipaste_2026-09-17_21-43-26.png differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..424f542 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,79 @@ +{ + "name": "tuling-code", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "crypto-js": "^4.2.0", + "jsencrypt": "^3.5.4", + "node-rsa": "^2.0.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^22.20.3" + } + }, + "node_modules/@noble/hashes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.3.tgz", + "integrity": "sha512-DZmzkmwHzXrLPAXPyKNDzlIwMMUZCVacoD25ywdy5YTKGbOx/2ld+Q38Im2zJ0vBuZP5Prd3VZutKZyXwkOS8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "deprecated": "Active development of CryptoJS has been discontinued. This library is no longer maintained.", + "license": "MIT" + }, + "node_modules/jsencrypt": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.5.4.tgz", + "integrity": "sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==", + "license": "MIT" + }, + "node_modules/node-rsa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-2.0.0.tgz", + "integrity": "sha512-7yfzccmBd5rm7pALJf709tPwLL987WvdT7LC/QK5Oxa5S2aabdBPjxRDxhWKkbfCc9/FiC82lwSc+ulGZHH44g==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^2.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e4d8591 --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "dependencies": { + "crypto-js": "^4.2.0", + "jsencrypt": "^3.5.4", + "node-rsa": "^2.0.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/node": "^22.20.3" + } +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..64c4117 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "tuling-code" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "pycryptodome>=3.23.0", + "pyexecjs2>=1.6.1", + "requests>=2.34.2", + "rsa>=4.9.1", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..f5a3687 --- /dev/null +++ b/uv.lock @@ -0,0 +1,283 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz", hash = "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", size = 171764, upload-time = "2026-08-15T08:20:44.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", size = 363585, upload-time = "2026-08-15T08:16:46.646Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", size = 251189, upload-time = "2026-08-15T08:16:48.287Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", size = 239724, upload-time = "2026-08-15T08:16:49.67Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", size = 280078, upload-time = "2026-08-15T08:16:51.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", size = 276650, upload-time = "2026-08-15T08:16:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", size = 262325, upload-time = "2026-08-15T08:16:54.085Z" }, + { url = "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", size = 261140, upload-time = "2026-08-15T08:16:55.604Z" }, + { url = "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", size = 252791, upload-time = "2026-08-15T08:16:57.103Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", size = 240730, upload-time = "2026-08-15T08:16:58.418Z" }, + { url = "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", size = 280791, upload-time = "2026-08-15T08:16:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", size = 259598, upload-time = "2026-08-15T08:17:01.421Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", size = 278217, upload-time = "2026-08-15T08:17:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", size = 263417, upload-time = "2026-08-15T08:17:04.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl", hash = "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", size = 181774, upload-time = "2026-08-15T08:17:05.58Z" }, + { url = "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", size = 206653, upload-time = "2026-08-15T08:17:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", size = 185630, upload-time = "2026-08-15T08:17:08.502Z" }, + { url = "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", size = 344456, upload-time = "2026-08-15T08:17:10.072Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", size = 238530, upload-time = "2026-08-15T08:17:11.563Z" }, + { url = "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", size = 230200, upload-time = "2026-08-15T08:17:12.919Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", size = 262222, upload-time = "2026-08-15T08:17:14.571Z" }, + { url = "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", size = 258951, upload-time = "2026-08-15T08:17:16.158Z" }, + { url = "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", size = 248801, upload-time = "2026-08-15T08:17:17.683Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", size = 244070, upload-time = "2026-08-15T08:17:19.191Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", size = 240110, upload-time = "2026-08-15T08:17:20.547Z" }, + { url = "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", size = 232836, upload-time = "2026-08-15T08:17:21.895Z" }, + { url = "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", size = 262712, upload-time = "2026-08-15T08:17:23.727Z" }, + { url = "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", size = 242977, upload-time = "2026-08-15T08:17:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", size = 260207, upload-time = "2026-08-15T08:17:26.602Z" }, + { url = "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", size = 250562, upload-time = "2026-08-15T08:17:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl", hash = "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", size = 178507, upload-time = "2026-08-15T08:17:29.277Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", size = 200551, upload-time = "2026-08-15T08:17:30.668Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", size = 180700, upload-time = "2026-08-15T08:17:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", size = 211584, upload-time = "2026-08-15T08:17:33.597Z" }, + { url = "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", size = 223359, upload-time = "2026-08-15T08:17:35.022Z" }, + { url = "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", size = 194464, upload-time = "2026-08-15T08:17:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", size = 197676, upload-time = "2026-08-15T08:17:37.819Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", size = 340473, upload-time = "2026-08-15T08:17:39.303Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", size = 240156, upload-time = "2026-08-15T08:17:40.66Z" }, + { url = "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", size = 228246, upload-time = "2026-08-15T08:17:42.003Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", size = 263660, upload-time = "2026-08-15T08:17:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", size = 260354, upload-time = "2026-08-15T08:17:45.094Z" }, + { url = "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", size = 250638, upload-time = "2026-08-15T08:17:46.496Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", size = 244583, upload-time = "2026-08-15T08:17:47.963Z" }, + { url = "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", size = 242038, upload-time = "2026-08-15T08:17:49.481Z" }, + { url = "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", size = 233677, upload-time = "2026-08-15T08:17:50.845Z" }, + { url = "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", size = 264491, upload-time = "2026-08-15T08:17:52.61Z" }, + { url = "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", size = 245196, upload-time = "2026-08-15T08:17:54.023Z" }, + { url = "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", size = 261660, upload-time = "2026-08-15T08:17:55.491Z" }, + { url = "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", size = 252618, upload-time = "2026-08-15T08:17:57.025Z" }, + { url = "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", size = 140362, upload-time = "2026-08-15T08:17:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl", hash = "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", size = 177755, upload-time = "2026-08-15T08:18:00.037Z" }, + { url = "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", size = 199295, upload-time = "2026-08-15T08:18:01.506Z" }, + { url = "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", size = 179856, upload-time = "2026-08-15T08:18:02.929Z" }, + { url = "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", size = 212318, upload-time = "2026-08-15T08:18:04.403Z" }, + { url = "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", size = 224897, upload-time = "2026-08-15T08:18:05.997Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", size = 194848, upload-time = "2026-08-15T08:18:07.397Z" }, + { url = "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", size = 198163, upload-time = "2026-08-15T08:18:08.989Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", size = 341823, upload-time = "2026-08-15T08:18:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", size = 242458, upload-time = "2026-08-15T08:18:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", size = 226717, upload-time = "2026-08-15T08:18:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", size = 266111, upload-time = "2026-08-15T08:18:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", size = 263128, upload-time = "2026-08-15T08:18:16.515Z" }, + { url = "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", size = 251240, upload-time = "2026-08-15T08:18:18.127Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", size = 245282, upload-time = "2026-08-15T08:18:19.625Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", size = 244597, upload-time = "2026-08-15T08:18:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", size = 231376, upload-time = "2026-08-15T08:18:22.57Z" }, + { url = "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", size = 266715, upload-time = "2026-08-15T08:18:24.235Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", size = 245848, upload-time = "2026-08-15T08:18:25.726Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", size = 264521, upload-time = "2026-08-15T08:18:27.193Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", size = 253054, upload-time = "2026-08-15T08:18:28.568Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", size = 140580, upload-time = "2026-08-15T08:18:30.214Z" }, + { url = "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl", hash = "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", size = 180325, upload-time = "2026-08-15T08:18:31.877Z" }, + { url = "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", size = 204175, upload-time = "2026-08-15T08:18:33.466Z" }, + { url = "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", size = 184123, upload-time = "2026-08-15T08:18:34.913Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", size = 381682, upload-time = "2026-08-15T08:18:36.349Z" }, + { url = "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", size = 240826, upload-time = "2026-08-15T08:18:37.887Z" }, + { url = "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", size = 227861, upload-time = "2026-08-15T08:18:39.315Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", size = 260758, upload-time = "2026-08-15T08:18:40.88Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", size = 259950, upload-time = "2026-08-15T08:18:42.351Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", size = 249329, upload-time = "2026-08-15T08:18:43.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", size = 243137, upload-time = "2026-08-15T08:18:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", size = 242820, upload-time = "2026-08-15T08:18:46.842Z" }, + { url = "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", size = 230504, upload-time = "2026-08-15T08:18:48.353Z" }, + { url = "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", size = 263087, upload-time = "2026-08-15T08:18:49.859Z" }, + { url = "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", size = 243269, upload-time = "2026-08-15T08:18:51.601Z" }, + { url = "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", size = 258766, upload-time = "2026-08-15T08:18:53.23Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", size = 250814, upload-time = "2026-08-15T08:18:54.768Z" }, + { url = "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl", hash = "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", size = 191074, upload-time = "2026-08-15T08:18:56.305Z" }, + { url = "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", size = 216476, upload-time = "2026-08-15T08:18:57.889Z" }, + { url = "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl", hash = "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", size = 194115, upload-time = "2026-08-15T08:18:59.418Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", size = 342048, upload-time = "2026-08-15T08:19:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", size = 242997, upload-time = "2026-08-15T08:19:02.492Z" }, + { url = "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", size = 237014, upload-time = "2026-08-15T08:19:03.943Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", size = 266174, upload-time = "2026-08-15T08:19:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", size = 263361, upload-time = "2026-08-15T08:19:07.251Z" }, + { url = "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", size = 252143, upload-time = "2026-08-15T08:19:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", size = 252086, upload-time = "2026-08-15T08:19:10.255Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", size = 245231, upload-time = "2026-08-15T08:19:11.807Z" }, + { url = "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", size = 241546, upload-time = "2026-08-15T08:19:13.416Z" }, + { url = "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", size = 267033, upload-time = "2026-08-15T08:19:14.981Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", size = 252045, upload-time = "2026-08-15T08:19:16.618Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", size = 264866, upload-time = "2026-08-15T08:19:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", size = 253932, upload-time = "2026-08-15T08:19:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl", hash = "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", size = 180320, upload-time = "2026-08-15T08:19:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", size = 204174, upload-time = "2026-08-15T08:19:23.088Z" }, + { url = "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", size = 184126, upload-time = "2026-08-15T08:19:24.471Z" }, + { url = "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", size = 381441, upload-time = "2026-08-15T08:19:26.038Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", size = 241742, upload-time = "2026-08-15T08:19:27.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", size = 235298, upload-time = "2026-08-15T08:19:29.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", size = 262500, upload-time = "2026-08-15T08:19:30.955Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", size = 258888, upload-time = "2026-08-15T08:19:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004", size = 250243, upload-time = "2026-08-15T08:19:33.94Z" }, + { url = "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", size = 249871, upload-time = "2026-08-15T08:19:35.413Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", size = 243580, upload-time = "2026-08-15T08:19:36.886Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", size = 239807, upload-time = "2026-08-15T08:19:38.392Z" }, + { url = "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", size = 264083, upload-time = "2026-08-15T08:19:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", size = 250317, upload-time = "2026-08-15T08:19:41.53Z" }, + { url = "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", size = 258173, upload-time = "2026-08-15T08:19:43.07Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", size = 251960, upload-time = "2026-08-15T08:19:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl", hash = "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", size = 191186, upload-time = "2026-08-15T08:19:46.293Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", size = 215947, upload-time = "2026-08-15T08:19:47.853Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl", hash = "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", size = 193909, upload-time = "2026-08-15T08:19:49.383Z" }, + { url = "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", size = 331467, upload-time = "2026-08-15T08:19:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", size = 253057, upload-time = "2026-08-15T08:19:52.654Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", size = 240930, upload-time = "2026-08-15T08:19:54.163Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", size = 230822, upload-time = "2026-08-15T08:19:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", size = 260037, upload-time = "2026-08-15T08:19:57.312Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", size = 255097, upload-time = "2026-08-15T08:19:59.056Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", size = 250166, upload-time = "2026-08-15T08:20:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", size = 241821, upload-time = "2026-08-15T08:20:02.321Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", size = 232529, upload-time = "2026-08-15T08:20:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", size = 260348, upload-time = "2026-08-15T08:20:05.877Z" }, + { url = "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", size = 247234, upload-time = "2026-08-15T08:20:07.487Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", size = 256917, upload-time = "2026-08-15T08:20:09.142Z" }, + { url = "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", size = 254846, upload-time = "2026-08-15T08:20:10.727Z" }, + { url = "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl", hash = "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", size = 174216, upload-time = "2026-08-15T08:20:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", size = 199764, upload-time = "2026-08-15T08:20:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", size = 287318, upload-time = "2026-08-15T08:20:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl", hash = "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", size = 68658, upload-time = "2026-08-15T08:20:43.306Z" }, +] + +[[package]] +name = "idna" +version = "3.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz", hash = "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15", size = 215237, upload-time = "2026-08-18T05:14:24.27Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl", hash = "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", size = 68550, upload-time = "2026-08-18T05:14:22.343Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/9a/23310166d960def5897e91fe20e5b724601b02a22e84ba1f94232c0b7f67/pyasn1-0.6.4.tar.gz", hash = "sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81", size = 151262, upload-time = "2026-07-09T01:12:33.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3b/6163796d69c3977d1e4287bea4a6979161cbbdd170ebb430511e8e1999ce/pyasn1-0.6.4-py3-none-any.whl", hash = "sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b", size = 84410, upload-time = "2026-07-09T01:12:32.92Z" }, +] + +[[package]] +name = "pycryptodome" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276, upload-time = "2025-05-17T17:21:45.242Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/5d/bdb09489b63cd34a976cc9e2a8d938114f7a53a74d3dd4f125ffa49dce82/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4", size = 2495152, upload-time = "2025-05-17T17:20:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/7840250ed4cc0039c433cd41715536f926d6e86ce84e904068eb3244b6a6/pycryptodome-3.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae", size = 1639348, upload-time = "2025-05-17T17:20:23.171Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/991da24c55c1f688d6a3b5a11940567353f74590734ee4a64294834ae472/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477", size = 2184033, upload-time = "2025-05-17T17:20:25.424Z" }, + { url = "https://files.pythonhosted.org/packages/54/16/0e11882deddf00f68b68dd4e8e442ddc30641f31afeb2bc25588124ac8de/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7", size = 2270142, upload-time = "2025-05-17T17:20:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fc/4347fea23a3f95ffb931f383ff28b3f7b1fe868739182cb76718c0da86a1/pycryptodome-3.23.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446", size = 2309384, upload-time = "2025-05-17T17:20:30.765Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d9/c5261780b69ce66d8cfab25d2797bd6e82ba0241804694cd48be41add5eb/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265", size = 2183237, upload-time = "2025-05-17T17:20:33.736Z" }, + { url = "https://files.pythonhosted.org/packages/5a/6f/3af2ffedd5cfa08c631f89452c6648c4d779e7772dfc388c77c920ca6bbf/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b", size = 2343898, upload-time = "2025-05-17T17:20:36.086Z" }, + { url = "https://files.pythonhosted.org/packages/9a/dc/9060d807039ee5de6e2f260f72f3d70ac213993a804f5e67e0a73a56dd2f/pycryptodome-3.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d", size = 2269197, upload-time = "2025-05-17T17:20:38.414Z" }, + { url = "https://files.pythonhosted.org/packages/f9/34/e6c8ca177cb29dcc4967fef73f5de445912f93bd0343c9c33c8e5bf8cde8/pycryptodome-3.23.0-cp313-cp313t-win32.whl", hash = "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a", size = 1768600, upload-time = "2025-05-17T17:20:40.688Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1d/89756b8d7ff623ad0160f4539da571d1f594d21ee6d68be130a6eccb39a4/pycryptodome-3.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625", size = 1799740, upload-time = "2025-05-17T17:20:42.413Z" }, + { url = "https://files.pythonhosted.org/packages/5d/61/35a64f0feaea9fd07f0d91209e7be91726eb48c0f1bfc6720647194071e4/pycryptodome-3.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39", size = 1703685, upload-time = "2025-05-17T17:20:44.388Z" }, + { url = "https://files.pythonhosted.org/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627, upload-time = "2025-05-17T17:20:47.139Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362, upload-time = "2025-05-17T17:20:50.392Z" }, + { url = "https://files.pythonhosted.org/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625, upload-time = "2025-05-17T17:20:52.866Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954, upload-time = "2025-05-17T17:20:55.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534, upload-time = "2025-05-17T17:20:57.279Z" }, + { url = "https://files.pythonhosted.org/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853, upload-time = "2025-05-17T17:20:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465, upload-time = "2025-05-17T17:21:03.83Z" }, + { url = "https://files.pythonhosted.org/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414, upload-time = "2025-05-17T17:21:06.72Z" }, + { url = "https://files.pythonhosted.org/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484, upload-time = "2025-05-17T17:21:08.535Z" }, + { url = "https://files.pythonhosted.org/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636, upload-time = "2025-05-17T17:21:10.393Z" }, + { url = "https://files.pythonhosted.org/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675, upload-time = "2025-05-17T17:21:13.146Z" }, +] + +[[package]] +name = "pyexecjs2" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/06/afa6c5154d1789f1dd349cdd00299671e6e0050741f6dd605b1fbc76d6b8/PyExecJS2-1.6.1.tar.gz", hash = "sha256:bf8edafa419ff988e61e30ac9946eb3a7c066a1ec07d0c5b0b82b56f16b99050", size = 12771, upload-time = "2022-04-29T07:10:48.62Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/ad/9a94f4a5faf4aa8098ac0efee65dd269a028c894f6e0277a6d81e61c8f74/PyExecJS2-1.6.1-py3-none-any.whl", hash = "sha256:4d46616ca522a228ebc3c5eb3744232abdf78b2abaa0db5ede0d96219a3af778", size = 14753, upload-time = "2022-04-29T07:10:46.998Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rsa" +version = "4.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tuling-code" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "pycryptodome" }, + { name = "pyexecjs2" }, + { name = "requests" }, + { name = "rsa" }, +] + +[package.metadata] +requires-dist = [ + { name = "pycryptodome", specifier = ">=3.23.0" }, + { name = "pyexecjs2", specifier = ">=1.6.1" }, + { name = "requests", specifier = ">=2.34.2" }, + { name = "rsa", specifier = ">=4.9.1" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] diff --git a/webpack-2026-09-04/1.自执行函数.js b/webpack-2026-09-04/1.自执行函数.js new file mode 100644 index 0000000..c040023 --- /dev/null +++ b/webpack-2026-09-04/1.自执行函数.js @@ -0,0 +1,34 @@ +// function run_task(attr) { +// console.log(attr); +// } +// +// run_task(123) + + +// !(function (attr) { +// console.log(attr); +// })(1) +// +// !(function (attr) { +// console.log(attr); +// })(2) + +// !(function (attr) { +// // console.log(attr); +// attr[0]() +// })([ +// function () {console.log("1")}, +// function () {console.log("2")}, +// function () {console.log("3")} +// ]) + + +!(function (attr) { + // attr["2"](); + attr["2"].call(); + attr["1"].apply(); +})({ + "1": function () { console.log("模块1") }, + "2": function () { console.log("模块2") }, + "3": function () { console.log("模块3") }, +}) \ No newline at end of file diff --git a/webpack-2026-09-04/2. webpack的基本结构.js b/webpack-2026-09-04/2. webpack的基本结构.js new file mode 100644 index 0000000..3dde7eb --- /dev/null +++ b/webpack-2026-09-04/2. webpack的基本结构.js @@ -0,0 +1,19 @@ +/* +* webpack 的基本结构有两种(数组结构 / 对象结构) +* +* !(function ( 形参) { 加载器 }) ([模块1, 模块2, ...]) +* !(function ( 形参) { 加载器 }) ({"1": 模块1, "2": 模块2, ...}) +* */ + + +!(function (function_location) { + function inner_run_func(key) { + return function_location[key].call() + } + + inner_run_func("1") +})({ + "1": function () { console.log("模块1"); }, + "2": function () { console.log("模块2"); }, + "3": function () { console.log("模块3"); }, +}) diff --git a/webpack-2026-09-04/3. webpack逆向时会遇到的问题.js b/webpack-2026-09-04/3. webpack逆向时会遇到的问题.js new file mode 100644 index 0000000..212fe44 --- /dev/null +++ b/webpack-2026-09-04/3. webpack逆向时会遇到的问题.js @@ -0,0 +1,55 @@ +/* +* 模块有上千个 +* 模块分布在不同的文件 +* */ + + +// 1. 如何在自执行webpack函数外部调用模块 +// 2. 加载器初始化问题(浏览器环境检测问题) +// 3. 模块丢失问题 + +window = global + +!(function (func_object) { + function inner_func(key) { + // 打印模块调用日志 + console.log("被调用的模块是:", key); + func_object[key].call(); + } + + + // 调用模块加载器 + // inner_func("encrypt") + + //将内部加载器挂在到全局 + window.loader = inner_func; + + // inner_func("web_env"); 如果在内部加载器中调用了环境检测直接注释 + +})({ + "encrypt": function () { + console.log("加密..."); + }, + "decrypt": function () { + console.log("解密..."); + }, + "web_env": function () { + console.log("浏览器环境检测..."); + }, +}) + + +// 问题1:将内部加载器挂载到顶级对象上 +/* +window.loader("encrypt") +window.loader("decrypt") + */ + + +// 问题2:对于加载器初始化出现环境问题,直接注释 +// inner_func("web_env") + + +// 问题3:模块丢失(在真实的网站模块调用当中可能存在模块是动态加载过来的) +// 解决方式就是模块定位(在内部加载器中打执行日志) +window.loader("339b") \ No newline at end of file diff --git a/webpack-2026-09-04/实战案例-36Kr/加密位置 b/webpack-2026-09-04/实战案例-36Kr/加密位置 new file mode 100644 index 0000000..705b1d5 --- /dev/null +++ b/webpack-2026-09-04/实战案例-36Kr/加密位置 @@ -0,0 +1,5 @@ +接口: + https://gateway.36kr.com/api/mus/login/byMobilePassword +加密参数: + 查询字符串,sign加密 + 请求负载,nonce,mobileNo,password \ No newline at end of file diff --git a/对称加密-2026-08-21/1. js环境实现des加解密.js b/对称加密-2026-08-21/1. js环境实现des加解密.js new file mode 100644 index 0000000..3db5392 --- /dev/null +++ b/对称加密-2026-08-21/1. js环境实现des加解密.js @@ -0,0 +1,70 @@ +var crypro_js = require("crypto-js"); + + +var source_data = "你好,世界!" +var des_key = "12345678" +var iv = "12345678"; + + +var byte_iv = crypro_js.enc.Utf8.parse(iv); +var key = crypro_js.enc.Utf8.parse(des_key); +var data = crypro_js.enc.Utf8.parse(source_data); + +function des_ecb_encrypt() { + // 进行加密 + /* + * 加密操作 + * des对称加密,需要三个形参 + * 1. 明文字节 + * 2. 密钥字节 + * 3. 配置对象 + * (1) mode 工作模式 ECB, CBC, CFB, OFB, CTR + * (2) padding 填充模式, Pkcs7, + * + **/ + var encrypted = crypro_js.DES.encrypt(data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return encrypted.toString(); + +} + +function des_ecb_decrypt() { + var encrypt_data = des_ecb_encrypt(); + + var decrypted = crypro_js.DES.decrypt(encrypt_data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +// console.log(des_ecb_encrypt()) +// console.log(des_ecb_decrypt()) + +function des_cbc_encrypt() { + + var encrypted = crypro_js.DES.encrypt(data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return encrypted.toString(); + +} + +function des_cbc_decrypt() { + var encrypt_data = des_cbc_encrypt(); + + var decrypted = crypro_js.DES.decrypt(encrypt_data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +console.log(des_cbc_decrypt()); \ No newline at end of file diff --git a/对称加密-2026-08-21/2. python实现des加解密.py b/对称加密-2026-08-21/2. python实现des加解密.py new file mode 100644 index 0000000..65aadc6 --- /dev/null +++ b/对称加密-2026-08-21/2. python实现des加解密.py @@ -0,0 +1,25 @@ +import base64 +from Crypto.Cipher import DES +from Crypto.Util.Padding import pad, unpad + + +def des_encrypt(plain_text): + cipher = DES.new(des_key, DES.MODE_CBC, iv) + encrypted = cipher.encrypt(pad(plain_text.encode("utf-8"), DES.block_size)) + return base64.b64encode(encrypted) + + +def des_decrypt(cipher_text): + cipher = DES.new(des_key, DES.MODE_CBC, iv) + decrypt_byte_data = base64.b64decode(cipher_text) + decrypted = unpad(cipher.decrypt(decrypt_byte_data), DES.block_size) + return decrypted.decode("utf-8") + + +source_data = "你好,世界!" +des_key = "12345678".encode("utf-8") +iv = "12345678".encode("utf-8") +if __name__ == "__main__": + enc_data = des_encrypt(source_data) + print(enc_data) + print(des_decrypt(des_encrypt(source_data))) diff --git a/对称加密-2026-08-21/实战案例-自然科学/js解密.js b/对称加密-2026-08-21/实战案例-自然科学/js解密.js new file mode 100644 index 0000000..3576d2a --- /dev/null +++ b/对称加密-2026-08-21/实战案例-自然科学/js解密.js @@ -0,0 +1,20 @@ +var crypro_js = require("crypto-js"); +var p = { + a: crypro_js +} + + +function g(e) { + var t = p.a.enc.Utf8.parse("IFROMC86") + , n = p.a.DES.decrypt({ + ciphertext: p.a.enc.Base64.parse(e) + }, t, { + mode: p.a.mode.ECB, + padding: p.a.pad.Pkcs7 + }); + return n.toString(p.a.enc.Utf8) +} + +// var ee = "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"; +// +// console.log(JSON.stringify(g(ee))) \ No newline at end of file diff --git a/对称加密-2026-08-21/实战案例-自然科学/调用解密.py b/对称加密-2026-08-21/实战案例-自然科学/调用解密.py new file mode 100644 index 0000000..54318ae --- /dev/null +++ b/对称加密-2026-08-21/实战案例-自然科学/调用解密.py @@ -0,0 +1,55 @@ +import json +import time + +import requests +import execjs + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Authorization": "Bearer false", + "Connection": "keep-alive", + "Content-Type": "application/json;charset=UTF-8", + "Origin": "https://kd.nsfc.cn", + "Referer": "https://kd.nsfc.cn/finalSearchList?s=%E7%AC%AC%E4%B8%80%E6%80%A7%E5%8E%9F%E7%90%86%E8%AE%A1%E7%AE%97", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"" +} +with open("js解密.js", "r", encoding="utf-8") as f: + js_code = f.read() + + +ctx = execjs.compile(js_code) + +url = 'https://kd.nsfc.cn/api/baseQuery/completionQueryResultsData' +for page in range(1, 11): + data = { + "complete": True, + "fuzzyKeyword": "第一性原理计算", + "isFuzzySearch": True, + "conclusionYear": "近五年", + "dependUnit": "", + "keywords": "", + "pageNum": page, + "pageSize": 10, + "projectType": "", + "projectTypeName": "", + "code": "", + "ratifyYear": "", + "order": "enddate", + "ordering": "desc", + "codeScreening": "", + "dependUnitScreening": "", + "keywordsScreening": "", + "projectTypeNameScreening": "" + } + response = requests.post(url, headers=headers, json=data) + result = ctx.call("g", response.text) + print(json.loads(result)) + time.sleep(1) + diff --git a/对称加密-AES-2026-08-24/1. js环境实现aes加解密.js b/对称加密-AES-2026-08-24/1. js环境实现aes加解密.js new file mode 100644 index 0000000..289a71f --- /dev/null +++ b/对称加密-AES-2026-08-24/1. js环境实现aes加解密.js @@ -0,0 +1,60 @@ +var crypro_js = require("crypto-js"); + + +var source_data = "你好,世界!" +var aes_key = "1234567890abcdef" +var iv = "abcdef1234567890"; + + +var byte_iv = crypro_js.enc.Utf8.parse(iv); +var key = crypro_js.enc.Utf8.parse(aes_key); +var data = crypro_js.enc.Utf8.parse(source_data); + +function aes_ecb_encrypt() { + var encrypted = crypro_js.AES.encrypt(data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return btoa(encrypted.toString()); // base64 返回 + +} + +function aes_ecb_decrypt() { + var encrypt_data = atob(aes_ecb_encrypt()); + + var decrypted = crypro_js.AES.decrypt(encrypt_data, key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +console.log("密文结果: ", aes_ecb_encrypt()) +console.log("明文结果: ", aes_ecb_decrypt()) + +function aes_cbc_encrypt() { + + var encrypted = crypro_js.AES.encrypt(data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return btoa(encrypted.toString()); + +} + +function aes_cbc_decrypt() { + var encrypt_data = atob(aes_cbc_encrypt()); + + var decrypted = crypro_js.AES.decrypt(encrypt_data, key, { + iv: byte_iv, + mode: crypro_js.mode.CBC, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} + + +console.log("CBC 密文结果: ", aes_cbc_encrypt()); +console.log("CBC 明文结果: ", aes_cbc_decrypt()); \ No newline at end of file diff --git a/对称加密-AES-2026-08-24/2. python实现aes加解密.py b/对称加密-AES-2026-08-24/2. python实现aes加解密.py new file mode 100644 index 0000000..634f506 --- /dev/null +++ b/对称加密-AES-2026-08-24/2. python实现aes加解密.py @@ -0,0 +1,31 @@ +import base64 +from Crypto.Cipher import AES +from Crypto.Util.Padding import pad, unpad +""" +des加解密,key长度有要求 + key长度必须8字节(64bit) + +aes加解密,key长度有要求 + key长度必须16字节(128bit), 24字节(192bit), 32字节(256bit) +""" + +def aes_encrypt(plain_text): + cipher = AES.new(des_key, AES.MODE_CBC, iv) + encrypted = cipher.encrypt(pad(plain_text.encode("utf-8"), AES.block_size)) + return base64.b64encode(encrypted) + + +def aes_decrypt(cipher_text): + cipher = AES.new(des_key, AES.MODE_CBC, iv) + decrypt_byte_data = base64.b64decode(cipher_text) + decrypted = unpad(cipher.decrypt(decrypt_byte_data), AES.block_size) + return decrypted.decode("utf-8") + + +source_data = "你好,世界!" +des_key = "1234567890abcdef".encode("utf-8") +iv = "abcdef1234567890".encode("utf-8") +if __name__ == "__main__": + enc_data = aes_encrypt(source_data) + print(enc_data) + print(aes_decrypt(aes_encrypt(source_data))) diff --git a/对称加密-AES-2026-08-24/实战案例-商业观察/js解密.js b/对称加密-AES-2026-08-24/实战案例-商业观察/js解密.js new file mode 100644 index 0000000..382cb7c --- /dev/null +++ b/对称加密-AES-2026-08-24/实战案例-商业观察/js解密.js @@ -0,0 +1,34 @@ +var crypro_js = require("crypto-js"); +var key = "QV1f3nHn2qm7i3xrj3Y9K9imDdGTjTu9"; +// var o = "IiEcCVEdLRxEFEBUG0oIBgUeLwg4TkQCJhciJhwxWFo="; +// +// var a = null; +// +// function s() { +// return "sw-observe-crypto-v1".trim() +// } +// +// function u(t, e) { +// for (var n = atob(t), r = "", i = 0; i < n.length; i++) +// r += String.fromCharCode(n.charCodeAt(i) ^ e.charCodeAt(i % e.length)); +// return r +// } +// +// function c() { +// if (a) +// return a; +// var t = u(o, s()); +// console.log(t) +// return a = crypro_js.enc.Utf8.parse(t), a +// } + +function ars_decrypt_data(encrypt_data) { + const encode_key = crypro_js.enc.Utf8.parse(key) + const decrypted = crypro_js.AES.decrypt(encrypt_data, encode_key, { + mode: crypro_js.mode.ECB, // 工作模式 + padding: crypro_js.pad.Pkcs7 // 填充模式 + }) + return decrypted.toString(crypro_js.enc.Utf8); +} +var data = "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" +console.log(ars_decrypt_data(data)) \ No newline at end of file diff --git a/对称加密-AES-2026-08-24/实战案例-建筑市场/js解密.js b/对称加密-AES-2026-08-24/实战案例-建筑市场/js解密.js new file mode 100644 index 0000000..74228ba --- /dev/null +++ b/对称加密-AES-2026-08-24/实战案例-建筑市场/js解密.js @@ -0,0 +1,24 @@ +var crypro_js = require("crypto-js"); + +var d = { + a: crypro_js +} +// var f = d.a.enc.Utf8.parse("jo8j9wGw%6HbxfFn"); +var f = d.a.enc.Utf8.parse("Dt8j9wGw%6HbxfFn"); +var m = d.a.enc.Utf8.parse("0123456789ABCDEF"); + +function g(t) { + var e = d.a.enc.Hex.parse(t) + , n = d.a.enc.Base64.stringify(e) + , a = d.a.AES.decrypt(n, f, { + iv: m, + mode: d.a.mode.CBC, + padding: d.a.pad.Pkcs7 + }) + , r = a.toString(d.a.enc.Utf8); + return r.toString() +} + +// var data = "5588a9e126c91a28cc2f6813e379336923bf42c9814280cca7955d2725a88b28a430c6a4a13cfcd227010b6cddc9aa6d678e97dc96a1ad7090f8ebebc67eeddfb66537a330e1205d1c659d97171c97a2e36e25f5af7a86d80a66daafd539c810a6712825cd15a92948872ba0b6203c6d63ca6a3f3efab6f8f696fac042f165cb31e46edf70a7755792e7f719eb460b9ea71a28e75647e84cfb584edc7466a740d0588595a1fe5331fda0101c56a9ccbe9eb7ad800517ec987d583f87c65c2e2cd209209af42453d7a6d1d73e2b5d1a5414cea523ad5bd6d4100532538f210b2ecfd4230a3342c921cb0df9ee77b605a85d33bd44f241b44873885fd42ab0f38f734242ad73e786694cae37bf54d171e65cf419523517727feff4997bcfebd036015b4bea6386bf219e4d48f75205ed9bf0f243b90ec44a35ff42b2158355929efdca94d9b650f842e2057146d6b698abcf6a80752c8dc9367d2382d181588d4ea7df9afb6567b86f6dd53e9496914bdd24f7eb1947232abbaef35a9f7adfedc677e14ceae7537c2ca9d07f5ddd55c6affb6082396ac0ae92a33bcb36e45c21c8d78661bbe32f2798a68ec7fce17f3c69a132579cfec95455aa7b42680e38e542f77f89aa8b01622f7e9fb3be5f0ab207d998aaa3ee1e31db1a66648a37b0677c6b8cf520d7a3f6143d7fbca1fadf954ce9e1f3f8e87925d4f4963ce51644ef12141d9947dfc53ea8c179fc00d4848068caf28ec652435e7473dbb0b6e02fc3d624476c9e1efc501b61c8fdc1741b13c32256553f9f36054213cf0ea0601765b42f2fe4ed48eb60c5eb5bb4aef8dc8eca161b98e627260468bbfc91f963866474d6507c5b067e1dc54a4232b6ee82f50ed39de9b3d9f2937cfcca36b11127bab3b5ed835b4ed190210c9c90390dde68ac0cd5575cb401545eed4f68fcdf472464c734b45acbc771a199acd70be5bf18093079c1c802a186a41adccd563352a94857afc3015cd3184584cdeb3483560750fce6d6ccc6dbc2e5328b7bf5cf342e0d842a105b032d29dcf8186932c792479569f44c545e8171f0549c2740ae15140c4284634d5bbba47264d92e7e50744200259f33ab29cd9a9cd5d2d1b4267ad2624f9fd8e2360918963e819bb955a1e6e645c8c352917d02b893acac32d178c3272e59f657671c2273228717bab1d214b2d57c8c62e4185e86f2e4b623c07514eff9779e36d10802490768a86b3d47914d73207007aaaeb3ad559da6102ba6c4d68e7df73c6b472cc2d8b9ac474e1b0adbd935253cf17871975288b28af933f7bb325462a554e5c65dcc5283e22689eff8840e09f9b3e3b6a65586ae40e97ebc382ea9b98b21bc7b9c9628a6bf694b85147cc974781d7961c06361ad65e9d2fcbe56ad3a2ab7c3bba87ab8bc324de6ac13b56516aaac4ae68c9158eda2fa0f798c0d7c463338e855f36cb300e47c8a08e399ad56ec1f76b955df2aba2ad8fb3ff271728fd8bbb36a6fbcdee3c5e9605cba7e207e2ee71b47422e706652e007bb888a6168ad55ca6cf2c3b10a97879320fb632910348ddef93444e0f714638ac36178b1c2c5c2be5763ff9220cadbf312bf4885fda352b96d359d5d6bb5749e7bcca5578846e283a55d2c94b41bcd80e8179042e3dcd0cf2f7b9464769f7e51941b246164e86365a6b8722faf4dbda85b304d4693571573e3ea42ea77b2f06a6198b7a922d684e74743e97adc4164ef9773c3fc28d8c5bc528c595df3c459e9747ddf527e2c5ec6b5c3d321527fe43d9849b12be593c0592a9e3c0e2fdb8e0c26f22874519a3ce98b883cada5d131b6e0eadb1f2e82459bdd0709b111e8112ee04b066b07c0d221409bef31d114e17ae226a3347ef68bfd4ed1b668df07045e4414b42d50e74ce63ea42d421f497aa3b3109b4bb3250fd2aeb497f3b015ce8a4a72b77b915a6fbc50d35f41abc404dd4dc9e33c53adacf59daf22c47ca23e1a5eb22ddf54238c22fb98ce5b50894cc43d2a7a7676ce757073fc5bba41774b267ef534605d3b8489dc3098bffd9899b9fa86e51e80ee76e037e16edd821b06fd981b4f6e77b32c16e51f2285bb41cb15ef099a428ee7ab3dc287a97ce4e88bb44198ea76c54895a4978f50df09fa2a0d0afc3bdc22d3f03953ba7f049c0b9fad3115c92baf1d1ce6aec6b16903e5727314b7f8fb6ae202026cd1933a0f9a3ed7881b7ac16fe623c82d903dc166a820952c757e65a4562f4568fdf5cb06b79630220866e5ffeaf08c4da30025b531dc5915a1b002fa735ffa6d68b25aabe300cfc459a70896e4d6f40c56503451f142d73b83787024736a1841d5956e82473133cea0211c6222ab3469a1a25d90100295f8ef7d09ea6840bb1a4c688de8d508b55e6b27e70d1017e29448a8321f92f924110a8085f6c3cb25d43ae8d8f3a9642640a8907673c297c56b3953c40f76228a5a6eb8612c2e1d5fcca122751813f4a371cda28bd6c29b5a7b272438faa636f21da41c2fc0365ac4b87453f62cde7f6a709445c0612e2f57caa9bd0f3761cc85186c99a070ca7db303d027abef7d2fbe2a2ea5f1934e9361bf2a3bac8d808f16d901d0ba43642a2135a25c64eea15747dc621a5a0ede232e11314d6b8ce248d1c932484d7641ec29c30bd50af411867f95106f4464ead118f4b225b8fb5a9aeb737806fc8e8085840cfd14885ad4acabf0af424a8a13029e1ee2f981627b70f61df9e2ce258ec47c0d7584db684c27e2f26da939ce0e49a93ab8f9d3db0fc3721590a46fb95f54275b6f7a1f09ab55bb58cefafc95804f2ed85a59df5f0c32c84cd35c6cc05ef2f4e08b759baf36732f632d4e026d415bef3f6ad9b30b1ef1d3cb27aa6a6e3a74c0a92f4313e8b945eedc942b4a23f9fc7ba1897a8bb0c164ec25aed7fce9aff8a2b18b29eaf970d3b568ba22d43d3fdb552fa3e84d757b6f5a2d35276ad8ffb827831a3bfa03a1eeedd964c72071bb60e3c152854d485d6e33483c54630ed97e9f8413a7266715bfbb7e90078b25602a01ff5696e809280765754987846ac329af92e984e816aa14ed28fefe0958068ea036aba0b16c9f53dc1db06ad94b8b96d2eba04461cff4d6a91be444101fff897e597b05e5f221acfb04dcc0f28b9e176338f650dd475c7f0380834bc753be8c828a452430309a0173e94c03a328d0b092d75e6059f6119409ab72d98445144ddc726e4d1d12f0d0c0f88b0c0994ea00fd67442bf904e1c436d0b1f61b4fde70802fcd13c3d4266c83ab3f913bb723e2ad5a6c8271d8f709fd75aff72bcbd2d5ece32c88d89120d5254e2036667d742e118661b09b433908e89758d3f95e9366b91ddd4ecb1cc6d4bc5ab69a528625211de08f8dd7d63ab184170ffaf6132bde3a7e8b763cff071059c6a5d517293a778ac87656d019547ee9185d9a2c748522369a64a5bde812351e8a3572da3cb4e14a785b4e27b9ac7302601661d9c4fc7de894f882d92a6cfe79c77118188b59a54092003cd64ec11b481a91f2fc055fb24a8a35dfaedbad401ef3c07f0266e34bb5a5cbfde85a77820576cab37ee0868b75036807b6d333dd44514c3038ebef1ea9e3ab7626a7c5e051106a1dd2a4fa94f065d55ea0a24ada10b7b4e9bd87e2f35e34670d417a62ae08a42698e876392f0f4439fded822fbc05b37be973dd1b00dd1ca4e29915c2c40a97ea0710191a5c041cd775d32ac538bbd4a88e8ff9ce09669fdeea0d269e46444842cda48f83b57aaded975d2b5b4f9567240691627c610c6b1b720666e1011f19adff884a2293edf014730f88ef5097fa337fd9afa6e9ecf4ef0ba4ebb48911a8655091c9b9e518059172a6600d953374626bf90485a7c071e6158575b31fdc65856afabe1931450a740354f97192724192b741398e0de4432ed912fa454bdc8f74b811f3b6aa0fe8aeb5939432dcf39a3c3ed906a082970bbf6db3759b1f42a1935be7981c7361ce02a3c4bfe7f8589664a3f52241322d33d92e2b6e0213b16a0766687b375d473c7e48694f8c073ccc84a9fd1c50eec2cdf1c7bf7caf26e86864be797418860792070cc93e97ce10b807fb4189a8f234bdad57be782bb9d20eeca1b4f2f6328acb75edeaf4b320e91a8d0256012a745f11655ef544000edc06c994f7c6fdce368575b857aa58b456cbefa026abb3ae088e874c7d64aa45898d928b245cde2a2c51994f7b5ca00c4f23ed7db6351e0ff93a5fc96dd6d27baa7da6e0acf245ec57ec733a7823d78e1888cb02280fcd886b460d6854856659f3269dd2f57d55cc01c824e8d25082c4260efab9395f8768c2e2794731fc8e101ef73b996a42df30615cf113a4937d9f33a06f73c38617cdd7e4800d584da194ade03e3a052c22ecaace2d43b689ec21ac947b4f00432425a9b3394294ce7f79e22e5c755800ff4d88ceabf7a88456b06ea7462fa88fb8d52d541cf59bb798f9c893e13b93845d72a52af5ec3d85aaf209f76167f06a6a6cf8252d19250964e5897c5bbb501114e8b0d4beed12600651428b3b230aaa6d3c9f88da49734f17d147bff8df3805caf6e48191c3b7db8a58616836f5cc8346e4fc36dd0b345088b271b33e192dc872afe1109d7458930a6887f6b73c15203b03a1e9bfe3880be945caba6b10b9d9efc958e77aa4f2eefd99fbd7d0cc5d68bb2103001b92141f978a3e8e06875d8fa923d724b20170f73171a72c7c21bc4ea03a037e34c7b1fb1120a8a64e7839324001525c7f2ea95a6116d27845418af476b2040d23c633d4e7e0982c7ddd4f608c77f8e2f1a5e37454fefa79ea2f5aebd5bae32c447122c1473c5ab61edcb97e1d186c5fa3d1d2060308d782e2a2ef46ed9d249e43f3e33f7ed2fe0c31527cad10f651843ec6f5c4d26f100164af8b77bc694d89dfd99756f78261c344daf154ea2ceb3586cccaa8a1f5d5f495494f4643e0995a2964c8608c6eba1f271edbdee7d29bbba5b08f8a572abc6ef32b5bad5292eb40758034d46cd0ddcf82b80601ff25cac0019a59442fd56957b527317aa0a25e87873f54b53dec15fa462c7c23051c54891830fde77e4b09eef3f3cea2115da97baf6834b394b54c9c1266ec36f5ba45e23aa5357a99ed97496c293ef0397886c1497675f79c10c7337b231784c073811bccb404026743855e4ba843605474f4f3bce8dd7930ed5517c42527c0c4dabaeca19800e4d063db79da1f9e7092d40e0d8932bcf01aeda700e923d66ad172152c1f4c59d9548b94a365361f3720f5e4b8db2fe945cf664dd11387a8d4c5b9f76126735a80ff17035ce25c03f12d4e34dbd51605a0751f724b7503dfe183138152451112960d34a03dc6bef2a235b6183f17e4e072333175a870f6cd998a426a44b24a8d004c910b357df51224ed87b6dbed710c99ae1a73d64b68aa38d3653256dc9c246be4bfed6521bd0c6a2ad005bc6a0dd568abc256af7f9eacc906c6195a877580301d6bed06e165dd54105c11e58e25ef629fa57d49d8a2ef75bdcca061f9a9465c76eb9a1b580c7a388e95fcd2bbaf4e1ec8c2201d91f75933737ec27a3e0fa7731133ac05eceaaabfe6ec03f488a7e93b65cd2ceaac440f4de0183ee5202e2e7ac3b9ca95653cac936f2f59d08d7b385dbc06e09689edfc88507bbea3d0c89c2520430eec65e3e317f66b74c846ce63657635b1a53622d740408d385a809641d6f26f89d12f0904269eb26e536e941dab128e7f9dadf2474a57c61da524ce5ba1f42d076ef094ccc9bf35e6373cccddc03b187d2b6e8a4fef1da7ab1ae135d5c9e460b3d658aa976fe5d2c256b69e9e84b383790d96f2174113f889539a52bd608f68094aff5032375008e863226be5380a8db892166e63aa71f1816f12d2af07f1a34e11f9a8f5220633b059b6854ae9930dcab637f946ff6831c8bfe9244d30462f03b879af7fd1cc8b1797300b88a713a0a2d8354ea2b6265c067fcf83d199c68c277d97914010207a79f4cb975ef333e10602d3893e7d42e87330ad5e57dfefc00c259bb74ac0b5f555bef4649e6696474573683e4232d581554925888772e023e6b67836811e2e84792aeb352cfafbde4b37b880d1196e5f11e467d5325abe307a456c46aa2d67b38c88ce0b1c20bb6c24f5908eacc48f6bcdd91bfb2abf487e5175eb3c4c003c32cc9b8e94a802649c4b8bf98e5556361d49178d8ba75f51ae1f83ed5e22501d485e948eb5d43cc5e4767c303dc1c142ab7ca01e33d5cbe5fa8628734e0647c6aef75969a84c526d2c7689a3c802ade58e095b5f9d0f82ab5becdeddc4c015b13e706be86a0556f1b1e02ce83f6c8ebabeed51a31a0d3415e8af49ec"; +// +// console.log(g(da)) \ No newline at end of file diff --git a/对称加密-AES-2026-08-24/实战案例-建筑市场/python调用.py b/对称加密-AES-2026-08-24/实战案例-建筑市场/python调用.py new file mode 100644 index 0000000..42d39e8 --- /dev/null +++ b/对称加密-AES-2026-08-24/实战案例-建筑市场/python调用.py @@ -0,0 +1,37 @@ +import requests +import execjs +import time + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Referer": "https://jzsc.mohurd.gov.cn/data/company", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "accessToken;": "", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "timeout": "30000", + "v": "231012" +} + +with open("js解密.js", "r", encoding="utf-8") as f: + js_code = f.read() + +code = execjs.compile(js_code) +url = 'https://jzsc.mohurd.gov.cn/APi/webApi/dataservice/query/comp/list' +for page in range(1, 11): + params = { + "pg": str(page), + "pgsz": "15", + "total": "450" + } + response = requests.get(url, headers=headers, params=params) + # print(response.text) + result = code.call("g", response.text) + print(result) + time.sleep(1) \ No newline at end of file diff --git a/非对称加密-2026-08-31/node环境实现rsa加解密.js b/非对称加密-2026-08-31/node环境实现rsa加解密.js new file mode 100644 index 0000000..07e56ab --- /dev/null +++ b/非对称加密-2026-08-31/node环境实现rsa加解密.js @@ -0,0 +1,37 @@ +// JSEncrypt() node-rsa 两个包 +// npm install node-rsa + +var node_rsa = require("node-rsa").NodeRSA; // node-rsa 2.x 导出的是 { NodeRSA, default } + + +class RsaEncryptDecrypt { + constructor(key_size = 1024) { + this.node_rsa = new node_rsa({b: key_size}); + this.public_key = this.node_rsa.exportKey("pkcs8-public"); + this.private_key = this.node_rsa.exportKey("pkcs8-private"); + + console.log("公钥:", this.public_key); + console.log("私钥", this.private_key); + } + + encrypt(data) { + const public_instance = new node_rsa(this.public_key, "pkcs8-public"); + return public_instance.encrypt(data, "base64"); + } + + decrypt(data) { + const private_instance = new node_rsa(this.private_key, "pkcs8-private"); + return private_instance.decrypt(data, "utf8"); + } + + +} + +const rsa = new RsaEncryptDecrypt(); +const source_data = "你好,世界"; + +const enc_data = rsa.encrypt(source_data); +console.log("base", enc_data); + +const dec_data = rsa.decrypt(enc_data); +console.log("解密结果", dec_data); diff --git a/非对称加密-2026-08-31/python环境实现rsa加解密.py b/非对称加密-2026-08-31/python环境实现rsa加解密.py new file mode 100644 index 0000000..8db6bb2 --- /dev/null +++ b/非对称加密-2026-08-31/python环境实现rsa加解密.py @@ -0,0 +1,42 @@ +# pip install rsa +import rsa +import base64 + +""" +非对称加解密需要一对密钥(公钥,私钥) + +加密过程中,一般情况使用公钥加密,私钥解密 +也能用私钥加密,公钥解密 +""" + +def create_key(): + public_key, private_key = rsa.newkeys(1024) # 字节长度 + # print("公钥", public_key) + # print("私钥", private_key) + return public_key, private_key + +# 使用公钥加密,私钥解密 +def encrypt_data(text, public_key): + bytes_text = text.encode("utf-8") + encrypted_text = rsa.encrypt(bytes_text, public_key) + return base64.b64encode(encrypted_text) + +def decrypt_data(encrypted_text, private_key): + bytes_text = base64.b64decode(encrypted_text) + bytes_decrypted_text = rsa.decrypt(bytes_text, private_key) + return bytes_decrypted_text.decode("utf-8") + + + +def main(): + public_key, private_key = create_key() + + source_data = "你好,世界!" + encrypted_text = encrypt_data(source_data, public_key) + print("base64的密文结果", encrypted_text) + decrypted_text = decrypt_data(encrypted_text, private_key) + print("解密结果", decrypted_text) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-10086中国移动登录/模拟登陆.js b/非对称加密-2026-08-31/实战案例-10086中国移动登录/模拟登陆.js new file mode 100644 index 0000000..ca75c46 --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-10086中国移动登录/模拟登陆.js @@ -0,0 +1,38 @@ +const JSEncrypt = require("jsencrypt") + +// function et(_0x32033c) { +// var _0x283d00 = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgDq4OqxuEisnk2F0EJFmw4xKa5IrcqEYHvqxPs2CHEg2kolhfWA2SjNuGAHxyDDE5MLtOvzuXjBx/5YJtc9zj2xR/0moesS+Vi/xtG1tkVaTCba+TV+Y5C61iyr3FGqr+KOD4/XECu0Xky1W9ZmmaFADmZi7+6gO9wjgVpU9aLcBcw/loHOeJrCqjp7pA98hRJRY+MML8MK15mnC4ebooOva+mJlstW6t/1lghR8WNV8cocxgcHHuXBxgns2MlACQbSdJ8c6Z3RQeRZBzyjfey6JCCfbEKouVrWIUuPphBL3OANfgp0B+QG31bapvePTfXU48TYK0M5kE+8LgbbWQIDAQAB'; +// var _0x1defd6 = new JSEncrypt(); +// _0x1defd6['setPublicKey'](_0x283d00); +// var _0x4bd6d3 = _0x1defd6['encrypt'](_0x32033c); +// return _0x4bd6d3; +// } + +function et(data) { + const key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsgDq4OqxuEisnk2F0EJFmw4xKa5IrcqEYHvqxPs2CHEg2kolhfWA2SjNuGAHxyDDE5MLtOvzuXjBx/5YJtc9zj2xR/0moesS+Vi/xtG1tkVaTCba+TV+Y5C61iyr3FGqr+KOD4/XECu0Xky1W9ZmmaFADmZi7+6gO9wjgVpU9aLcBcw/loHOeJrCqjp7pA98hRJRY+MML8MK15mnC4ebooOva+mJlstW6t/1lghR8WNV8cocxgcHHuXBxgns2MlACQbSdJ8c6Z3RQeRZBzyjfey6JCCfbEKouVrWIUuPphBL3OANfgp0B+QG31bapvePTfXU48TYK0M5kE+8LgbbWQIDAQAB'; + const encrypt_instance = new JSEncrypt(); + encrypt_instance.setPublicKey(key); + return encrypt_instance.encrypt(data); + +} + + +/* +* 非堆成加密:在加密过程中key固定,密文不固定 +* +* */ + +const password = "admin"; +console.log(et(password)); + + +/* +* 在js环境中和实现rsa 有两种方式 +* 1. rsa-node +* 2. jsencrypt +* 区别 +* rsa-node: 可以自己生成密钥对,并且完成加解密 +* jsencrypt: 不能自己生成密钥对,不能完成解密,只能加密(js逆向的中重点使用) +* +* + */ \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/python调用.py b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/python调用.py new file mode 100644 index 0000000..ac123ee --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/python调用.py @@ -0,0 +1,41 @@ +import time + +import requests +import execjs + + +with open("参数加密.js", "r", encoding="utf-8") as f: + code_js = f.read() + +code = execjs.compile(code_js) +for page in range(1, 2): + temp_params = code.call("beforeSend", page) + + headers = { + "Accept": "application/json, text/javascript, */*; q=0.01", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Origin": "https://www.birdreport.cn", + "Referer": "https://www.birdreport.cn/", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-site", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "requestId": str(temp_params["requestId"]), + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "sign": str(temp_params["sign"]), + "timestamp": str(temp_params["timestamp"]) + } + + enc_data = temp_params["data"] + url = 'https://api.birdreport.cn/front/activity/search' + response = requests.post(url, headers=headers, data=enc_data) + response_json = response.json() + result = code.call("aes_decrypt", response_json["data"]) + + print(result) + print(response) + time.sleep(1) \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/参数加密.js b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/参数加密.js new file mode 100644 index 0000000..1703169 --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/参数加密.js @@ -0,0 +1,51 @@ +const JSEncrypt = require("jsencrypt"); +var crypto_js = require("crypto-js"); + +const encrypt = new JSEncrypt(); +var paramPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvxXa98E1uWXnBzXkS2yHUfnBM6n3PCwLdfIox03T91joBvjtoDqiQ5x3tTOfpHs3LtiqMMEafls6b0YWtgB1dse1W5m+FpeusVkCOkQxB4SZDH6tuerIknnmB/Hsq5wgEkIvO5Pff9biig6AyoAkdWpSek/1/B7zYIepYY0lxKQIDAQAB"; +encrypt.setPublicKey(paramPublicKey); + +function MD5(text) { + return crypto_js.MD5(text).toString(); +} + +function getUuid() { + var s = []; + var hexDigits = "0123456789abcdef"; + for (var i = 0; i < 32; i++) { + s[i] = hexDigits.substr(Math.floor(Math.random() * 16), 1) + } + s[14] = "4"; + s[19] = hexDigits.substr(s[19] & 3 | 8, 1); + s[8] = s[13] = s[18] = s[23]; + var uuid = s.join(""); + return uuid +} + +function beforeSend(page) { + var timestamp = Date.parse(new Date); + var requestId = getUuid(); + + var data = `{"limit":"20","page":"${page}"}` + const sign = MD5(data + requestId + timestamp) + return { + timestamp: timestamp, + requestId: requestId, + sign: sign, + data: encrypt.encrypt(data) + }; +} + + +function aes_decrypt(encrypt_data) { + var key = crypto_js.enc.Utf8.parse("C8EB5514AF5ADDB94B2207B08C66601C"); + var iv = crypto_js.enc.Utf8.parse("55DD79C6F04E1A67"); + var decrypted = crypto_js.AES.decrypt(encrypt_data, key, { + iv: iv, + mode: crypto_js.mode.CBC, + padding: crypto_js.pad.Pkcs7, + }) + return decrypted.toString(crypto_js.enc.Utf8); +} + +// console.log(beforeSend(1)); \ No newline at end of file diff --git a/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/混淆代码.js b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/混淆代码.js new file mode 100644 index 0000000..97fc449 --- /dev/null +++ b/非对称加密-2026-08-31/实战案例-中国观鸟记录中心/混淆代码.js @@ -0,0 +1,9 @@ +_0x48989b["prototype"]['decode'] = function (_0x291626) { + var _0x3c6fa1 = CryptoJS['enc']["Utf8"]["parse"]("C8EB5514AF5ADDB94B2207B08C66601C") + , _0x3ec027 = CryptoJS["enc"]["Utf8"]["parse"]("55DD79C6F04E1A67"); + return CryptoJS["AES"]["decrypt"](_0x291626, _0x3c6fa1, { + 'iv': _0x3ec027, + 'mode': CryptoJS["mode"]['CBC'], + 'padding': CryptoJS['pad']["Pkcs7"] + })['toString'](CryptoJS['enc']['Utf8']); +} \ No newline at end of file diff --git a/非对称加密-2026-09-02/_invoke方法执行过程.js b/非对称加密-2026-09-02/_invoke方法执行过程.js new file mode 100644 index 0000000..a1da1e3 --- /dev/null +++ b/非对称加密-2026-09-02/_invoke方法执行过程.js @@ -0,0 +1,24 @@ +class MyFunc { + _invoke(func_name, a, b) { + switch (func_name) { + case 'add': + return this._add(a, b); + case 'subtract': + return this._subtract(a, b); + default: + throw new Error(`Invalid func name, ${operation}`); + } + + } + + _add(a, b) { + return a + b; + } + + _subtract(a, b) { + return a - b; + } +} + +const myFunc = new MyFunc(); +console.log(myFunc._invoke("add", 10, 5)) \ No newline at end of file diff --git a/非对称加密-2026-09-02/promise异步任务的执行过程.js b/非对称加密-2026-09-02/promise异步任务的执行过程.js new file mode 100644 index 0000000..ddefd6c --- /dev/null +++ b/非对称加密-2026-09-02/promise异步任务的执行过程.js @@ -0,0 +1,9 @@ +function run_async_task() { + return new Promise(function (resolve, reject) { + resolve("这是异步任务执行之后得到的结果"); + }); +} + +run_async_task().then(function (result) { + console.log(result); +}); \ No newline at end of file diff --git a/非对称加密-2026-09-02/实战案例-五矿集团/python调用.py b/非对称加密-2026-09-02/实战案例-五矿集团/python调用.py new file mode 100644 index 0000000..efababe --- /dev/null +++ b/非对称加密-2026-09-02/实战案例-五矿集团/python调用.py @@ -0,0 +1,47 @@ +import time + +import requests +import execjs + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Content-Length": "0", + "Origin": "https://ec.minmetals.com.cn", + "Referer": "https://ec.minmetals.com.cn/open/home/purchase-info", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"" +} +with open("五矿集团.js", "r", encoding="utf-8") as f: + code_js = f.read() +cookies = { + # "__jsluid_s": "e761c17024077e17ad5b78ccdd2b3df3", + "SUNWAY-ESCM-COOKIE": "a9a9e461-c1c4-4348-b1f3-60ace80a499e", + "JSESSIONID": "C1F0A4A6E17FA8D3F9674563DF3F20C9" +} +ctx = execjs.compile(code_js) + +for page in range(1, 6): + public_key = requests.post("https://ec.minmetals.com.cn/open/homepage/public", headers=headers).text + + encrypt_params = ctx.call("encrypt_param", public_key, page) + + json_data = { + "param": encrypt_params, + } + + response = requests.post( + "https://ec.minmetals.com.cn/open/homepage/zbs/by-lx-page", + cookies=cookies, + headers=headers, + json=json_data + ) + print(response.json()) + # print(response.text) + time.sleep(1) diff --git a/非对称加密-2026-09-02/实战案例-五矿集团/五矿集团.js b/非对称加密-2026-09-02/实战案例-五矿集团/五矿集团.js new file mode 100644 index 0000000..ce17f7c --- /dev/null +++ b/非对称加密-2026-09-02/实战案例-五矿集团/五矿集团.js @@ -0,0 +1,103 @@ +var JSEncrypt = require("jsencrypt"); +var crypto_js = require("crypto-js"); + +function w(A) { + var e, t, n = "", r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", a = "="; + for (e = 0; e + 3 <= A.length; e += 3) + t = parseInt(A.substring(e, e + 3), 16), + n += r.charAt(t >> 6) + r.charAt(63 & t); + e + 1 == A.length ? (t = parseInt(A.substring(e, e + 1), 16), + n += r.charAt(t << 2)) : e + 2 == A.length && (t = parseInt(A.substring(e, e + 2), 16), + n += r.charAt(t >> 2) + r.charAt((3 & t) << 4)); + while ((3 & n.length) > 0) + n += a; + return n +} + +function encryptLong(jsencrypt_object, A) { + var e = jsencrypt_object.getKey() + , t = (e.n.bitLength() + 7 >> 3) - 11; + try { + var n = "" + , r = ""; + if (A.length > t) + return n = A.match(/.{1,50}/g), + n.forEach((function (A) { + var t = e.encrypt(A); + r += t + } + )), + w(r); + var a = e.encrypt(A) + , s = w(a); + return s + } catch (i) { + return i + } +} + +function v(A, e) { + var t = Object.keys(A); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(A); + e && (n = n.filter((function (e) { + return Object.getOwnPropertyDescriptor(A, e).enumerable + } + ))), + t.push.apply(t, n) + } + return t +} + +function encode_MD5(data) { + return crypto_js.MD5(data).toString() +} + +function m(A) { + for (var e = 1; e < arguments.length; e++) { + var t = null != arguments[e] ? arguments[e] : {}; + e % 2 ? v(Object(t), !0).forEach((function (e) { + b(A, e, t[e]) + } + )) : Object.getOwnPropertyDescriptors ? Object.defineProperties(A, Object.getOwnPropertyDescriptors(t)) : v(Object(t)).forEach((function (e) { + Object.defineProperty(A, e, Object.getOwnPropertyDescriptor(t, e)) + } + )) + } + return A +} + +function b(A, e, t) { + return e in A ? Object.defineProperty(A, e, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0 + }) : A[e] = t, + A +} + +function encrypt_param(public_key, page) { + var r = public_key; + var t = new JSEncrypt(); + t.setPublicKey(r); + var e = { + "inviteMethod": "", + "businessClassfication": "", + "mc": "", + "lx": "ZBGG", + "dwmc": "", + "pageIndex": page + }; + a = m(m({}, e), {}, { + sign: encode_MD5(JSON.stringify(e)), + timeStamp: +new Date + }); + return encryptLong(t, JSON.stringify(a)) +} + +// var key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrD7FHuUUHUCWeInEnnRraglf7ytCal3jB4bP66T7vkUQZRepM1uNr1LWucdPMYvDsaN8LSsu8HHwoqqRoQx33T5pNrFWe4/daccjbM7m7h8VWRQ2Ny3rgRNuSIIg012o25ORgpAHjGBXQ+mMzFYvCFYzY6sKMmqS3k0xYpy6KwwIDAQAB"; + + +// console.log(new JSEncrypt().__proto__) +// console.log(encrypt_param(key, 0)) \ No newline at end of file diff --git a/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/js解密.js b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/js解密.js new file mode 100644 index 0000000..d77bb60 --- /dev/null +++ b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/js解密.js @@ -0,0 +1,130 @@ +var b = function () { + function t() { + this.codeStr = "", + this.pubPass = "BX1o65CoobwcDP33iQW6ld1OyIPsNzF1", + this.pubPassNum = [], + this.publicKey = "", + this.setPass(this.pubPass) + } + + return t.prototype.encode = function (t) { + var e = ""; + try { + e = JSON.stringify(t) + } catch (n) { + return console.error(n + "这不是一个正确的json对象"), + "" + } + return this.encryptCode(e) + } + , + t.prototype.decode = function (t) { + var e; + try { + e = JSON.parse(this.decryptCode(t)) + } catch (n) { + return void console.error(n + "json对象转出失败") + } + return e + } + , + t.prototype.encryptCode = function (t) { + for (var e = encodeURI(t), n = [], i = 0, r = "", o = this.random(16, 32), a = this.randomStr(o), c = this.stringChangeASCIINumberArrs(a), s = 0, u = 0, l = 0, h = 0; h < e.length; h++) + i = e.charCodeAt(h), + s == this.pubPassNum.length && (s = 0), + i += this.pubPassNum[s], + s++, + u == c.length && (u = 0), + i += c[u], + u++, + l += i, + l > 65535 && (l -= 65535), + r = i.toString(36), + r = ("00" + r).substr(-2, 2), + 1 == r.length && (r = "0" + r), + n.push(r); + var f = ""; + return f = l.toString(36), + f = ("0000" + r).substr(-4, 4), + n.unshift(a), + n.unshift(o.toString(36)), + n.unshift(f), + n.join("") + } + , + t.prototype.decryptCode = function (t) { + var e = "" + , n = 0 + , i = "" + , r = [] + , o = [] + , a = 0 + , c = 0; + e = t.substr(4, 1), + n = parseInt(e, 36), + i = t.substr(5, n), + r = this.stringChangeASCIINumberArrs(i), + e = t.substr(5 + n, t.length - 5 - n); + for (var s = "", u = 0, l = 0, h = 0; h < e.length / 2; h++) + s = e.substr(l, 2), + l += 2, + u = parseInt(s, 36), + c == r.length && (c = 0), + u -= r[c], + c++, + a == this.pubPass.length && (a = 0), + u -= this.pubPassNum[a], + a++, + s = String.fromCharCode(u), + o.push(s); + return e = o.join(""), + e = decodeURI(e), + e + } + , + t.prototype.setPass = function (t) { + this.pubPassNum = this.stringChangeASCIINumberArrs(t) + } + , + t.prototype.stringChangeASCIINumberArrs = function (t) { + for (var e = [], n = 0; n < t.length; n++) + e.push(t.charCodeAt(n)); + return e + } + , + t.prototype.random = function (t, e) { + return void 0 === t && (t = 0), + void 0 === e && (e = 1e4), + Math.floor(Math.random() * (e - t) + t) + } + , + t.prototype.randomStr = function (t) { + for (var e = [], n = 0; n < t; n++) + e.push(this.random(0, 35).toString(36)); + return e.join("") + } + , + t +}() + +function encrypt_payload(page) { + const aes = new b; + const data = { + "id": "ru9dz050bkg8oy3j", + "projectKey": "honsan_cloud_ccprec", + "clientKey": "ru9dyul1ixcuvpdn", + "token": null, + "clientDailyData": {}, + "acts": [{ + "id": "ru9dz04zw4wp164f", + "fullPath": "/ccprec.com.cn.web/client/info/cqweb_nonphy_cqzr", + "args": [page, 20, null] + }] + }; + return aes.encode(JSON.stringify(data)); +} + +function decrypt_data(enc_data) { + const aes = new b; + return aes.decode(enc_data) +} \ No newline at end of file diff --git a/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/python调用.py b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/python调用.py new file mode 100644 index 0000000..0469147 --- /dev/null +++ b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/python调用.py @@ -0,0 +1,37 @@ +import execjs +import requests +import time + + +with open("js解密.js", "r", encoding="utf-8") as f: + js_code = f.read() + +code = execjs.compile(js_code) + +headers = { + "Accept": "application/json, text/plain, */*", + "Accept-Language": "zh-CN,zh;q=0.9", + "Connection": "keep-alive", + "Content-Type": "text/xml;charset=UTF-8", + "Origin": "https://www.ccprec.com", + "Referer": "https://www.ccprec.com/projectSecPage/", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "same-origin", + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36", + "sec-ch-ua": "\"Chromium\";v=\"152\", \"Not?A_Brand\";v=\"24\", \"Google Chrome\";v=\"152\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"" +} +url = 'https://www.ccprec.com/honsanCloudAct' +for page in range(1, 11): + data = code.call("encrypt_payload", page) + print(data) + response = requests.post(url, headers=headers, data=data) + + response_data = code.call("decrypt_data", response.text) + print(response_data) + + # print(response.text) + # print(response) + time.sleep(1) diff --git a/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/思路.txt b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/思路.txt new file mode 100644 index 0000000..b03e9bb --- /dev/null +++ b/魔改算法-2026-08-28/实战案例-吉林长春产权交易中心/思路.txt @@ -0,0 +1,3 @@ +先找请求负载的加密位置 + 魔改的函数,进行扣代码 +然后找结果解密的位置 \ No newline at end of file