├── .flake8 ├── Meituan ├── src │ ├── .gitignore │ ├── document.json.template │ └── main.js ├── assets │ ├── image-20230418122319127.png │ ├── image-20230418125929592.png │ ├── image-20230418130259497.png │ ├── image-20230418143722340.png │ ├── image-20230418145332640.png │ └── image-20230418145408736.png └── README.md ├── README.md ├── .gitattributes ├── .yarnrc.yml ├── Day1 ├── assets │ ├── 第1天.mp4 │ └── Web逆向实战-第1天.pdf └── src │ ├── README.md │ ├── Homework_02 │ └── main.js │ ├── Homework_01 │ ├── main.js │ └── main.py │ └── Demo_01 │ ├── demo1.py │ └── demo1.js ├── Day2 ├── assets │ ├── 第2天.mp4 │ ├── Web逆向实战-第2天.pdf │ ├── Snipaste_2023-03-23_21-48-20.png │ ├── Snipaste_2023-03-23_21-49-51.png │ ├── Snipaste_2023-03-23_22-03-44.png │ ├── Snipaste_2023-03-23_22-21-25.png │ ├── Snipaste_2023-03-23_22-35-02.png │ ├── Snipaste_2023-03-23_22-49-08.png │ ├── Snipaste_2023-03-23_22-51-58.png │ ├── Snipaste_2023-03-23_23-53-46.png │ ├── Snipaste_2023-03-23_23-57-13.png │ ├── Snipaste_2023-03-24_00-14-59.png │ ├── Snipaste_2023-03-24_01-21-42.png │ └── Snipaste_2023-03-24_01-23-29.png └── src │ ├── Demo_01 │ └── demo1.js │ └── Demo_02 │ └── main.py ├── .yarn └── cache │ ├── ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip │ ├── ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip │ ├── ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip │ ├── psl-npm-1.9.0-a546edad1a-20c4277f64.zip │ ├── ws-npm-8.13.0-26ffa3016a-53e991bbf9.zip │ ├── abab-npm-2.0.6-2662fba7f0-6ffc1af4ff.zip │ ├── abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip │ ├── acorn-npm-8.8.2-9d518fd7d3-f790b99a1b.zip │ ├── ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip │ ├── aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip │ ├── chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip │ ├── chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip │ ├── debug-npm-4.3.4-4513954577-3dbad3f94e.zip │ ├── depd-npm-2.0.0-b6c51a4b43-abbe19c768.zip │ ├── events-npm-3.3.0-c280bc7e48-f6f487ad21.zip │ ├── gauge-npm-3.0.2-9e22f7af9e-81296c00c7.zip │ ├── gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip │ ├── glob-npm-7.2.3-2d866d17a5-29452e97b3.zip │ ├── glob-npm-8.1.0-65f64af8b1-92fbea3221.zip │ ├── isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip │ ├── jsdom-npm-21.1.1-cb6155f6f0-ea33c3f3f0.zip │ ├── jsesc-npm-2.5.2-c5acb78804-4dc1907711.zip │ ├── levn-npm-0.3.0-48d774b1c2-0d084a5242.zip │ ├── mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip │ ├── nan-npm-2.17.0-bf36a21d6f-ec609aeaf7.zip │ ├── nopt-npm-5.0.0-304b40fbfe-d35fdec187.zip │ ├── nopt-npm-6.0.0-5ea8050815-82149371f8.zip │ ├── npmlog-npm-5.0.1-366cab64a2-516b266302.zip │ ├── npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip │ ├── nwsapi-npm-2.2.2-b77040326c-4376910629.zip │ ├── once-npm-1.4.0-ccf03ef07a-cd0a885013.zip │ ├── p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip │ ├── parse5-npm-7.1.2-aa9a92c270-59465dd05e.zip │ ├── retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip │ ├── rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip │ ├── saxes-npm-6.0.0-31558949f5-d3fa3e2aaf.zip │ ├── semver-npm-6.3.0-b3eace8bfd-1b26ecf6db.zip │ ├── semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip │ ├── socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip │ ├── ssri-npm-9.0.1-33ce27f4f8-fb58f5e46b.zip │ ├── tar-npm-6.1.13-3234e72781-8a278bed12.zip │ ├── tr46-npm-0.0.3-de53018915-726321c5ea.zip │ ├── tr46-npm-4.1.1-3f695e44e5-aeeb821ac2.zip │ ├── uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip │ ├── which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip │ ├── wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip │ ├── asynckit-npm-0.4.0-c718858525-7b78c451df.zip │ ├── cacache-npm-16.1.3-4e2088ed0d-d91409e6e5.zip │ ├── canvas-npm-2.11.0-1643476467-a69a6e0c90.zip │ ├── cssstyle-npm-3.0.0-3947bec0b5-31f694dfed.zip │ ├── deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip │ ├── entities-npm-4.4.0-97635dc5cc-84d250329f.zip │ ├── err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip │ ├── escalade-npm-3.1.1-e02da076aa-a3e2a99f07.zip │ ├── esprima-npm-4.0.1-1084e98778-b45bc805a6.zip │ ├── esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip │ ├── has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip │ ├── has-flag-npm-4.0.0-32af9f0536-261a135703.zip │ ├── inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip │ ├── inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip │ ├── make-dir-npm-3.1.0-d1d7505142-484200020a.zip │ ├── mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip │ ├── minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip │ ├── minipass-npm-4.2.5-25860eb433-4f9c19af23.zip │ ├── minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip │ ├── node-gyp-npm-9.3.1-43540bab9c-b860e9976f.zip │ ├── punycode-npm-2.3.0-df4bdce06b-39f760e09a.zip │ ├── tapable-npm-2.2.1-8cf5ff3039-3b7a1b4d86.zip │ ├── terser-npm-5.16.9-65df42a05f-b373693ee0.zip │ ├── webpack-npm-5.79.0-596061f3bf-3fbd82dadc.zip │ ├── xmlchars-npm-2.2.0-8b78f0f5e4-8c70ac9407.zip │ ├── yallist-npm-4.0.0-b493d9e907-343617202a.zip │ ├── @npmcli-fs-npm-2.1.2-08d434e77b-405074965e.zip │ ├── @xtuc-long-npm-4.2.2-37236e6d72-8ed0d477ce.zip │ ├── acorn-walk-npm-8.2.0-2f2cac3177-1715e76c01.zip │ ├── agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip │ ├── ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip │ ├── ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip │ ├── buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip │ ├── clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip │ ├── color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip │ ├── commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip │ ├── concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip │ ├── crypto-js-npm-4.1.1-38a3b8c19d-b3747c12ee.zip │ ├── data-urls-npm-4.0.0-0e3aa92e72-006e869b5b.zip │ ├── decimal.js-npm-10.4.3-e7d483387c-796404dcfa.zip │ ├── delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip │ ├── detect-libc-npm-2.0.1-2699cb2ac4-ccb05fcabb.zip │ ├── emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip │ ├── encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip │ ├── env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip │ ├── escodegen-npm-2.0.0-6450b02925-5aa6b2966f.zip │ ├── esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip │ ├── estraverse-npm-4.3.0-920a32f3c6-a6299491f9.zip │ ├── estraverse-npm-5.3.0-03284f8f63-072780882d.zip │ ├── form-data-npm-4.0.0-916facec2d-01135bf867.zip │ ├── fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip │ ├── fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip │ ├── globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip │ ├── has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip │ ├── humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip │ ├── iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip │ ├── imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip │ ├── infer-owner-npm-1.0.4-685ac3d2af-181e732764.zip │ ├── is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip │ ├── js-tokens-npm-4.0.0-0ac852e9e2-8a95213a5a.zip │ ├── lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip │ ├── lru-cache-npm-7.18.3-e68be5b11c-e550d77238.zip │ ├── mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip │ ├── minimatch-npm-3.1.2-9405269906-c154e56640.zip │ ├── minimatch-npm-5.1.6-1e71429f4c-7564208ef8.zip │ ├── negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip │ ├── neo-async-npm-2.6.2-75d6902586-deac9f8d00.zip │ ├── node-fetch-npm-2.6.9-9fc9a54529-acb04f9ce7.zip │ ├── optionator-npm-0.8.3-bc555bc5b7-b8695ddf3d.zip │ ├── picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip │ ├── prelude-ls-npm-1.1.2-a0daac0886-c4867c8748.zip │ ├── randombytes-npm-2.1.0-e3da76bccf-d779499376.zip │ ├── rrweb-cssom-npm-0.6.0-04bbb1169b-182312f6e4.zip │ ├── safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip │ ├── signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip │ ├── simple-get-npm-3.1.1-dce5923dba-80195e70bf.zip │ ├── source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip │ ├── strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip │ ├── symbol-tree-npm-3.2.4-fe70cdb75b-6e8fc7e148.zip │ ├── type-check-npm-0.3.2-a4a38bb0b6-dd3b149564.zip │ ├── unique-slug-npm-3.0.0-0b82e51577-49f8d915ba.zip │ ├── url-parse-npm-1.5.10-64fa2bcd6d-fbdba6b1d8.zip │ ├── watchpack-npm-2.4.0-7ec4b9cc65-23d4bc5863.zip │ ├── whatwg-url-npm-12.0.1-777d17d043-8698993b76.zip │ ├── whatwg-url-npm-5.0.0-374fb45e60-b8daed4ad3.zip │ ├── wide-align-npm-1.1.5-889d77e592-d5fc37cd56.zip │ ├── word-wrap-npm-1.2.3-7fb15ab002-30b48f91fc.zip │ ├── @babel-types-npm-7.21.4-ee756f419d-587bc55a91.zip │ ├── @types-estree-npm-1.0.0-eddde5b631-910d97fb70.zip │ ├── @xtuc-ieee754-npm-1.2.0-ec0ce4e025-ac56d4ca6e.zip │ ├── acorn-globals-npm-7.0.1-97c48c0140-2a2998a547.zip │ ├── ajv-keywords-npm-3.5.2-0e391b70e2-7dc5e59316.zip │ ├── browserslist-npm-4.21.5-e3b9e9d029-9755986b22.zip │ ├── color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip │ ├── color-support-npm-1.1.3-3be5c53455-9b73568176.zip │ ├── domexception-npm-4.0.0-5093673f9b-ddbc1268ed.zip │ ├── eslint-scope-npm-5.1.1-71fe59b18a-47e4b6a3f0.zip │ ├── graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip │ ├── indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip │ ├── jest-worker-npm-27.5.1-1c110b5894-98cd68b696.zip │ ├── loader-runner-npm-4.3.0-9ca67df372-a90e00dee9.zip │ ├── merge-stream-npm-2.0.0-2ac83efea5-6fa4dcc8d8.zip │ ├── object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip │ ├── promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip │ ├── requires-port-npm-1.0.0-fd036b488a-eee0e303ad.zip │ ├── safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip │ ├── schema-utils-npm-3.1.1-8704647575-fb73f3d759.zip │ ├── set-blocking-npm-2.0.0-49e2cffa24-6e65a05f7c.zip │ ├── simple-concat-npm-1.0.1-48df70de29-4d211042cc.zip │ ├── smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip │ ├── string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip │ ├── tough-cookie-npm-4.1.2-09068826e1-a7359e9a3e.zip │ ├── universalify-npm-0.2.0-9984e61c10-e86134cb12.zip │ ├── @babel-parser-npm-7.21.4-edab9c197b-de610ecd1b.zip │ ├── @babel-template-npm-7.20.7-c157fc5838-2eb1a0ab8d.zip │ ├── @babel-traverse-npm-7.21.4-0fc91c1e5e-f22f067c2d.zip │ ├── @gar-promisify-npm-1.1.3-ac1a325862-4059f790e2.zip │ ├── @types-eslint-npm-8.37.0-1f765f44f3-06d3b3fba1.zip │ ├── @types-node-npm-18.15.11-fd8ceaaffd-977b4ad047.zip │ ├── agentkeepalive-npm-4.3.0-ac3d8e6807-982453aa44.zip │ ├── aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip │ ├── are-we-there-yet-npm-2.0.0-7d2f5201ce-6c80b4fd04.zip │ ├── are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip │ ├── balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip │ ├── brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip │ ├── brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip │ ├── combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip │ ├── delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip │ ├── es-module-lexer-npm-1.2.1-1c9bda6e09-c4145b853e.zip │ ├── fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip │ ├── fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip │ ├── glob-to-regexp-npm-0.4.1-cd697e0fc7-e795f4e8f0.zip │ ├── http-proxy-agent-npm-5.0.0-7f1f121b83-e2ee1ff165.zip │ ├── mimic-response-npm-2.1.0-037463e454-014fad6ab9.zip │ ├── minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip │ ├── minipass-fetch-npm-2.1.2-9b21a5c930-3f216be791.zip │ ├── minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip │ ├── minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip │ ├── node-releases-npm-2.0.10-f8e2d9a776-d784ecde25.zip │ ├── path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip │ ├── promise-inflight-npm-1.0.1-5bb925afac-2274948309.zip │ ├── querystringify-npm-2.2.0-4e77c9f606-5641ea231b.zip │ ├── readable-stream-npm-3.6.2-d2a6069158-bdcbe6c22e.zip │ ├── string_decoder-npm-1.3.0-2422117fd0-8417646695.zip │ ├── supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip │ ├── supports-color-npm-8.1.1-289e937149-c052193a7e.zip │ ├── unique-filename-npm-2.0.1-183c6c7c2b-807acf3381.zip │ ├── util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip │ ├── webpack-sources-npm-3.2.3-6bfb5d9563-989e401b9f.zip │ ├── whatwg-encoding-npm-2.0.0-d7451f51b4-7087810c41.zip │ ├── whatwg-mimetype-npm-3.0.0-5b617710c1-ce08bbb36b.zip │ ├── @babel-code-frame-npm-7.21.4-5db83e65be-e5390e6ec1.zip │ ├── @babel-generator-npm-7.21.4-4ab6c9c2f0-9ffbb526a5.zip │ ├── @babel-highlight-npm-7.18.6-9d35ad2e27-92d8ee6154.zip │ ├── @npmcli-move-file-npm-2.0.1-b593d8f741-52dc02259d.zip │ ├── @tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip │ ├── chrome-trace-event-npm-1.0.3-e0ae3dcd60-cb8b1fc7e8.zip │ ├── enhanced-resolve-npm-5.12.0-c291ce4ee3-bf3f787fac.zip │ ├── https-proxy-agent-npm-5.0.1-42d65f358e-571fccdf38.zip │ ├── make-fetch-happen-npm-10.2.1-f1cc7cd2df-2332eb9a8e.zip │ ├── minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip │ ├── socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip │ ├── to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip │ ├── w3c-xmlserializer-npm-4.0.0-f09d0ec3fc-eba070e78d.zip │ ├── webidl-conversions-npm-3.0.1-60310f6a2b-c92a0a6ab9.zip │ ├── webidl-conversions-npm-7.0.0-e8c8e30c68-f05588567a.zip │ ├── xml-name-validator-npm-4.0.0-0857c21729-af100b79c2.zip │ ├── @jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip │ ├── @mapbox-node-pre-gyp-npm-1.0.10-1811160047-1a98db05d9.zip │ ├── @types-eslint-scope-npm-3.7.4-c11d226d71-ea6a9363e9.zip │ ├── @types-json-schema-npm-7.0.11-79462ae5ca-527bddfe62.zip │ ├── @webassemblyjs-ast-npm-1.11.1-623d3d973e-1eee1534ad.zip │ ├── @webassemblyjs-utf8-npm-1.11.1-583036e767-972c5cfc76.zip │ ├── caniuse-lite-npm-1.0.30001478-38123b6077-27a370dcb3.zip │ ├── decompress-response-npm-4.2.1-abe5b4ebe4-4e783ca4df.zip │ ├── escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip │ ├── html-encoding-sniffer-npm-3.0.0-daac3dfe41-8d806aa004.zip │ ├── http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip │ ├── json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip │ ├── serialize-javascript-npm-6.0.1-fac87289ed-3c4f4cb61d.zip │ ├── source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip │ ├── terser-webpack-plugin-npm-5.3.7-4bfad49798-095e699fde.zip │ ├── @jridgewell-gen-mapping-npm-0.3.3-1815eba94c-4a74944bd3.zip │ ├── @jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip │ ├── @jridgewell-source-map-npm-0.3.3-eb138f3f67-ae13021463.zip │ ├── @webassemblyjs-ieee754-npm-1.11.1-897eb85879-23a0ac02a5.zip │ ├── @webassemblyjs-leb128-npm-1.11.1-fd9f27673d-33ccc4ade2.zip │ ├── acorn-import-assertions-npm-1.8.0-e9a9d57e27-5c4cf7c850.zip │ ├── console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip │ ├── electron-to-chromium-npm-1.4.361-007b057a72-66b3210c9c.zip │ ├── is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip │ ├── update-browserslist-db-npm-1.0.10-676baf0b9f-12db73b4f6.zip │ ├── @jridgewell-trace-mapping-npm-0.3.18-cd96571385-0572669f85.zip │ ├── @webassemblyjs-wasm-edit-npm-1.11.1-34565c1e92-6d7d9efaec.zip │ ├── @webassemblyjs-wasm-gen-npm-1.11.1-a6d0b4d37d-1f6921e640.zip │ ├── @webassemblyjs-wasm-opt-npm-1.11.1-0bb73c20b9-21586883a2.zip │ ├── fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip │ ├── @babel-helper-function-name-npm-7.21.0-a17ce5a05a-d63e63c3e0.zip │ ├── @babel-helper-string-parser-npm-7.19.4-0db110dc3a-b2f8a3920b.zip │ ├── @jridgewell-sourcemap-codec-npm-1.4.14-f5f0630788-61100637b6.zip │ ├── @jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip │ ├── @webassemblyjs-wasm-parser-npm-1.11.1-cd49c51fdc-1521644065.zip │ ├── @webassemblyjs-wast-printer-npm-1.11.1-f1213430d6-f15ae4c244.zip │ ├── @babel-helper-hoist-variables-npm-7.18.6-6eb061f405-fd9c35bb43.zip │ ├── @webassemblyjs-helper-buffer-npm-1.11.1-6afb1ef4aa-a337ee44b4.zip │ ├── @webassemblyjs-helper-numbers-npm-1.11.1-a41f7439eb-44d2905dac.zip │ ├── json-parse-even-better-errors-npm-2.3.1-144d62256e-798ed4cf33.zip │ ├── @webassemblyjs-helper-api-error-npm-1.11.1-b839d59053-0792813f0e.zip │ ├── is-potential-custom-element-name-npm-1.0.1-f352f606f8-ced7bbbb64.zip │ ├── @babel-helper-environment-visitor-npm-7.18.9-9f5b3635a1-b25101f616.zip │ ├── @babel-helper-validator-identifier-npm-7.19.1-d84f19e1dc-0eca5e86a7.zip │ ├── @webassemblyjs-helper-wasm-bytecode-npm-1.11.1-84f0ee4c30-eac4001131.zip │ ├── @webassemblyjs-helper-wasm-section-npm-1.11.1-e4e8450b9d-617696cfe8.zip │ ├── @babel-helper-split-export-declaration-npm-7.18.6-53ebf8ad4c-c6d3dede53.zip │ └── @webassemblyjs-floating-point-hex-parser-npm-1.11.1-f8af5c0037-b8efc6fa08.zip ├── .lfsconfig ├── Qichacha ├── assets │ ├── image-20230416222632996.png │ ├── image-20230416222904104.png │ ├── image-20230416223022769.png │ ├── image-20230416223232344.png │ ├── image-20230416224648171.png │ └── image-20230416224857367.png ├── README.md └── src │ └── encrypt.js ├── Qizhidao ├── src │ ├── hook.js │ └── decrypt.js └── README.md ├── package.json ├── Youdao_Fanyi ├── src │ ├── encrypt.js │ ├── decrypt.js │ ├── main.py │ └── decrypt │ │ └── webpack_mixer.js └── README.md ├── pyproject.toml ├── Day4 └── src │ ├── Bilibili_Popular.py │ └── Music_Cracker.py └── .gitignore /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 120 3 | -------------------------------------------------------------------------------- /Meituan/src/.gitignore: -------------------------------------------------------------------------------- 1 | # Cookies 文件可能保存了用户已登录的身份信息 2 | # 涉及高度机密,特此屏蔽以避免文件意外上传 3 | *.json 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python爬虫逆向实战 2 | 3 | - 教育机构:**图灵教育** 4 | - 讲师:**何老师** 5 | - 课程:**Python爬虫逆向实战** 6 | - 性质:**免费体验课** 7 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.mp4 filter=lfs diff=lfs merge=lfs -text 2 | *.pdf filter=lfs diff=lfs merge=lfs -text 3 | *.png filter=lfs diff=lfs merge=lfs -text 4 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: pnp 2 | 3 | npmRegistryServer: "https://repo.huaweicloud.com/repository/npm/" 4 | 5 | yarnPath: .yarn/releases/yarn-3.5.0.cjs 6 | -------------------------------------------------------------------------------- /Meituan/src/document.json.template: -------------------------------------------------------------------------------- 1 | { 2 | // 在浏览器控制台输入 document.cookie 即可获取一长串的 Cookie 字符串 3 | // 将它贴到下面即可 4 | "cookie": "把 Cookie 字符串替换到这里来" 5 | } 6 | -------------------------------------------------------------------------------- /Day1/assets/第1天.mp4: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5ecedc108fdc8b0364a7c14fa7920020eb9f70cba12c3b637468939643e96086 3 | size 1715201971 4 | -------------------------------------------------------------------------------- /Day2/assets/第2天.mp4: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:af7663a3dfe979911befe3f700b7d1df40e05a7f9df019abffe6afbdbdebae40 3 | size 2137068674 4 | -------------------------------------------------------------------------------- /.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip -------------------------------------------------------------------------------- /.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip -------------------------------------------------------------------------------- /.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip -------------------------------------------------------------------------------- /.yarn/cache/psl-npm-1.9.0-a546edad1a-20c4277f64.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/psl-npm-1.9.0-a546edad1a-20c4277f64.zip -------------------------------------------------------------------------------- /.yarn/cache/ws-npm-8.13.0-26ffa3016a-53e991bbf9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ws-npm-8.13.0-26ffa3016a-53e991bbf9.zip -------------------------------------------------------------------------------- /Day1/assets/Web逆向实战-第1天.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ee3fc4395fc76c030f1775d4b16d63d340191e6bb656a29aa101d1780b50016b 3 | size 162286 4 | -------------------------------------------------------------------------------- /Day2/assets/Web逆向实战-第2天.pdf: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9c83f555293bf2c2e3b494f48e85de79c3ef3bea95786617d34410dc854b9bbf 3 | size 78598 4 | -------------------------------------------------------------------------------- /.yarn/cache/abab-npm-2.0.6-2662fba7f0-6ffc1af4ff.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/abab-npm-2.0.6-2662fba7f0-6ffc1af4ff.zip -------------------------------------------------------------------------------- /.yarn/cache/abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip -------------------------------------------------------------------------------- /.yarn/cache/acorn-npm-8.8.2-9d518fd7d3-f790b99a1b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/acorn-npm-8.8.2-9d518fd7d3-f790b99a1b.zip -------------------------------------------------------------------------------- /.yarn/cache/ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip -------------------------------------------------------------------------------- /.yarn/cache/aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip -------------------------------------------------------------------------------- /.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip -------------------------------------------------------------------------------- /.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip -------------------------------------------------------------------------------- /.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip -------------------------------------------------------------------------------- /.yarn/cache/depd-npm-2.0.0-b6c51a4b43-abbe19c768.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/depd-npm-2.0.0-b6c51a4b43-abbe19c768.zip -------------------------------------------------------------------------------- /.yarn/cache/events-npm-3.3.0-c280bc7e48-f6f487ad21.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/events-npm-3.3.0-c280bc7e48-f6f487ad21.zip -------------------------------------------------------------------------------- /.yarn/cache/gauge-npm-3.0.2-9e22f7af9e-81296c00c7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/gauge-npm-3.0.2-9e22f7af9e-81296c00c7.zip -------------------------------------------------------------------------------- /.yarn/cache/gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-npm-8.1.0-65f64af8b1-92fbea3221.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/glob-npm-8.1.0-65f64af8b1-92fbea3221.zip -------------------------------------------------------------------------------- /.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip -------------------------------------------------------------------------------- /.yarn/cache/jsdom-npm-21.1.1-cb6155f6f0-ea33c3f3f0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/jsdom-npm-21.1.1-cb6155f6f0-ea33c3f3f0.zip -------------------------------------------------------------------------------- /.yarn/cache/jsesc-npm-2.5.2-c5acb78804-4dc1907711.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/jsesc-npm-2.5.2-c5acb78804-4dc1907711.zip -------------------------------------------------------------------------------- /.yarn/cache/levn-npm-0.3.0-48d774b1c2-0d084a5242.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/levn-npm-0.3.0-48d774b1c2-0d084a5242.zip -------------------------------------------------------------------------------- /.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip -------------------------------------------------------------------------------- /.yarn/cache/nan-npm-2.17.0-bf36a21d6f-ec609aeaf7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/nan-npm-2.17.0-bf36a21d6f-ec609aeaf7.zip -------------------------------------------------------------------------------- /.yarn/cache/nopt-npm-5.0.0-304b40fbfe-d35fdec187.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/nopt-npm-5.0.0-304b40fbfe-d35fdec187.zip -------------------------------------------------------------------------------- /.yarn/cache/nopt-npm-6.0.0-5ea8050815-82149371f8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/nopt-npm-6.0.0-5ea8050815-82149371f8.zip -------------------------------------------------------------------------------- /.yarn/cache/npmlog-npm-5.0.1-366cab64a2-516b266302.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/npmlog-npm-5.0.1-366cab64a2-516b266302.zip -------------------------------------------------------------------------------- /.yarn/cache/npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip -------------------------------------------------------------------------------- /.yarn/cache/nwsapi-npm-2.2.2-b77040326c-4376910629.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/nwsapi-npm-2.2.2-b77040326c-4376910629.zip -------------------------------------------------------------------------------- /.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip -------------------------------------------------------------------------------- /.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip -------------------------------------------------------------------------------- /.yarn/cache/parse5-npm-7.1.2-aa9a92c270-59465dd05e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/parse5-npm-7.1.2-aa9a92c270-59465dd05e.zip -------------------------------------------------------------------------------- /.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip -------------------------------------------------------------------------------- /.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip -------------------------------------------------------------------------------- /.yarn/cache/saxes-npm-6.0.0-31558949f5-d3fa3e2aaf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/saxes-npm-6.0.0-31558949f5-d3fa3e2aaf.zip -------------------------------------------------------------------------------- /.yarn/cache/semver-npm-6.3.0-b3eace8bfd-1b26ecf6db.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/semver-npm-6.3.0-b3eace8bfd-1b26ecf6db.zip -------------------------------------------------------------------------------- /.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/semver-npm-7.3.8-25a996cb4f-ba9c7cbbf2.zip -------------------------------------------------------------------------------- /.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip -------------------------------------------------------------------------------- /.yarn/cache/ssri-npm-9.0.1-33ce27f4f8-fb58f5e46b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ssri-npm-9.0.1-33ce27f4f8-fb58f5e46b.zip -------------------------------------------------------------------------------- /.yarn/cache/tar-npm-6.1.13-3234e72781-8a278bed12.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/tar-npm-6.1.13-3234e72781-8a278bed12.zip -------------------------------------------------------------------------------- /.yarn/cache/tr46-npm-0.0.3-de53018915-726321c5ea.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/tr46-npm-0.0.3-de53018915-726321c5ea.zip -------------------------------------------------------------------------------- /.yarn/cache/tr46-npm-4.1.1-3f695e44e5-aeeb821ac2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/tr46-npm-4.1.1-3f695e44e5-aeeb821ac2.zip -------------------------------------------------------------------------------- /.yarn/cache/uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip -------------------------------------------------------------------------------- /.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip -------------------------------------------------------------------------------- /.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip -------------------------------------------------------------------------------- /.lfsconfig: -------------------------------------------------------------------------------- 1 | [lfs] 2 | # Server only provides pull support. 3 | # Will fail if you try to push something. 4 | url = "https://lfs.v.ariant.cn/LWH8mdMv8gs/Python-Reverse-Tutorial.git" 5 | -------------------------------------------------------------------------------- /.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip -------------------------------------------------------------------------------- /.yarn/cache/cacache-npm-16.1.3-4e2088ed0d-d91409e6e5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/cacache-npm-16.1.3-4e2088ed0d-d91409e6e5.zip -------------------------------------------------------------------------------- /.yarn/cache/canvas-npm-2.11.0-1643476467-a69a6e0c90.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/canvas-npm-2.11.0-1643476467-a69a6e0c90.zip -------------------------------------------------------------------------------- /.yarn/cache/cssstyle-npm-3.0.0-3947bec0b5-31f694dfed.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/cssstyle-npm-3.0.0-3947bec0b5-31f694dfed.zip -------------------------------------------------------------------------------- /.yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip -------------------------------------------------------------------------------- /.yarn/cache/entities-npm-4.4.0-97635dc5cc-84d250329f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/entities-npm-4.4.0-97635dc5cc-84d250329f.zip -------------------------------------------------------------------------------- /.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip -------------------------------------------------------------------------------- /.yarn/cache/escalade-npm-3.1.1-e02da076aa-a3e2a99f07.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/escalade-npm-3.1.1-e02da076aa-a3e2a99f07.zip -------------------------------------------------------------------------------- /.yarn/cache/esprima-npm-4.0.1-1084e98778-b45bc805a6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/esprima-npm-4.0.1-1084e98778-b45bc805a6.zip -------------------------------------------------------------------------------- /.yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip -------------------------------------------------------------------------------- /.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip -------------------------------------------------------------------------------- /.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip -------------------------------------------------------------------------------- /.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip -------------------------------------------------------------------------------- /.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip -------------------------------------------------------------------------------- /.yarn/cache/make-dir-npm-3.1.0-d1d7505142-484200020a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/make-dir-npm-3.1.0-d1d7505142-484200020a.zip -------------------------------------------------------------------------------- /.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-npm-4.2.5-25860eb433-4f9c19af23.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minipass-npm-4.2.5-25860eb433-4f9c19af23.zip -------------------------------------------------------------------------------- /.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip -------------------------------------------------------------------------------- /.yarn/cache/node-gyp-npm-9.3.1-43540bab9c-b860e9976f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/node-gyp-npm-9.3.1-43540bab9c-b860e9976f.zip -------------------------------------------------------------------------------- /.yarn/cache/punycode-npm-2.3.0-df4bdce06b-39f760e09a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/punycode-npm-2.3.0-df4bdce06b-39f760e09a.zip -------------------------------------------------------------------------------- /.yarn/cache/tapable-npm-2.2.1-8cf5ff3039-3b7a1b4d86.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/tapable-npm-2.2.1-8cf5ff3039-3b7a1b4d86.zip -------------------------------------------------------------------------------- /.yarn/cache/terser-npm-5.16.9-65df42a05f-b373693ee0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/terser-npm-5.16.9-65df42a05f-b373693ee0.zip -------------------------------------------------------------------------------- /.yarn/cache/webpack-npm-5.79.0-596061f3bf-3fbd82dadc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/webpack-npm-5.79.0-596061f3bf-3fbd82dadc.zip -------------------------------------------------------------------------------- /.yarn/cache/xmlchars-npm-2.2.0-8b78f0f5e4-8c70ac9407.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/xmlchars-npm-2.2.0-8b78f0f5e4-8c70ac9407.zip -------------------------------------------------------------------------------- /.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip -------------------------------------------------------------------------------- /.yarn/cache/@npmcli-fs-npm-2.1.2-08d434e77b-405074965e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@npmcli-fs-npm-2.1.2-08d434e77b-405074965e.zip -------------------------------------------------------------------------------- /.yarn/cache/@xtuc-long-npm-4.2.2-37236e6d72-8ed0d477ce.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@xtuc-long-npm-4.2.2-37236e6d72-8ed0d477ce.zip -------------------------------------------------------------------------------- /.yarn/cache/acorn-walk-npm-8.2.0-2f2cac3177-1715e76c01.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/acorn-walk-npm-8.2.0-2f2cac3177-1715e76c01.zip -------------------------------------------------------------------------------- /.yarn/cache/agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip -------------------------------------------------------------------------------- /.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip -------------------------------------------------------------------------------- /.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip -------------------------------------------------------------------------------- /.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip -------------------------------------------------------------------------------- /.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip -------------------------------------------------------------------------------- /.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip -------------------------------------------------------------------------------- /.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip -------------------------------------------------------------------------------- /.yarn/cache/crypto-js-npm-4.1.1-38a3b8c19d-b3747c12ee.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/crypto-js-npm-4.1.1-38a3b8c19d-b3747c12ee.zip -------------------------------------------------------------------------------- /.yarn/cache/data-urls-npm-4.0.0-0e3aa92e72-006e869b5b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/data-urls-npm-4.0.0-0e3aa92e72-006e869b5b.zip -------------------------------------------------------------------------------- /.yarn/cache/decimal.js-npm-10.4.3-e7d483387c-796404dcfa.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/decimal.js-npm-10.4.3-e7d483387c-796404dcfa.zip -------------------------------------------------------------------------------- /.yarn/cache/delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip -------------------------------------------------------------------------------- /.yarn/cache/detect-libc-npm-2.0.1-2699cb2ac4-ccb05fcabb.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/detect-libc-npm-2.0.1-2699cb2ac4-ccb05fcabb.zip -------------------------------------------------------------------------------- /.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip -------------------------------------------------------------------------------- /.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip -------------------------------------------------------------------------------- /.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip -------------------------------------------------------------------------------- /.yarn/cache/escodegen-npm-2.0.0-6450b02925-5aa6b2966f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/escodegen-npm-2.0.0-6450b02925-5aa6b2966f.zip -------------------------------------------------------------------------------- /.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip -------------------------------------------------------------------------------- /.yarn/cache/estraverse-npm-4.3.0-920a32f3c6-a6299491f9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/estraverse-npm-4.3.0-920a32f3c6-a6299491f9.zip -------------------------------------------------------------------------------- /.yarn/cache/estraverse-npm-5.3.0-03284f8f63-072780882d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/estraverse-npm-5.3.0-03284f8f63-072780882d.zip -------------------------------------------------------------------------------- /.yarn/cache/form-data-npm-4.0.0-916facec2d-01135bf867.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/form-data-npm-4.0.0-916facec2d-01135bf867.zip -------------------------------------------------------------------------------- /.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip -------------------------------------------------------------------------------- /.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip -------------------------------------------------------------------------------- /.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip -------------------------------------------------------------------------------- /.yarn/cache/has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip -------------------------------------------------------------------------------- /.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip -------------------------------------------------------------------------------- /.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip -------------------------------------------------------------------------------- /.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip -------------------------------------------------------------------------------- /.yarn/cache/infer-owner-npm-1.0.4-685ac3d2af-181e732764.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/infer-owner-npm-1.0.4-685ac3d2af-181e732764.zip -------------------------------------------------------------------------------- /.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip -------------------------------------------------------------------------------- /.yarn/cache/js-tokens-npm-4.0.0-0ac852e9e2-8a95213a5a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/js-tokens-npm-4.0.0-0ac852e9e2-8a95213a5a.zip -------------------------------------------------------------------------------- /.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip -------------------------------------------------------------------------------- /.yarn/cache/lru-cache-npm-7.18.3-e68be5b11c-e550d77238.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/lru-cache-npm-7.18.3-e68be5b11c-e550d77238.zip -------------------------------------------------------------------------------- /.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip -------------------------------------------------------------------------------- /.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip -------------------------------------------------------------------------------- /.yarn/cache/minimatch-npm-5.1.6-1e71429f4c-7564208ef8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minimatch-npm-5.1.6-1e71429f4c-7564208ef8.zip -------------------------------------------------------------------------------- /.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip -------------------------------------------------------------------------------- /.yarn/cache/neo-async-npm-2.6.2-75d6902586-deac9f8d00.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/neo-async-npm-2.6.2-75d6902586-deac9f8d00.zip -------------------------------------------------------------------------------- /.yarn/cache/node-fetch-npm-2.6.9-9fc9a54529-acb04f9ce7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/node-fetch-npm-2.6.9-9fc9a54529-acb04f9ce7.zip -------------------------------------------------------------------------------- /.yarn/cache/optionator-npm-0.8.3-bc555bc5b7-b8695ddf3d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/optionator-npm-0.8.3-bc555bc5b7-b8695ddf3d.zip -------------------------------------------------------------------------------- /.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip -------------------------------------------------------------------------------- /.yarn/cache/prelude-ls-npm-1.1.2-a0daac0886-c4867c8748.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/prelude-ls-npm-1.1.2-a0daac0886-c4867c8748.zip -------------------------------------------------------------------------------- /.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-d779499376.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-d779499376.zip -------------------------------------------------------------------------------- /.yarn/cache/rrweb-cssom-npm-0.6.0-04bbb1169b-182312f6e4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/rrweb-cssom-npm-0.6.0-04bbb1169b-182312f6e4.zip -------------------------------------------------------------------------------- /.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip -------------------------------------------------------------------------------- /.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip -------------------------------------------------------------------------------- /.yarn/cache/simple-get-npm-3.1.1-dce5923dba-80195e70bf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/simple-get-npm-3.1.1-dce5923dba-80195e70bf.zip -------------------------------------------------------------------------------- /.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip -------------------------------------------------------------------------------- /.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip -------------------------------------------------------------------------------- /.yarn/cache/symbol-tree-npm-3.2.4-fe70cdb75b-6e8fc7e148.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/symbol-tree-npm-3.2.4-fe70cdb75b-6e8fc7e148.zip -------------------------------------------------------------------------------- /.yarn/cache/type-check-npm-0.3.2-a4a38bb0b6-dd3b149564.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/type-check-npm-0.3.2-a4a38bb0b6-dd3b149564.zip -------------------------------------------------------------------------------- /.yarn/cache/unique-slug-npm-3.0.0-0b82e51577-49f8d915ba.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/unique-slug-npm-3.0.0-0b82e51577-49f8d915ba.zip -------------------------------------------------------------------------------- /.yarn/cache/url-parse-npm-1.5.10-64fa2bcd6d-fbdba6b1d8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/url-parse-npm-1.5.10-64fa2bcd6d-fbdba6b1d8.zip -------------------------------------------------------------------------------- /.yarn/cache/watchpack-npm-2.4.0-7ec4b9cc65-23d4bc5863.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/watchpack-npm-2.4.0-7ec4b9cc65-23d4bc5863.zip -------------------------------------------------------------------------------- /.yarn/cache/whatwg-url-npm-12.0.1-777d17d043-8698993b76.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/whatwg-url-npm-12.0.1-777d17d043-8698993b76.zip -------------------------------------------------------------------------------- /.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-b8daed4ad3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-b8daed4ad3.zip -------------------------------------------------------------------------------- /.yarn/cache/wide-align-npm-1.1.5-889d77e592-d5fc37cd56.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/wide-align-npm-1.1.5-889d77e592-d5fc37cd56.zip -------------------------------------------------------------------------------- /.yarn/cache/word-wrap-npm-1.2.3-7fb15ab002-30b48f91fc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/word-wrap-npm-1.2.3-7fb15ab002-30b48f91fc.zip -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_21-48-20.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:62f668953bc5674c0f714c4fa3b0c0cab89630124167884140c7eb18473cfdc0 3 | size 381638 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_21-49-51.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ff55ffcbb59bf1041e5b44fa22fc50562891eacef4e1059a06523ee9132c85b6 3 | size 30578 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_22-03-44.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a5ec1450a0cea7ddfed106cb7eecf5e3a3914bd2cc28d461bc7c9adb8108a117 3 | size 192386 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_22-21-25.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:078930c7acc82a2fbfb465b78b2ff739b0d7f734711f3a4c8ffdc6b27c29d11c 3 | size 75651 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_22-35-02.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ed49ee3bc1751b08a831dfe9c108b29e2449122d8b985ab24e30f2fddcfea91a 3 | size 213390 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_22-49-08.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b8ea9848686c62750b56cab78c6a6402aca31ca291269c3368a37b1f8ac16d0d 3 | size 105027 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_22-51-58.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ad4b3b3ac6fa519c2099d0d1cc61c6b7e33415ab4b2465cecee6cf635ba93c18 3 | size 85662 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_23-53-46.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:37b3f7f4d2d221992347fd096761dcdb61da57ab3770a91398947e132017fd15 3 | size 235419 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-23_23-57-13.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d315e51bbf4b629159970668d44e73d99341b2af1a8a8a20b6445e132a3935e3 3 | size 230183 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-24_00-14-59.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5fb39a13bbcd9ca5905dd67358c20a1c05b66ac13850281a73021b97ca30c709 3 | size 256003 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-24_01-21-42.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9b52e7b41a8348301e9b6a0709a27ae0bb195c6b52641450607ff8130a5fd19e 3 | size 73022 4 | -------------------------------------------------------------------------------- /Day2/assets/Snipaste_2023-03-24_01-23-29.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3923c8800488835b00a0b0c0d8d440ca412eb8407b4ded59b08e12ba6e768d6a 3 | size 48678 4 | -------------------------------------------------------------------------------- /Meituan/assets/image-20230418122319127.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0e03410f86482d1d641256e1f14e5a2102c673ba2f1c0f23275da32c79346d9a 3 | size 440849 4 | -------------------------------------------------------------------------------- /Meituan/assets/image-20230418125929592.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3a888df002d7163cb3b248549786173978de23ffde0e2e04c4cb1bf1d939ff17 3 | size 89233 4 | -------------------------------------------------------------------------------- /Meituan/assets/image-20230418130259497.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:06bacccaf68ceb40529d480311ba5c79b98cd994bc5396d22083cc4a41eabcb2 3 | size 432589 4 | -------------------------------------------------------------------------------- /Meituan/assets/image-20230418143722340.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9aeb3de1c8865d3bf0a38329b67c4954adf6941f969ce6a2691e4deef815072d 3 | size 511309 4 | -------------------------------------------------------------------------------- /Meituan/assets/image-20230418145332640.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ac2d84f057f61c78d7a9013c7f0e4b740d7521249d658ed78bf7606011cd31a1 3 | size 42680 4 | -------------------------------------------------------------------------------- /Meituan/assets/image-20230418145408736.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d5e76515a9e6b99f34a88f049d3c39c5f4424ec0976ffc1ed95683fae32041df 3 | size 234580 4 | -------------------------------------------------------------------------------- /Qichacha/assets/image-20230416222632996.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0ec97a6fb566df4cd1d2cd031528c448a2e67cf9cf5b829f50a9a1de6ff5ed3b 3 | size 418325 4 | -------------------------------------------------------------------------------- /Qichacha/assets/image-20230416222904104.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0af7efc9420541942f21fe4eb823b379b2b8c5a7781bb3fe84bf2460f59a0f20 3 | size 137602 4 | -------------------------------------------------------------------------------- /Qichacha/assets/image-20230416223022769.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:18c4010e5368a627ee59027fd147b99b2c191925ce26bb694c1f8e9fa6f8ee14 3 | size 265318 4 | -------------------------------------------------------------------------------- /Qichacha/assets/image-20230416223232344.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:67e477f74982877acaa5a5664531608d89bd0632fcab8eaf860b58cae3870f64 3 | size 312659 4 | -------------------------------------------------------------------------------- /Qichacha/assets/image-20230416224648171.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:af8e8075f6d8d6d2e9ccdcb2cedc11318cfa831d21318d4a8f24288282122328 3 | size 60985 4 | -------------------------------------------------------------------------------- /Qichacha/assets/image-20230416224857367.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:44a0d3737e4dbb80c5a6afdb5d115e0db9796181ccf30542e0b4e6c66acb22d5 3 | size 48565 4 | -------------------------------------------------------------------------------- /.yarn/cache/@babel-types-npm-7.21.4-ee756f419d-587bc55a91.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-types-npm-7.21.4-ee756f419d-587bc55a91.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-estree-npm-1.0.0-eddde5b631-910d97fb70.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@types-estree-npm-1.0.0-eddde5b631-910d97fb70.zip -------------------------------------------------------------------------------- /.yarn/cache/@xtuc-ieee754-npm-1.2.0-ec0ce4e025-ac56d4ca6e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@xtuc-ieee754-npm-1.2.0-ec0ce4e025-ac56d4ca6e.zip -------------------------------------------------------------------------------- /.yarn/cache/acorn-globals-npm-7.0.1-97c48c0140-2a2998a547.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/acorn-globals-npm-7.0.1-97c48c0140-2a2998a547.zip -------------------------------------------------------------------------------- /.yarn/cache/ajv-keywords-npm-3.5.2-0e391b70e2-7dc5e59316.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/ajv-keywords-npm-3.5.2-0e391b70e2-7dc5e59316.zip -------------------------------------------------------------------------------- /.yarn/cache/browserslist-npm-4.21.5-e3b9e9d029-9755986b22.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/browserslist-npm-4.21.5-e3b9e9d029-9755986b22.zip -------------------------------------------------------------------------------- /.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/color-convert-npm-1.9.3-1fe690075e-fd7a64a17c.zip -------------------------------------------------------------------------------- /.yarn/cache/color-support-npm-1.1.3-3be5c53455-9b73568176.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/color-support-npm-1.1.3-3be5c53455-9b73568176.zip -------------------------------------------------------------------------------- /.yarn/cache/domexception-npm-4.0.0-5093673f9b-ddbc1268ed.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/domexception-npm-4.0.0-5093673f9b-ddbc1268ed.zip -------------------------------------------------------------------------------- /.yarn/cache/eslint-scope-npm-5.1.1-71fe59b18a-47e4b6a3f0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/eslint-scope-npm-5.1.1-71fe59b18a-47e4b6a3f0.zip -------------------------------------------------------------------------------- /.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip -------------------------------------------------------------------------------- /.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip -------------------------------------------------------------------------------- /.yarn/cache/jest-worker-npm-27.5.1-1c110b5894-98cd68b696.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/jest-worker-npm-27.5.1-1c110b5894-98cd68b696.zip -------------------------------------------------------------------------------- /.yarn/cache/loader-runner-npm-4.3.0-9ca67df372-a90e00dee9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/loader-runner-npm-4.3.0-9ca67df372-a90e00dee9.zip -------------------------------------------------------------------------------- /.yarn/cache/merge-stream-npm-2.0.0-2ac83efea5-6fa4dcc8d8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/merge-stream-npm-2.0.0-2ac83efea5-6fa4dcc8d8.zip -------------------------------------------------------------------------------- /.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip -------------------------------------------------------------------------------- /.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip -------------------------------------------------------------------------------- /.yarn/cache/requires-port-npm-1.0.0-fd036b488a-eee0e303ad.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/requires-port-npm-1.0.0-fd036b488a-eee0e303ad.zip -------------------------------------------------------------------------------- /.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip -------------------------------------------------------------------------------- /.yarn/cache/schema-utils-npm-3.1.1-8704647575-fb73f3d759.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/schema-utils-npm-3.1.1-8704647575-fb73f3d759.zip -------------------------------------------------------------------------------- /.yarn/cache/set-blocking-npm-2.0.0-49e2cffa24-6e65a05f7c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/set-blocking-npm-2.0.0-49e2cffa24-6e65a05f7c.zip -------------------------------------------------------------------------------- /.yarn/cache/simple-concat-npm-1.0.1-48df70de29-4d211042cc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/simple-concat-npm-1.0.1-48df70de29-4d211042cc.zip -------------------------------------------------------------------------------- /.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip -------------------------------------------------------------------------------- /.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip -------------------------------------------------------------------------------- /.yarn/cache/tough-cookie-npm-4.1.2-09068826e1-a7359e9a3e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/tough-cookie-npm-4.1.2-09068826e1-a7359e9a3e.zip -------------------------------------------------------------------------------- /.yarn/cache/universalify-npm-0.2.0-9984e61c10-e86134cb12.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/universalify-npm-0.2.0-9984e61c10-e86134cb12.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-parser-npm-7.21.4-edab9c197b-de610ecd1b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-parser-npm-7.21.4-edab9c197b-de610ecd1b.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-template-npm-7.20.7-c157fc5838-2eb1a0ab8d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-template-npm-7.20.7-c157fc5838-2eb1a0ab8d.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-traverse-npm-7.21.4-0fc91c1e5e-f22f067c2d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-traverse-npm-7.21.4-0fc91c1e5e-f22f067c2d.zip -------------------------------------------------------------------------------- /.yarn/cache/@gar-promisify-npm-1.1.3-ac1a325862-4059f790e2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@gar-promisify-npm-1.1.3-ac1a325862-4059f790e2.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-eslint-npm-8.37.0-1f765f44f3-06d3b3fba1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@types-eslint-npm-8.37.0-1f765f44f3-06d3b3fba1.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-node-npm-18.15.11-fd8ceaaffd-977b4ad047.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@types-node-npm-18.15.11-fd8ceaaffd-977b4ad047.zip -------------------------------------------------------------------------------- /.yarn/cache/agentkeepalive-npm-4.3.0-ac3d8e6807-982453aa44.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/agentkeepalive-npm-4.3.0-ac3d8e6807-982453aa44.zip -------------------------------------------------------------------------------- /.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip -------------------------------------------------------------------------------- /.yarn/cache/are-we-there-yet-npm-2.0.0-7d2f5201ce-6c80b4fd04.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/are-we-there-yet-npm-2.0.0-7d2f5201ce-6c80b4fd04.zip -------------------------------------------------------------------------------- /.yarn/cache/are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip -------------------------------------------------------------------------------- /.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip -------------------------------------------------------------------------------- /.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip -------------------------------------------------------------------------------- /.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip -------------------------------------------------------------------------------- /.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip -------------------------------------------------------------------------------- /.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip -------------------------------------------------------------------------------- /.yarn/cache/es-module-lexer-npm-1.2.1-1c9bda6e09-c4145b853e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/es-module-lexer-npm-1.2.1-1c9bda6e09-c4145b853e.zip -------------------------------------------------------------------------------- /.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip -------------------------------------------------------------------------------- /.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip -------------------------------------------------------------------------------- /.yarn/cache/glob-to-regexp-npm-0.4.1-cd697e0fc7-e795f4e8f0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/glob-to-regexp-npm-0.4.1-cd697e0fc7-e795f4e8f0.zip -------------------------------------------------------------------------------- /.yarn/cache/http-proxy-agent-npm-5.0.0-7f1f121b83-e2ee1ff165.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/http-proxy-agent-npm-5.0.0-7f1f121b83-e2ee1ff165.zip -------------------------------------------------------------------------------- /.yarn/cache/mimic-response-npm-2.1.0-037463e454-014fad6ab9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/mimic-response-npm-2.1.0-037463e454-014fad6ab9.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-fetch-npm-2.1.2-9b21a5c930-3f216be791.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minipass-fetch-npm-2.1.2-9b21a5c930-3f216be791.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip -------------------------------------------------------------------------------- /.yarn/cache/node-releases-npm-2.0.10-f8e2d9a776-d784ecde25.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/node-releases-npm-2.0.10-f8e2d9a776-d784ecde25.zip -------------------------------------------------------------------------------- /.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip -------------------------------------------------------------------------------- /.yarn/cache/promise-inflight-npm-1.0.1-5bb925afac-2274948309.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/promise-inflight-npm-1.0.1-5bb925afac-2274948309.zip -------------------------------------------------------------------------------- /.yarn/cache/querystringify-npm-2.2.0-4e77c9f606-5641ea231b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/querystringify-npm-2.2.0-4e77c9f606-5641ea231b.zip -------------------------------------------------------------------------------- /.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-bdcbe6c22e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-bdcbe6c22e.zip -------------------------------------------------------------------------------- /.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/supports-color-npm-5.5.0-183ac537bc-95f6f4ba5a.zip -------------------------------------------------------------------------------- /.yarn/cache/supports-color-npm-8.1.1-289e937149-c052193a7e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/supports-color-npm-8.1.1-289e937149-c052193a7e.zip -------------------------------------------------------------------------------- /.yarn/cache/unique-filename-npm-2.0.1-183c6c7c2b-807acf3381.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/unique-filename-npm-2.0.1-183c6c7c2b-807acf3381.zip -------------------------------------------------------------------------------- /.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip -------------------------------------------------------------------------------- /.yarn/cache/webpack-sources-npm-3.2.3-6bfb5d9563-989e401b9f.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/webpack-sources-npm-3.2.3-6bfb5d9563-989e401b9f.zip -------------------------------------------------------------------------------- /.yarn/cache/whatwg-encoding-npm-2.0.0-d7451f51b4-7087810c41.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/whatwg-encoding-npm-2.0.0-d7451f51b4-7087810c41.zip -------------------------------------------------------------------------------- /.yarn/cache/whatwg-mimetype-npm-3.0.0-5b617710c1-ce08bbb36b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/whatwg-mimetype-npm-3.0.0-5b617710c1-ce08bbb36b.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-code-frame-npm-7.21.4-5db83e65be-e5390e6ec1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-code-frame-npm-7.21.4-5db83e65be-e5390e6ec1.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-generator-npm-7.21.4-4ab6c9c2f0-9ffbb526a5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-generator-npm-7.21.4-4ab6c9c2f0-9ffbb526a5.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-highlight-npm-7.18.6-9d35ad2e27-92d8ee6154.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-highlight-npm-7.18.6-9d35ad2e27-92d8ee6154.zip -------------------------------------------------------------------------------- /.yarn/cache/@npmcli-move-file-npm-2.0.1-b593d8f741-52dc02259d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@npmcli-move-file-npm-2.0.1-b593d8f741-52dc02259d.zip -------------------------------------------------------------------------------- /.yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip -------------------------------------------------------------------------------- /.yarn/cache/chrome-trace-event-npm-1.0.3-e0ae3dcd60-cb8b1fc7e8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/chrome-trace-event-npm-1.0.3-e0ae3dcd60-cb8b1fc7e8.zip -------------------------------------------------------------------------------- /.yarn/cache/enhanced-resolve-npm-5.12.0-c291ce4ee3-bf3f787fac.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/enhanced-resolve-npm-5.12.0-c291ce4ee3-bf3f787fac.zip -------------------------------------------------------------------------------- /.yarn/cache/https-proxy-agent-npm-5.0.1-42d65f358e-571fccdf38.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/https-proxy-agent-npm-5.0.1-42d65f358e-571fccdf38.zip -------------------------------------------------------------------------------- /.yarn/cache/make-fetch-happen-npm-10.2.1-f1cc7cd2df-2332eb9a8e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/make-fetch-happen-npm-10.2.1-f1cc7cd2df-2332eb9a8e.zip -------------------------------------------------------------------------------- /.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip -------------------------------------------------------------------------------- /.yarn/cache/socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip -------------------------------------------------------------------------------- /.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip -------------------------------------------------------------------------------- /.yarn/cache/w3c-xmlserializer-npm-4.0.0-f09d0ec3fc-eba070e78d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/w3c-xmlserializer-npm-4.0.0-f09d0ec3fc-eba070e78d.zip -------------------------------------------------------------------------------- /.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-c92a0a6ab9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-c92a0a6ab9.zip -------------------------------------------------------------------------------- /.yarn/cache/webidl-conversions-npm-7.0.0-e8c8e30c68-f05588567a.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/webidl-conversions-npm-7.0.0-e8c8e30c68-f05588567a.zip -------------------------------------------------------------------------------- /.yarn/cache/xml-name-validator-npm-4.0.0-0857c21729-af100b79c2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/xml-name-validator-npm-4.0.0-0857c21729-af100b79c2.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip -------------------------------------------------------------------------------- /.yarn/cache/@mapbox-node-pre-gyp-npm-1.0.10-1811160047-1a98db05d9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@mapbox-node-pre-gyp-npm-1.0.10-1811160047-1a98db05d9.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-eslint-scope-npm-3.7.4-c11d226d71-ea6a9363e9.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@types-eslint-scope-npm-3.7.4-c11d226d71-ea6a9363e9.zip -------------------------------------------------------------------------------- /.yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-527bddfe62.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@types-json-schema-npm-7.0.11-79462ae5ca-527bddfe62.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-ast-npm-1.11.1-623d3d973e-1eee1534ad.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-ast-npm-1.11.1-623d3d973e-1eee1534ad.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-utf8-npm-1.11.1-583036e767-972c5cfc76.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-utf8-npm-1.11.1-583036e767-972c5cfc76.zip -------------------------------------------------------------------------------- /.yarn/cache/caniuse-lite-npm-1.0.30001478-38123b6077-27a370dcb3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/caniuse-lite-npm-1.0.30001478-38123b6077-27a370dcb3.zip -------------------------------------------------------------------------------- /.yarn/cache/decompress-response-npm-4.2.1-abe5b4ebe4-4e783ca4df.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/decompress-response-npm-4.2.1-abe5b4ebe4-4e783ca4df.zip -------------------------------------------------------------------------------- /.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip -------------------------------------------------------------------------------- /.yarn/cache/html-encoding-sniffer-npm-3.0.0-daac3dfe41-8d806aa004.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/html-encoding-sniffer-npm-3.0.0-daac3dfe41-8d806aa004.zip -------------------------------------------------------------------------------- /.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip -------------------------------------------------------------------------------- /.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip -------------------------------------------------------------------------------- /.yarn/cache/serialize-javascript-npm-6.0.1-fac87289ed-3c4f4cb61d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/serialize-javascript-npm-6.0.1-fac87289ed-3c4f4cb61d.zip -------------------------------------------------------------------------------- /.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip -------------------------------------------------------------------------------- /.yarn/cache/terser-webpack-plugin-npm-5.3.7-4bfad49798-095e699fde.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/terser-webpack-plugin-npm-5.3.7-4bfad49798-095e699fde.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-gen-mapping-npm-0.3.3-1815eba94c-4a74944bd3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.3-1815eba94c-4a74944bd3.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-source-map-npm-0.3.3-eb138f3f67-ae13021463.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@jridgewell-source-map-npm-0.3.3-eb138f3f67-ae13021463.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-ieee754-npm-1.11.1-897eb85879-23a0ac02a5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-ieee754-npm-1.11.1-897eb85879-23a0ac02a5.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-leb128-npm-1.11.1-fd9f27673d-33ccc4ade2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-leb128-npm-1.11.1-fd9f27673d-33ccc4ade2.zip -------------------------------------------------------------------------------- /.yarn/cache/acorn-import-assertions-npm-1.8.0-e9a9d57e27-5c4cf7c850.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/acorn-import-assertions-npm-1.8.0-e9a9d57e27-5c4cf7c850.zip -------------------------------------------------------------------------------- /.yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip -------------------------------------------------------------------------------- /.yarn/cache/electron-to-chromium-npm-1.4.361-007b057a72-66b3210c9c.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/electron-to-chromium-npm-1.4.361-007b057a72-66b3210c9c.zip -------------------------------------------------------------------------------- /.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip -------------------------------------------------------------------------------- /.yarn/cache/update-browserslist-db-npm-1.0.10-676baf0b9f-12db73b4f6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/update-browserslist-db-npm-1.0.10-676baf0b9f-12db73b4f6.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-trace-mapping-npm-0.3.18-cd96571385-0572669f85.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.18-cd96571385-0572669f85.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-wasm-edit-npm-1.11.1-34565c1e92-6d7d9efaec.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-wasm-edit-npm-1.11.1-34565c1e92-6d7d9efaec.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-wasm-gen-npm-1.11.1-a6d0b4d37d-1f6921e640.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-wasm-gen-npm-1.11.1-a6d0b4d37d-1f6921e640.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-wasm-opt-npm-1.11.1-0bb73c20b9-21586883a2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-wasm-opt-npm-1.11.1-0bb73c20b9-21586883a2.zip -------------------------------------------------------------------------------- /.yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-helper-function-name-npm-7.21.0-a17ce5a05a-d63e63c3e0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-helper-function-name-npm-7.21.0-a17ce5a05a-d63e63c3e0.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-helper-string-parser-npm-7.19.4-0db110dc3a-b2f8a3920b.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-helper-string-parser-npm-7.19.4-0db110dc3a-b2f8a3920b.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.14-f5f0630788-61100637b6.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.14-f5f0630788-61100637b6.zip -------------------------------------------------------------------------------- /.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-wasm-parser-npm-1.11.1-cd49c51fdc-1521644065.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-wasm-parser-npm-1.11.1-cd49c51fdc-1521644065.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-wast-printer-npm-1.11.1-f1213430d6-f15ae4c244.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-wast-printer-npm-1.11.1-f1213430d6-f15ae4c244.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-helper-hoist-variables-npm-7.18.6-6eb061f405-fd9c35bb43.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-helper-hoist-variables-npm-7.18.6-6eb061f405-fd9c35bb43.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-helper-buffer-npm-1.11.1-6afb1ef4aa-a337ee44b4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-helper-buffer-npm-1.11.1-6afb1ef4aa-a337ee44b4.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.1-a41f7439eb-44d2905dac.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-helper-numbers-npm-1.11.1-a41f7439eb-44d2905dac.zip -------------------------------------------------------------------------------- /.yarn/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-798ed4cf33.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-798ed4cf33.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.1-b839d59053-0792813f0e.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-helper-api-error-npm-1.11.1-b839d59053-0792813f0e.zip -------------------------------------------------------------------------------- /.yarn/cache/is-potential-custom-element-name-npm-1.0.1-f352f606f8-ced7bbbb64.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/is-potential-custom-element-name-npm-1.0.1-f352f606f8-ced7bbbb64.zip -------------------------------------------------------------------------------- /Qizhidao/src/hook.js: -------------------------------------------------------------------------------- 1 | // 钩子函数,在 JSON 解析时外挂调试器 2 | var raw_parse = JSON.parse; 3 | 4 | JSON.parse = function (params) { 5 | debugger; 6 | console.info("Data to be parsed:", params); 7 | return raw_parse(params); 8 | } 9 | -------------------------------------------------------------------------------- /.yarn/cache/@babel-helper-environment-visitor-npm-7.18.9-9f5b3635a1-b25101f616.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-helper-environment-visitor-npm-7.18.9-9f5b3635a1-b25101f616.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-helper-validator-identifier-npm-7.19.1-d84f19e1dc-0eca5e86a7.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-helper-validator-identifier-npm-7.19.1-d84f19e1dc-0eca5e86a7.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.1-84f0ee4c30-eac4001131.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-helper-wasm-bytecode-npm-1.11.1-84f0ee4c30-eac4001131.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.11.1-e4e8450b9d-617696cfe8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-helper-wasm-section-npm-1.11.1-e4e8450b9d-617696cfe8.zip -------------------------------------------------------------------------------- /.yarn/cache/@babel-helper-split-export-declaration-npm-7.18.6-53ebf8ad4c-c6d3dede53.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@babel-helper-split-export-declaration-npm-7.18.6-53ebf8ad4c-c6d3dede53.zip -------------------------------------------------------------------------------- /.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.1-f8af5c0037-b8efc6fa08.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon1573/Python-Reverse-Tutorial/HEAD/.yarn/cache/@webassemblyjs-floating-point-hex-parser-npm-1.11.1-f8af5c0037-b8efc6fa08.zip -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageManager": "yarn@3.5.0", 3 | "dependencies": { 4 | "@babel/generator": "^7.21.4", 5 | "@babel/parser": "^7.21.4", 6 | "@babel/traverse": "^7.21.4", 7 | "@babel/types": "^7.21.4", 8 | "canvas": "^2.11.0", 9 | "crypto-js": "^4.1.1", 10 | "jsdom": "^21.1.1", 11 | "webpack": "^5.79.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Youdao_Fanyi/src/encrypt.js: -------------------------------------------------------------------------------- 1 | // 引入依赖项 2 | const hacker = require("./snippets"); 3 | 4 | // 加密密钥 5 | const l = "fanyideskweb" 6 | , d = "webfanyi" 7 | , c = hacker.n(hacker("1c46")) 8 | , m = "fsdsogkndfokasodnaso"; 9 | 10 | // 加密函数 11 | function g(e) { 12 | return c.a.createHash("md5").update(e.toString()).digest("hex"); 13 | } 14 | 15 | function v(e, t) { 16 | return g(`client=${l}&mysticTime=${e}&product=${d}&key=${t}`); 17 | } 18 | 19 | function encrypt(t) { 20 | return v(t, m); 21 | } 22 | -------------------------------------------------------------------------------- /Day1/src/README.md: -------------------------------------------------------------------------------- 1 | # 第1天 2 | 3 | ## 工具地址 4 | 5 | - [Convert curl commands to code](https://curlconverter.com/) 6 | 7 | ## 课堂示范案例 8 | 9 | - [行行查 | 行业研究数据库](https://www.hanghangcha.com/products-local) 10 | - [最新赛道 - 烯牛数据](https://www.xiniudata.com/industry/newest?from=data) 11 | - [用户登录 - 东方国信内控平台](https://oa.bonc.com.cn/) 12 | - [用户登录 - 快乐学堂](http://www.91118.com/Passport/Account/Login) 13 | 14 | ## 课后作业 15 | 16 | - [x] [首页 - 幻藏艺术平台](https://huancang.art/#/) 请求头字段加密 17 | - [ ] [全国建筑市场监管公共服务平台](https://jzsc.mohurd.gov.cn/data/company) 数据解密 18 | -------------------------------------------------------------------------------- /Day1/src/Homework_02/main.js: -------------------------------------------------------------------------------- 1 | const Crypto = require("crypto-js"); 2 | const fs = require('fs'); 3 | 4 | const path = fs.realpathSync((__dirname + "/response.txt")); 5 | const data = fs.readFileSync(path, 'UTF-8'); 6 | function h(t) { 7 | const e = Crypto.enc.Hex.parse(t) 8 | , n = Crypto.enc.Base64.stringify(e) 9 | , m = Crypto.enc.Utf8.parse("0123456789ABCDEF") 10 | , f = Crypto.enc.Utf8.parse("jo8j9wGw%6HbxfFn") 11 | , a = Crypto.AES.decrypt(n, f, { 12 | iv: m, 13 | mode: Crypto.mode.CBC, 14 | padding: Crypto.pad.Pkcs7 15 | }) 16 | , r = a.toString(Crypto.enc.Utf8); 17 | return r.toString() 18 | } 19 | console.log(h(data)) 20 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "day01" 3 | version = "1.0.0" 4 | description = "图灵教育Python爬虫实战课-第1天" 5 | authors = ["Dragon1573 <49941141+Dragon1573@users.noreply.github.com>"] 6 | license = "MIT" 7 | readme = "README.md" 8 | 9 | [tool.poetry.dependencies] 10 | python = ">=3.10,<3.11" 11 | pyexecjs = "^1.5.1" 12 | requests = "^2.28.2" 13 | types-requests = "^2.28.11.15" 14 | httpx = "^0.23.3" 15 | pycryptodome = "^3.17" 16 | pandas = "^1.5.3" 17 | jsonpath = "^0.82" 18 | openpyxl = "^3.1.2" 19 | types-openpyxl = "^3.1.0.0" 20 | 21 | 22 | [tool.poetry.group.dev.dependencies] 23 | flake8 = "^6.0.0" 24 | black = "^23.1.0" 25 | isort = "^5.12.0" 26 | mypy = "^1.1.1" 27 | 28 | 29 | [[tool.poetry.source]] 30 | name = "bfsu" 31 | url = "https://mirrors.bfsu.edu.cn/pypi/web/simple" 32 | default = true 33 | secondary = false 34 | 35 | [build-system] 36 | requires = ["poetry-core"] 37 | build-backend = "poetry.core.masonry.api" 38 | -------------------------------------------------------------------------------- /Youdao_Fanyi/src/decrypt.js: -------------------------------------------------------------------------------- 1 | // 引入依赖项 2 | const hacker = require("./snippets"); 3 | 4 | // 构造解密器 5 | const a = hacker("1c46"), 6 | c = hacker.n(a), 7 | e = hacker("b639"), 8 | f = x => { 9 | return c.a.createHash("md5").update(x).digest() 10 | }; 11 | 12 | // 解密函数 13 | function z(t, o, n) { 14 | if (!t) 15 | return null; 16 | // 对密钥进行编码 17 | const a = e.Buffer.alloc(16, f(o)) 18 | , i = e.Buffer.alloc(16, f(n)) 19 | // 构造解密器 20 | , r = c.a.createDecipheriv("aes-128-cbc", a, i); 21 | // 提交密文,执行解密 22 | let s = r.update(t, "base64", "utf-8"); 23 | // 执行解码 24 | return s += r.final("utf-8"), 25 | s 26 | } 27 | 28 | // 用于执行解密的密钥 29 | const decodeKey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl", 30 | decodeIv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"; 31 | 32 | // 封装解密函数,用于 Python 调用 33 | function decrypt(response) { 34 | return z(response, decodeKey, decodeIv); 35 | } 36 | -------------------------------------------------------------------------------- /Day1/src/Homework_01/main.js: -------------------------------------------------------------------------------- 1 | // 主函数 2 | function main(A) { 3 | // 加密算法(本质是MD5) 4 | function J(r) { 5 | return require("crypto").createHash("md5").update(r).digest("hex"); 6 | } 7 | 8 | function getparam(A) { 9 | { 10 | var i = "?"; 11 | for (var e in A) 12 | i += e, 13 | i += "=", 14 | i += A[e], 15 | i += "&"; 16 | return i = i.substr(0, i.length - 1) 17 | } 18 | } 19 | 20 | const Ji = "6RNRDpjjV6wZ2ssPxqeIBeSoV1ITXDdC"; 21 | 22 | let i = (new Date).getTime(), e = ""; 23 | // let i = 1679498607223, e = ""; 24 | A.data.timestamp = i.toString(); 25 | "{}" == JSON.stringify(A.data) ? e = `?key=${Ji}` : (e = getparam(A.data), e = `${e}&key=${Ji}`); 26 | e = (A.url + e).toLowerCase(); 27 | console.log(e); 28 | 29 | return { 30 | "x-token": J(e), 31 | "signature": J(J("7Tv7LrinK2bsNAi9TF2uui3ZIcoxK1WT")), 32 | "params": A.data, 33 | "e": e 34 | } 35 | } 36 | 37 | console.log(main({ 38 | data: { 39 | "flag": "top", 40 | "page": "1", 41 | "per_page": "9", 42 | }, 43 | url: "api/product/getProductSearch" 44 | })) 45 | -------------------------------------------------------------------------------- /Qizhidao/src/decrypt.js: -------------------------------------------------------------------------------- 1 | const crypto = require("crypto-js"); 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | 5 | // 密钥对象 6 | const o = { 7 | 1: "xc46VoB49X3PGYAg", 8 | 2: "KE3pb84wxqLTZEG3", 9 | 3: "18Lw0OEaBBUwHYNT", 10 | 4: "jxxWWIzvkqEQcZrd", 11 | 5: "40w42rjLEXxYhxRn", 12 | 6: "K6hkD03WNW8N1fPM", 13 | 7: "I8V3IwIhrwNbWxqz", 14 | 8: "3JNNbxAP4zi5oSGA", 15 | 9: "7pUuESQl8aRTFFKK", 16 | 10: "KB4GAHN6M5soB3WV" 17 | }; 18 | 19 | // 解密函数 20 | function decrypt(e, t) { 21 | return function (e, t) { 22 | var n = crypto.enc.Utf8.parse(t || "46cc793c53dc451b") 23 | , i = crypto.AES.decrypt(e, n, { 24 | mode: crypto.mode.ECB, 25 | padding: crypto.pad.Pkcs7 26 | }); 27 | return crypto.enc.Utf8.stringify(i).toString() 28 | }(e, o[t]); 29 | } 30 | 31 | // 密文太长了,我们从保存的文件里面引入 32 | fs.realpath(process.argv[2], (err, path) => { 33 | if (err) { 34 | throw err; 35 | } 36 | fs.readFile(path, "utf-8", (err, data) => { 37 | if (err) { 38 | throw err; 39 | } 40 | const obj = JSON.parse(data) 41 | , response = decrypt(obj.data1, obj.hasUse); 42 | console.info(response) 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /Day2/src/Demo_01/demo1.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | // [_0x157208(_0x239f73._0x1b734a) + '\x72\x75\x63\x74\x6f' + '\x72'](_0x157208(0xc4) + '\x67\x67\x65\x72')['\x63\x61\x6c\x6c'](_0x157208(_0x239f73._0x3c20b7) + '\x6e') : function() { 5 | // return ![]; 6 | // } 7 | // 8 | // // 构造器 debugger方法 9 | // constructor.debugger.call(_0x157208(_0x239f73._0x3c20b7) + '\x6e'): function () { 10 | // return ; // 内存 返回 内存写入东西 11 | // } 12 | // 13 | // var aaa = Function.prototype.constructor 14 | // Function.prototype.constructor = function(x) { 15 | // // 没有出现debugger 状态 16 | // if (X != "debugger") { 17 | // return AAA(x) 18 | // } 19 | // // 出现debugger 返回改为空 20 | // ;return function() {} 21 | // ; 22 | // } 23 | 24 | // open 25 | // 26 | // setcookie 27 | // 28 | // setRequestHeader 29 | 30 | 31 | // XMLHttpRequest.prototype.setRequestHeader 32 | // XMLHttpRequest.prototype.setRequestHeader = function (x) { 33 | // if xxx === ('hexin-v'): 34 | // debugger 35 | // } 36 | 37 | 38 | (function () { 39 | // 头部参数 请求对象当中的 设置请求头部参数 40 | var org = window.XMLHttpRequest.prototype.setRequestHeader; 41 | window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) { 42 | // 关键字 在请求当中发现有键是hexin-v 断点 43 | if (key == 'hexin-v') { 44 | debugger; 45 | } 46 | return org(key, value); 47 | }; 48 | })(); 49 | 50 | 51 | var org = window.XMLHttpRequest.prototype.setRequestHeader; 52 | window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) { 53 | // 关键字 在请求当中发现有键是hexin-v 断点 54 | if (key == 'hexin-v') { 55 | debugger; 56 | } 57 | return org(key, value); 58 | } 59 | -------------------------------------------------------------------------------- /Day1/src/Homework_01/main.py: -------------------------------------------------------------------------------- 1 | from json import dumps 2 | from execjs import compile 3 | from os.path import join, dirname 4 | import httpx 5 | import asyncio 6 | from urllib3.util import parse_url 7 | 8 | endpoint = "https://api.huancang.art/api/product/getProductSearch" 9 | 10 | params = { 11 | "flag": "top", 12 | "page": "1", 13 | "per_page": "9", 14 | } 15 | 16 | 17 | with open(join(dirname(__file__), "./main.js"), mode="r", encoding="UTF-8") as file: 18 | js_helper = compile(file.read()) 19 | 20 | encrypted = js_helper.call( 21 | "main", {"url": parse_url(endpoint).path[1:], "data": params} 22 | ) 23 | 24 | 25 | async def main(): 26 | headers = { 27 | "authority": "api.huancang.art", 28 | "accept": "application/json, text/plain, */*", 29 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", 30 | "cache-control": "no-cache", 31 | "content-type": "application/json;charset=UTF-8", 32 | "origin": "https://huancang.art", 33 | "pragma": "no-cache", 34 | "referer": "https://huancang.art/", 35 | "sec-ch-ua": '"Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 36 | "sec-ch-ua-mobile": "?0", 37 | "sec-ch-ua-platform": '"Windows"', 38 | "sec-fetch-dest": "empty", 39 | "sec-fetch-mode": "cors", 40 | "sec-fetch-site": "same-site", 41 | "signature": encrypted["signature"], 42 | "token": "null", 43 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44", 44 | "x-token": encrypted["x-token"], 45 | } 46 | 47 | async with httpx.AsyncClient() as client: 48 | response = await client.get( 49 | endpoint, 50 | params=encrypted["params"], 51 | headers=headers, 52 | ) 53 | print(dumps(response.json(), ensure_ascii=False)) 54 | 55 | 56 | asyncio.run(main()) 57 | -------------------------------------------------------------------------------- /Qichacha/README.md: -------------------------------------------------------------------------------- 1 | # 企查查逆向分析教程 2 | 3 | > **【注意】** 4 | > 5 | > 视频教程讲解内容补全,使用 `yarn node` 命令执行 JavaScript 脚本过程中会遇到变量未定义的情况。后续内容已无法复现! 6 | 7 | - [入口链接](https://www.qcc.com/firm/5dffb644394922f9073544a08f38be9f.html) 8 | - [接口地址](https://www.qcc.com/api/datalist/mainmember?keyNo=5dffb644394922f9073544a08f38be9f&nodeName=Employees&pageIndex=2) 9 | 10 | > 此处抓取的接口与 [视频教程](https://www.bilibili.com/video/BV1Lg4y1G7ou?p=5) 讲解的接口不同(视频那个要登录 VIP 才会实际发送请求),但请求头加密方式是类似的,可以共通。 11 | 12 | ## 分析过程 13 | 14 | 1. 访问 **入口链接** ,在快捷导航选项卡中选择 「基本信息 > 主要人员 > 工商登记」 15 | 16 | ![image-20230416222632996](./assets/image-20230416222632996.png) 17 | 18 | 2. 开启 DevTools 开发人员工具,切换到「网络 > Fetch/XHR」选项卡 19 | 20 | 3. 点击下方翻页栏,跳转至第2页,抓取到接口请求包 21 | 22 | ![image-20230416222904104](./assets/image-20230416222904104.png) 23 | 24 | 4. 确认响应为 JSON 明文格式 25 | 26 | ![image-20230416223022769](./assets/image-20230416223022769.png) 27 | 28 | 5. 检查请求头,需要重点破解一个参数加密 29 | 30 | ![image-20230416223232344](./assets/image-20230416223232344.png) 31 | 32 | 6. 搜索并定位头部加密的逻辑点 33 | 34 | - 一般的请求头设置逻辑为 `headers[key] = value` 或者 `headers.key = value` 形式 35 | - 使用 DevTools 全局搜索功能进行定位 36 | - 搜索关键词根据逻辑可以搜索 `headers[` 或者 `headers.` 37 | 38 | 经过检索可以找到下面这个函数变量 39 | 40 | ```javascript 41 | var u = function(e) { 42 | var t = e.url.replace(e.baseURL, ""), 43 | n = o.default.stringify(e.params || {}); 44 | n && (t += (-1 === t.indexOf("?") ? "?" : o.default.options.delimiter || "&") + n), 45 | t = t.toLowerCase(); 46 | var i = (0, a.default)(t, e.data), 47 | l = (0, r.default)(t, e.data, (0, s.default)()); 48 | e.headers[i] = l; // <-- 这里 49 | }; 50 | ``` 51 | 52 | 7. 下断点、重发请求,成功暂停,检查变量 `l` 的值和长度,可以确认为 SHA-512 摘要 53 | 54 | ![image-20230416224648171](./assets/image-20230416224648171.png) 55 | 56 | 8. 检查变量 `i` 的长度,与请求头中的键值对匹配 57 | 58 | ![image-20230416224857367](./assets/image-20230416224857367.png) 59 | 60 | 9. 扒取片段到 [`encrypt.js`](./src/encrypt.js) 的变量 `u` 中备用 61 | 62 | 10. 在控制台输入 `a.default` ,跳转并扒取代码片段(变量 `s` )备用 63 | 64 | -------------------------------------------------------------------------------- /Day1/src/Demo_01/demo1.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : HeLaoshi 3 | # @File : demo1.py 4 | # @Project : PythonReversePath 5 | import requests 6 | import execjs 7 | 8 | cookies = { 9 | 'btoken': 'DWXNDLCQQT8JQUWSM5RS9EDKZ91H4260', 10 | 'hy_data_2020_id': '1857c836ee362-00bac934c35899-7a575473-2073600-1857c836ee41bbb', 11 | 'hy_data_2020_js_sdk': '%7B%22distinct_id%22%3A%221857c836ee362-00bac934c35899-7a575473-2073600-1857c836ee41bbb%22%2C%22site_id%22%3A211%2C%22user_company%22%3A105%2C%22props%22%3A%7B%7D%2C%22device_id%22%3A%221857c836ee362-00bac934c35899-7a575473-2073600-1857c836ee41bbb%22%7D', 12 | 'Hm_lvt_42317524c1662a500d12d3784dbea0f8': '1678968892,1679318053,1679378341,1679396872', 13 | 'Hm_lpvt_42317524c1662a500d12d3784dbea0f8': '1679396872', 14 | } 15 | 16 | headers = { 17 | 'authority': 'www.xiniudata.com', 18 | 'accept': 'application/json', 19 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', 20 | 'cache-control': 'no-cache', 21 | 'content-type': 'application/json', 22 | # 'cookie': 'btoken=DWXNDLCQQT8JQUWSM5RS9EDKZ91H4260; hy_data_2020_id=1857c836ee362-00bac934c35899-7a575473-2073600-1857c836ee41bbb; hy_data_2020_js_sdk=%7B%22distinct_id%22%3A%221857c836ee362-00bac934c35899-7a575473-2073600-1857c836ee41bbb%22%2C%22site_id%22%3A211%2C%22user_company%22%3A105%2C%22props%22%3A%7B%7D%2C%22device_id%22%3A%221857c836ee362-00bac934c35899-7a575473-2073600-1857c836ee41bbb%22%7D; Hm_lvt_42317524c1662a500d12d3784dbea0f8=1678968892,1679318053,1679378341,1679396872; Hm_lpvt_42317524c1662a500d12d3784dbea0f8=1679396872', 23 | 'origin': 'https://www.xiniudata.com', 24 | 'pragma': 'no-cache', 25 | 'referer': 'https://www.xiniudata.com/industry/newest?from=data', 26 | 'sec-ch-ua': '"Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 27 | 'sec-ch-ua-mobile': '?0', 28 | 'sec-ch-ua-platform': '"Windows"', 29 | 'sec-fetch-dest': 'empty', 30 | 'sec-fetch-mode': 'cors', 31 | 'sec-fetch-site': 'same-origin', 32 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44', 33 | } 34 | 35 | with open('demo1.js', 'r', encoding='utf-8') as f: 36 | js_code = f.read() 37 | 38 | ctx = execjs.compile(js_code) 39 | result = ctx.call('main123', 140) 40 | 41 | json_data = { 42 | 'payload': result['payload'], 43 | 'sig': result['sig'], 44 | 'v': 1, 45 | } 46 | 47 | response = requests.post( 48 | 'https://www.xiniudata.com/api2/service/x_service/person_industry_list/list_industries_by_sort', # 服务器数据地址 49 | cookies=cookies, 50 | headers=headers, 51 | json=json_data, 52 | ).json()['d'] 53 | # print(response) 54 | 55 | Decrypt = ctx.call('decryptData', response) # json 键提取对应的值 56 | print(Decrypt) 57 | -------------------------------------------------------------------------------- /Day2/src/Demo_02/main.py: -------------------------------------------------------------------------------- 1 | import json 2 | import execjs 3 | import requests 4 | from os.path import join, dirname 5 | 6 | # cookies = { 7 | # # "other_uid": "Ths_iwencai_Xuangu_24xkryrgnv3n7zyqf5gie2lf3lz3znnq", 8 | # # "ta_random_userid": "yioc8kuhzb", 9 | # # "cid": "fff10a2ad2aaade00dccd86e17c09c2a1679580464", 10 | # # "v": "Ayn7MDi9aUSs-lXwZkuoj2gwON6G9hx5h-lBvMsbp2pPt0cAE0Yt-Bc6UYNY", 11 | # } 12 | 13 | with open(join(dirname(__file__), "./main.js"), mode="r", encoding="UTF-8") as file: 14 | js_code = file.read() 15 | 16 | js_obj = execjs.compile(js_code) 17 | 18 | headers = { 19 | "Accept": "application/json, text/plain, */*", 20 | "Accept-Language": "zh-CN,zh;q=0.9", 21 | "Cache-Control": "no-cache", 22 | "Content-Type": "application/json", 23 | # 'Cookie': 'other_uid=Ths_iwencai_Xuangu_24xkryrgnv3n7zyqf5gie2lf3lz3znnq; ta_random_userid=yioc8kuhzb; cid=fff10a2ad2aaade00dccd86e17c09c2a1679580464; v=Ayn7MDi9aUSs-lXwZkuoj2gwON6G9hx5h-lBvMsbp2pPt0cAE0Yt-Bc6UYNY', 24 | "Origin": "http://www.iwencai.com", 25 | "Pragma": "no-cache", 26 | "Proxy-Connection": "keep-alive", 27 | "Referer": "http://www.iwencai.com/unifiedwap/result?w=%E8%85%BE%E8%AE%AF&querytype=stock&addSign=1679580549408", 28 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44", 29 | # 固定可用,需要破解加密的值 30 | "hexin-v": js_obj.call("window.func_O"), 31 | } 32 | 33 | json_data = { 34 | "question": "腾讯", 35 | "perpage": 50, 36 | "page": 1, 37 | "secondary_intent": "stock", 38 | "log_info": '{"input_type":"typewrite"}', 39 | "source": "Ths_iwencai_Xuangu", 40 | "version": "2.0", 41 | "query_area": "", 42 | "block_list": "", 43 | "add_info": '{"urp":{"scene":1,"company":1,"business":1},"contentType":"json","searchInfo":true}', 44 | "rsh": "Ths_iwencai_Xuangu_24xkryrgnv3n7zyqf5gie2lf3lz3znnq", 45 | } 46 | 47 | response = requests.post( 48 | "http://www.iwencai.com/customized/chart/get-robot-data", 49 | # cookies=cookies, 50 | headers=headers, 51 | json=json_data, 52 | verify=False, 53 | ) 54 | 55 | # Note: json_data will not be serialized by requests 56 | # exactly as it was in the original request. 57 | # data = '{"question":"腾讯","perpage":50,"page":1,"secondary_intent":"stock","log_info":"{\\"input_type\\":\\"typewrite\\"}","source":"Ths_iwencai_Xuangu","version":"2.0","query_area":"","block_list":"","add_info":"{\\"urp\\":{\\"scene\\":1,\\"company\\":1,\\"business\\":1},\\"contentType\\":\\"json\\",\\"searchInfo\\":true}","rsh":"Ths_iwencai_Xuangu_24xkryrgnv3n7zyqf5gie2lf3lz3znnq"}'.encode() 58 | # response = requests.post( 59 | # 'http://www.iwencai.com/customized/chart/get-robot-data', 60 | # cookies=cookies, 61 | # headers=headers, 62 | # data=data, 63 | # verify=False, 64 | # ) 65 | 66 | print(json.dumps(response.json())) 67 | -------------------------------------------------------------------------------- /Day4/src/Bilibili_Popular.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from jsonpath import jsonpath 3 | import pandas 4 | from os.path import dirname, join 5 | 6 | headers = { 7 | "authority": "api.bilibili.com", 8 | "accept": "*/*", 9 | "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", 10 | "cache-control": "no-cache", 11 | # 'cookie': 'buvid3=55854423-9034-6BD2-DC0B-09180006B4B888068infoc; b_nut=1665288388; i-wanna-go-back=-1; _uuid=7E81CFD4-10E1D-8DFF-17F10-8974B2C8E9BC88503infoc; buvid_fp_plain=undefined; DedeUserID=289561900; DedeUserID__ckMd5=72da37ac831215dc; b_ut=5; nostalgia_conf=-1; buvid4=08024425-D10F-888E-BF46-54C8AE744AEB89476-022100912-EvTeQq4ZfK5P%2FzGCMGdoRw%3D%3D; CURRENT_BLACKGAP=0; blackside_state=0; LIVE_BUVID=AUTO4016677482687964; PVID=1; rpdid=0zbfVGoLmM|rDd8bzH7|3L4|3w1OVCea; CURRENT_QUALITY=120; hit-new-style-dyn=0; hit-dyn-v2=1; header_theme_version=CLOSE; home_feed_column=5; buvid_fp=4bba45d5cd278de41af286eb87d4c1f0; fingerprint=76d142db253f9fe787302a57212bcb3e; bp_t_offset_289561900=776111658749657090; CURRENT_FNVAL=16; is-2022-channel=1; innersign=0; b_lsid=7F7FB3E8_18713B1B18D; SESSDATA=39d8e2b2%2C1695214628%2C78f10%2A31; bili_jct=f5ce229ac77a08d375c7295d3d9f8149; sid=ptkr1v7q', 12 | "origin": "https://www.bilibili.com", 13 | "pragma": "no-cache", 14 | "referer": "https://www.bilibili.com/v/popular/all/?spm_id_from=333.1007.0.0", 15 | "sec-ch-ua": '"Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 16 | "sec-ch-ua-mobile": "?0", 17 | "sec-ch-ua-platform": '"Windows"', 18 | "sec-fetch-dest": "empty", 19 | "sec-fetch-mode": "cors", 20 | "sec-fetch-site": "same-site", 21 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.51", 22 | } 23 | 24 | params = { 25 | "ps": "20", 26 | "pn": "1", 27 | } 28 | 29 | response = requests.get( 30 | "https://api.bilibili.com/x/web-interface/popular", 31 | params=params, 32 | headers=headers, 33 | ).json() 34 | 35 | dataset = pandas.DataFrame( 36 | { 37 | "视频标题": jsonpath(response, "$.data.list[*].title"), 38 | "视频分类": jsonpath(response, "$.data.list[*].tname"), 39 | "视频AV号": jsonpath(response, "$.data.list[*].aid"), 40 | "视频BV号": jsonpath(response, "$.data.list[*].bvid"), 41 | "视频描述": jsonpath(response, "$.data.list[*].desc"), 42 | "视频封面": jsonpath(response, "$.data.list[*].pic"), 43 | "作者名称": jsonpath(response, "$.data.list[*].owner.name"), 44 | "视频短链接": jsonpath(response, "$.data.list[*].short_link_v2"), 45 | "投币": jsonpath(response, "$.data.list[*].stat.coin"), 46 | "收藏": jsonpath(response, "$.data.list[*].stat.favorite"), 47 | "弹幕": jsonpath(response, "$.data.list[*].stat.danmaku"), 48 | "点赞": jsonpath(response, "$.data.list[*].stat.like"), 49 | "播放": jsonpath(response, "$.data.list[*].stat.view"), 50 | "分享": jsonpath(response, "$.data.list[*].stat.share"), 51 | } 52 | ) 53 | dataset.to_excel(join(dirname(__file__), "./dataset.xlsx")) 54 | -------------------------------------------------------------------------------- /Qizhidao/README.md: -------------------------------------------------------------------------------- 1 | # 企知道响应解密教程 2 | 3 | - [交互页面](https://www.qizhidao.com/check?searchKey=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&tagNum=1&fromRoutePage=check) 4 | - [接口链接](https://app.qizhidao.com/qzd-bff-enterprise/qzd/v1/enterprise/zhichan/enterpriseListV2) 5 | 6 | ```bash 7 | # 查看原始响应体 8 | cat ./src/response.json | jq 9 | 10 | # 执行解密 11 | yarn node ./src/decrypt.js ./src/response.json | jq 12 | ``` 13 | 14 | ## 知识点 15 | 16 | - RESTful API 的数据响应格式一般使用 JSON 17 | - 一般需要使用 `JSON.parse()` 方法将 JSON 字符串解析为对象以供调用 18 | - 可以考虑使用 Hook 方法对解析进行外挂调试 19 | 20 | ## 分析流程 21 | 22 | [![BV1Lg4y1G7ou?p=3](https://img.shields.io/badge/Bilibili-BV1Lg4y1G7ou%3Fp%3D3-blue?style=flat&logo=bilibili)](https://www.bilibili.com/video/BV1Lg4y1G7ou?p=3) 23 | 24 | 1. 刷新交互页面,并导航至翻页栏 25 | 26 | 2. 使用 [`hook.js`](./src/hook.js) 为页面添加钩子,执行翻页自动进入断点 27 | 28 | 3. 通过钩子函数传入的 `params` 参数值确认解密逻辑,`JSON.parse` 可能存在大量的调用 29 | 30 | 4. 其中,响应传入的值格式类似于 [`response.json`](./response.json) 31 | 32 | 5. 检查调用堆栈,可以确认调用 JSON 解析的逻辑 33 | 34 | > **注意**:视频教程中的所有源代码均经过了 Obfuscator 混淆加密,但本文复现过程中未见混淆加密,仅有如下样式的代码变量名压缩。 35 | 36 | ```javascript 37 | // 解析 JSON 38 | J: function(e) { 39 | if (!e || "string" != typeof e) 40 | return e; 41 | var t = null; 42 | try { 43 | t = JSON.parse(e); // <- 这里 44 | } catch (e) {} 45 | return t; 46 | } 47 | ``` 48 | 49 | ```javascript 50 | // 接受返回值 51 | var m = i.J(a); 52 | ``` 53 | 54 | 6. 继续执行,可以发现在2~3次「继续」后,传入解析的 JSON 字符串变成了明文,参考内容如 [`response_02.txt`](./response_02.txt) 55 | 56 | 7. 检查调用堆栈,可以发现如下用于解密的代码片段 57 | 58 | ```javascript 59 | fulfilled: async (e, n) => { 60 | let i = await t.getDependencies(); // <- 存储解密函数的对象在这 61 | if (!i) return; 62 | let {aesDecrypt: r} = i // <- 解密函数从这里获取 63 | , {config: o} = e 64 | , a = n.getResponseData(null == o ? void 0 : o.requestRecordId); 65 | a && a.hasUse && (a.data = JSON.parse(r(a.data1, a.hasUse)), // <- 在这里 66 | n.setResponseData(null == o ? void 0 : o.requestRecordId, a)) 67 | } 68 | ``` 69 | 70 | 8. 继续检查其中的函数 `r()` ,找到以下代码片段 71 | 72 | ```javascript 73 | function (e, t) { 74 | return function (e, t) { 75 | var n = r.a.enc.Utf8.parse(t || "46cc793c53dc451b") 76 | , i = r.a.AES.decrypt(e, n, { 77 | mode: r.a.mode.ECB, 78 | padding: r.a.pad.Pkcs7 79 | }); 80 | return r.a.enc.Utf8.stringify(i).toString() 81 | }(e, o[t]); 82 | } 83 | ``` 84 | 85 | 9. 将这一段函数提取出来,补全其中的所有变量依赖即可完成 JavaScript 逆向过程 86 | 87 | ## 实战流程 88 | 89 | [![BV1Lg4y1G7ou?p=4](https://img.shields.io/badge/Bilibili-BV1Lg4y1G7ou%3Fp%3D4-blue?style=flat&logo=bilibili)](https://www.bilibili.com/video/BV1Lg4y1G7ou?p=4) 90 | 91 | 1. 从上文分析,`r.a` 是一个标准密码学库,我们可以考虑采用 `Crypto-JS` 来取代这里的 `r.a` 92 | 2. 上文中有一个变量 `o` ,往前翻可以找到一个密钥对象变量 93 | 3. 这里的参数 `t` 是会变化的,当密文 `e` 与密钥索引 `t` 不对应时,在函数 `stringify` 阶段会出现 `Malformed UTF-8 string` 的错误,解码后的内容仍不正确,无法按照 UTF-8 编码被还原为字符串 94 | 4. 密文 `e` 和索引 `t` 都可以在解析后的 JSON 响应对象里面找到,其中密文路径为 `$.data1` ,索引 `t` 路径为 `$.hasUse` 95 | 5. 脚本 `decrypt.js` 接受一个 JSON 文件路径作为唯一参数,读取文件内容并对其执行解密 96 | 6. 可以在浏览器抓取接口后跳转到「网络 > 预览」界面,右键空白处选择「复制 object」,粘贴并保存为 JSON 文件供 `decrypt.js` 读取解密 97 | 98 | ## 后记 99 | 100 | 本实战源自 @洛哥 学员的兼职商单,原价 2K 。由于请求体中涉及多个加密参数,后追加 8K 预算完成交付。 101 | 102 | 请求头/请求体参数加密涉及内容过多,因此视频未涉及。 103 | -------------------------------------------------------------------------------- /Day1/src/Demo_01/demo1.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | 3 | var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" 4 | , _p = "W5D80NFZHAYB8EUI2T649RT2MNRMVE2O"; 5 | 6 | // 网页端扣下来js 7 | function e2(e) { 8 | if (null == (e = _u_e(e))) 9 | return null; 10 | for (var t = "", n = 0; n < e.length; n++) { 11 | var r = _p.charCodeAt(n % _p.length); 12 | t += String.fromCharCode(e.charCodeAt(n) ^ r) 13 | } 14 | return t 15 | } 16 | 17 | function _u_e(e) { 18 | if (null == e) 19 | return null; 20 | e = e.replace(/\r\n/g, "\n"); 21 | for (var t = "", n = 0; n < e.length; n++) { 22 | var r = e.charCodeAt(n); 23 | r < 128 ? t += String.fromCharCode(r) : r > 127 && r < 2048 ? (t += String.fromCharCode(r >> 6 | 192), 24 | t += String.fromCharCode(63 & r | 128)) : (t += String.fromCharCode(r >> 12 | 224), 25 | t += String.fromCharCode(r >> 6 & 63 | 128), 26 | t += String.fromCharCode(63 & r | 128)) 27 | } 28 | return t 29 | } 30 | 31 | 32 | function e1(e) { 33 | if (null == e) 34 | return null; 35 | for (var t, n, r, o, i, a, c, u = "", s = 0; s < e.length;) 36 | o = (t = e.charCodeAt(s++)) >> 2, 37 | i = (3 & t) << 4 | (n = e.charCodeAt(s++)) >> 4, 38 | a = (15 & n) << 2 | (r = e.charCodeAt(s++)) >> 6, 39 | c = 63 & r, 40 | isNaN(n) ? a = c = 64 : isNaN(r) && (c = 64), 41 | u = u + _keyStr.charAt(o) + _keyStr.charAt(i) + _keyStr.charAt(a) + _keyStr.charAt(c); 42 | return u 43 | } 44 | 45 | function sig(e) { 46 | return md5123(e + _p).toUpperCase() 47 | } 48 | 49 | 50 | function md5123(text) { 51 | md5 = crypto.createHash('md5').update(text).digest('hex'); 52 | return md5 53 | } 54 | 55 | // const hash = md5.update('your string here').digest('hex'); 56 | // console.log(hash); 57 | 58 | function main123(page) { 59 | 60 | h = {} 61 | payload = { 62 | "sort": 2, 63 | "start": page, 64 | "limit": 20 65 | } 66 | 67 | // payload 68 | // Object(c.d) 对象 69 | // Object(c.c) 70 | h['payload'] = e1(e2(JSON.stringify(payload))) 71 | , h['sig'] = sig(h['payload']); // sig 72 | 73 | return h 74 | } 75 | 76 | 77 | // 数据解密 78 | 79 | function d1(e) { 80 | var t, n, r, o, i, a, c = "", u = 0; 81 | for (e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""); u < e.length;) 82 | t = _keyStr.indexOf(e.charAt(u++)) << 2 | (o = _keyStr.indexOf(e.charAt(u++))) >> 4, 83 | n = (15 & o) << 4 | (i = _keyStr.indexOf(e.charAt(u++))) >> 2, 84 | r = (3 & i) << 6 | (a = _keyStr.indexOf(e.charAt(u++))), 85 | c += String.fromCharCode(t), 86 | 64 != i && (c += String.fromCharCode(n)), 87 | 64 != a && (c += String.fromCharCode(r)); 88 | return c 89 | } 90 | 91 | function d2(e) { 92 | for (var t = "", n = 0; n < e.length; n++) { 93 | var r = _p.charCodeAt(n % _p.length); 94 | t += String.fromCharCode(e.charCodeAt(n) ^ r) 95 | } 96 | return t = _u_d(t) 97 | } 98 | 99 | 100 | function _u_d(e) { 101 | for (var t = "", n = 0, r = 0, o = 0, i = 0; n < e.length;) 102 | (r = e.charCodeAt(n)) < 128 ? (t += String.fromCharCode(r), 103 | n++) : r > 191 && r < 224 ? (o = e.charCodeAt(n + 1), 104 | t += String.fromCharCode((31 & r) << 6 | 63 & o), 105 | n += 2) : (o = e.charCodeAt(n + 1), 106 | i = e.charCodeAt(n + 2), 107 | t += String.fromCharCode((15 & r) << 12 | (63 & o) << 6 | 63 & i), 108 | n += 3); 109 | return t 110 | } 111 | 112 | function decryptData(l) { 113 | var d = d1(l) 114 | , v = d2(d) 115 | , y = JSON.parse(v); 116 | return y 117 | } 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /Youdao_Fanyi/src/main.py: -------------------------------------------------------------------------------- 1 | from json import loads 2 | from time import time 3 | import requests 4 | import execjs 5 | import jsonpath 6 | from os.path import join, dirname 7 | import logging 8 | 9 | # 设置日志格式 10 | logging.basicConfig( 11 | format="%(asctime)s %(levelname)s %(message)s", 12 | datefmt="%Y/%m/%d %H:%M:%S", 13 | level=logging.DEBUG, 14 | ) 15 | 16 | 17 | def send(_content: str, _timestamp: int, _sign: str) -> str: 18 | """向有道翻译 API 发送请求,并获得响应 19 | 20 | API 返回的数据是经过加密的,需要在后续步骤自行解密 21 | 22 | Args: 23 | _content (str): 需要翻译的原文 24 | _timestamp (int): 时间戳 25 | _sign (str): 请求签名 26 | 27 | Returns: 28 | str: 被加密的响应体,解密后为 JSON 对象 29 | """ 30 | # 准备数据 31 | cookies = { 32 | "OUTFOX_SEARCH_USER_ID": "2059842630@10.112.57.88", 33 | "OUTFOX_SEARCH_USER_ID_NCOO": "266275969.19080633", 34 | } 35 | headers = { 36 | "Accept": "application/json, text/plain, */*", 37 | "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", 38 | "Connection": "keep-alive", 39 | "Content-Type": "application/x-www-form-urlencoded", 40 | "Origin": "https://fanyi.youdao.com", 41 | "Referer": "https://fanyi.youdao.com/", 42 | "Sec-Fetch-Dest": "empty", 43 | "Sec-Fetch-Mode": "cors", 44 | "Sec-Fetch-Site": "same-site", 45 | "User-Agent": ( 46 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " 47 | "AppleWebKit/537.36 (KHTML, like Gecko) " 48 | "Chrome/114.0.0.0 Safari/537.36 Edg/114.0.0.0" 49 | ), 50 | "sec-ch-ua": '"Not.A/Brand";v="8", "Chromium";v="114", "Microsoft Edge";v="114"', 51 | "sec-ch-ua-mobile": "?0", 52 | "sec-ch-ua-platform": '"Windows"', 53 | } 54 | data = { 55 | "i": _content, 56 | "from": "auto", 57 | "to": "", 58 | "domain": "0", 59 | "dictResult": "true", 60 | "keyid": "webfanyi", 61 | "sign": _sign, 62 | # "sign": "4b668a8d20c136ceb962838d188bcb1d", 63 | "client": "fanyideskweb", 64 | "product": "webfanyi", 65 | "appVersion": "1.0.0", 66 | "vendor": "web", 67 | "pointParam": "client,mysticTime,product", 68 | "mysticTime": str(_timestamp), 69 | "keyfrom": "fanyi.web", 70 | } 71 | 72 | # 发送请求 73 | response = requests.post( 74 | "https://dict.youdao.com/webtranslate", 75 | cookies=cookies, 76 | headers=headers, 77 | data=data, 78 | ) 79 | if response.status_code == 200: 80 | return response.text 81 | else: 82 | return "" 83 | 84 | 85 | def encrypt(_timestamp: int) -> str: 86 | """ 87 | 调用 JavaScript 脚本实现加密签名 88 | 89 | Returns: 90 | str: 签名值 91 | """ 92 | with open(join(dirname(__file__), "encrypt.js"), "r", encoding="UTF-8") as file: 93 | js_code = execjs.compile(file.read(), cwd=dirname(__file__)) 94 | return js_code.call("encrypt", _timestamp) 95 | 96 | 97 | def decrypt(_response: str) -> str: 98 | """ 99 | 调用 JavaScript 脚本实现响应解密 100 | 101 | Args: 102 | _response (str): 已被加密的原始响应体 103 | 104 | Returns: 105 | str: 解密后的译文内容 106 | """ 107 | with open(join(dirname(__file__), "decrypt.js"), "r", encoding="UTF-8") as file: 108 | js_code = execjs.compile(file.read(), cwd=dirname(__file__)) 109 | response_obj = loads(js_code.call("decrypt", _response)) 110 | values = jsonpath.jsonpath(response_obj, "$.translateResult[*][*].tgt") 111 | if values: 112 | return values[0] 113 | else: 114 | return "[错误] 未能正确获取译文!" 115 | 116 | 117 | if __name__ == "__main__": 118 | content: str = input("请输入原文:") 119 | stamp = int(time()) 120 | sign = encrypt(stamp) 121 | logging.debug(f"签名值:{sign}") 122 | encrypted_response = send(content, stamp, sign) 123 | response = decrypt(encrypted_response) 124 | print(response) 125 | -------------------------------------------------------------------------------- /Youdao_Fanyi/README.md: -------------------------------------------------------------------------------- 1 | # 有道翻译 JavaScript 逆向实战 2 | 3 | - [算法分析](https://www.bilibili.com/video/BV1Lg4y1G7ou/) 4 | - [JavaScript算法处理](https://www.bilibili.com/video/BV1Lg4y1G7ou?p=2) 5 | 6 | ## 响应解密分析过程 7 | 8 | 1. 在 [有道翻译](https://fanyi.youdao.com/index.html#/) 抓包 9 | 10 | 2. 需要被翻译的内容以 Ajax 异步请求的形式被发动到特定的 [接口](https://dict.youdao.com/webtranslate) 上,请求方式为 `POST` 11 | - 原文被封装在表单的 `i` 参数中 12 | - 请求在表单的 `sign` 参数中包含一段签名 13 | - 响应也是被加密的内容 14 | 15 | 3. 译文在控制台 Debug 输出了,位于解密后对象的 `$.translateResult[*][*].tgt` 16 | 17 | 4. 从控制台直接跳转到源代码视图(位于 `textTranslate.*.js` ),可以看到 `console.log` 字样的调试输出 18 | 19 | 5. 格式化源代码,可以发现下面这样的一段处理响应的回调函数内容。回调函数的参数 `o` 是响应返回的密文,解密得到的 `n` 是一个 JSON 字符串 20 | 21 | ```javascript 22 | o => { 23 | nn["a"].cancelLastGpt(); 24 | // 解密方法 25 | const n = nn["a"].decodeData(o, an["a"].state.text.decodeKey, an["a"].state.text.decodeIv) 26 | , a = n ? JSON.parse(n) : {}; 27 | console.log("解密后的接口数据:", a), 28 | 0 === a.code ? e.success && t(e.success)(a) : e.fail && t(e.fail)(a) 29 | } 30 | ``` 31 | 32 | 6. 在开发工具打开全局搜索,查找关键词 `decodeKey` 和 `decodeIv` ,在 `app.*.js` 里可以找到硬编码的魔法值 33 | 34 | ```javascript 35 | decodeKey: "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl", 36 | decodeIv: "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4", 37 | ``` 38 | 39 | 7. 在解密方法处打下断点并暂停,切换至控制台查询 `nn["a"].decodeData` 函数,获得函数本体源代码 40 | 41 | ```javascript 42 | (t, o, n) => { 43 | if (!t) 44 | return null; 45 | // 对密钥进行编码 46 | const a = e.alloc(16, f(o)) 47 | , i = e.alloc(16, f(n)) 48 | // 构造解密器 49 | , r = c.a.createDecipheriv("aes-128-cbc", a, i); 50 | // 提交密文,执行解密 51 | let s = r.update(t, "base64", "utf-8"); 52 | // 执行解码 53 | return s += r.final("utf-8"), 54 | s 55 | } 56 | ``` 57 | 58 | 8. 选中解密器函数 `c.a.createDecipheriv` ,跳转到函数定义点 `chunk-vendors.*.js` ,翻到文件开头有如下片段。可以确定文件是一个封包,后续抠 JavaScript 可以把整个文件整体拿下来 59 | 60 | ```javascript 61 | (window["webpackJsonp"] = window["webpackJsonp"] || []).push([["chunk-vendors"], {...}]) 62 | ``` 63 | 64 | 9. 在 `app.*.js` 中往上翻,可以找到如下片段 65 | 66 | ```javascript 67 | function(e) { 68 | var n = o("5724") 69 | , a = o("1c46") 70 | , c = o.n(a) 71 | , i = o("bc3a"); 72 | ... 73 | } 74 | ``` 75 | 76 | 以此确定其中的 `o` 是函数加载器 77 | 78 | ```javascript 79 | function s(t) { 80 | if (n[t]) 81 | return n[t].exports; 82 | var o = n[t] = { 83 | i: t, 84 | l: !1, 85 | exports: {} 86 | }; 87 | return e[t].call(o.exports, o, o.exports, s), 88 | o.l = !0, 89 | o.exports 90 | } 91 | ``` 92 | 93 | 10. 使用 [渔滒 / webpack_ast · GitCode](https://gitcode.net/zjq592767809/webpack_ast) 提供的 `webpack_mixer.js` ,将 `app.js` 加载器和 `chunk-vendors.js` 封包合并为单一文件的库 `snippets.js` ,供我们执行调用 94 | 95 | 11. 在 `main.js` 完善解密逻辑并尝试执行,发现 `snippets.js` 存在空对象引用异常,浏览器调试发现此处代码逻辑被分支控制跳过,可以直接将 `if` 片段注释掉,只保留 `else` 96 | 97 | ```javascript 98 | "9f9d": function (t, e, n) { 99 | (function (e, n) { 100 | // var r; 101 | // if (e.process && e.process.browser) r = "utf-8";else if (e.process && e.process.version) { 102 | // var i = parseInt(n.version.split(".")[0].slice(1), 10); 103 | // r = i >= 6 ? "utf-8" : "binary"; 104 | // } else 105 | r = "utf-8"; 106 | t.exports = r; 107 | }).call(this, n("c8ba"), n("4362")); 108 | } 109 | ``` 110 | 111 | 12. 再次执行,可以顺利完成响应解密 112 | 113 | ``` 114 | 15:28:54 ~/D/P/Youdao_Fanyi 1ms $ yarn node src/main.js | jq main ✱ ◼ 115 | { 116 | "code": 0, 117 | "translateResult": [ 118 | [ 119 | { 120 | "tgt": "Fsih", 121 | "src": "Fsih", 122 | "tgtPronounce": "Fsih" 123 | } 124 | ] 125 | ], 126 | "type": "id2zh-CHS" 127 | } 128 | ``` 129 | 130 | 131 | ## 全流程实战 132 | 133 | - [`encrypt.js`](./encrypt.js) 涉及请求体签名的破解,此为原创内容,暂不提供教学讲解 134 | - [`main.py`](./main.py) 为全流程逆向成功的展示,用户可以输入原文并直接获得译文输出 135 | - 输入简体中文,翻译为英文 136 | - 输入其他语言文字(包括繁体中文),翻译为简体中文 137 | -------------------------------------------------------------------------------- /Meituan/README.md: -------------------------------------------------------------------------------- 1 | # 美团外卖逆向分析教程 2 | 3 | - 视频教程: [![BV1Lg4y1G7ou?p=7](https://img.shields.io/badge/Bilibili-BV1Lg4y1G7ou%3Fp%3D7-blue?style=social&logo=bilibili)](https://www.bilibili.com/video/BV1Lg4y1G7ou?p=7) [![BV1Lg4y1G7ou?p=8](https://img.shields.io/badge/Bilibili-BV1Lg4y1G7ou%3Fp%3D8-blue?style=social&logo=bilibili)](https://www.bilibili.com/video/BV1Lg4y1G7ou?p=8) 4 | - [页面入口](https://h5.waimai.meituan.com/waimai/mindex/home) 5 | 6 | ## 分析流程 7 | 8 | ### 抓包 + 接口定位 9 | 10 | 1. 启动 DevTools 开发人员工具,刷新页面执行抓包 11 | 12 | ![image-20230418111119921](./assets/image-20230418111119921.png) 13 | 14 | 2. 搜索页面元素文本内容,快速确定 [接口地址](https://i.waimai.meituan.com/tsp/open/openh5/home/shopList) 15 | 16 | ![image-20230418111633327](./assets/image-20230418111633327.png) 17 | 18 | 3. 进一步过滤接口地址,重点关注 XHR 形式的数据包 19 | 20 | ![image-20230418112038046](./assets/image-20230418112038046.png) 21 | 22 | 4. 切换到「负载」界面,其中的 `openh5_uuid` 和 `uuid` 为反爬虫参数,需要对其执行逆向破解 23 | 24 | ![image-20230418112342266](./assets/image-20230418112342266.png) 25 | 26 | ### 逻辑点定位 27 | 28 | 1. 尝试全局搜索,在 `common_at_000846c581cf1.js` 中确认数据写入点 29 | 30 | ![image-20230418112738849](./assets/image-20230418112738849.png) 31 | 32 | 2. 注意到如下片段,两个加密参数的值完全相同 33 | 34 | ```javascript 35 | e.data.openh5_uuid = o; 36 | e.data.uuid = o; 37 | ``` 38 | 39 | 3. 在以上片段第1行添加断点,刷新页面能够正常触发断点 40 | 41 | 4. 检查变量 `o` 的值,确认其结果是否匹配 42 | 43 | ![image-20230418122319127](./assets/image-20230418122319127.png) 44 | 45 | 5. 可以发现变量 `o` 来自于上方的逻辑或运算 46 | 47 | ```javascript 48 | o = f()("iuuid") || f()("uuid") || f()("_lxsdk") 49 | ``` 50 | 51 | 6. 依次检查函数运算的值,确认数据来源 52 | 53 | ![image-20230418125929592](./assets/image-20230418125929592.png) 54 | 55 | 7. 借助控制台确认函数 `f()` 的逻辑,可以得到以下代码片段 56 | 57 | ```javascript 58 | function (e, n, r) { 59 | if (void 0 !== n && !i(n)) { 60 | if ("number" == typeof (r = o({}, t.defaults, r)).expires) { 61 | var a = r.expires 62 | , u = r.expires = new Date; 63 | u.setTime(+u + 864e5 * a) 64 | } 65 | return document.cookie = [c(e), "=", s(n), r.expires ? "; expires=" + r.expires.toUTCString() : "", r.path ? "; path=" + r.path : "", r.domain ? "; domain=" + r.domain : "", r.secure ? "; secure" : ""].join("") 66 | } 67 | for (var l, d = e ? void 0 : {}, p = document.cookie ? document.cookie.split("; ") : [], f = 0, m = p.length; f < m; f++) { 68 | var g = p[f].split("=") 69 | , h = (l = g.shift(), 70 | t.raw ? l : decodeURIComponent(l)) 71 | , b = g.join("="); 72 | if (e && e === h) { 73 | d = A(b, n); 74 | break 75 | } 76 | e || void 0 === (b = A(b)) || (d[h] = b) 77 | } 78 | return d 79 | } 80 | ``` 81 | 82 | ![image-20230418130259497](./assets/image-20230418130259497.png) 83 | 84 | 8. 注意到以上片段需要使用 `document.cookie` ,而且代码片段较长,对此片段执行逆向破解难度较高,可以向上浏览源代码人工定位变量 `f` 85 | 86 | 9. 在上面较远距离有下面这个片段 87 | 88 | ```javascript 89 | 26029: function(n, e, t) { 90 | "use strict"; 91 | // 中间部分省略 92 | var o = t(50107) 93 | // 中间部分省略 94 | , p = t(20125) 95 | , f = t.n(p) // <-- 变量声明点在这里 96 | , // 后面部分省略 97 | ``` 98 | 99 | 片段中出现的 `26029` `50107` 和 `20125` 猜测是加载器编号 100 | 101 | 10. 回到第7步的片段向上检索,可以确认此片段来自加载器 `20125` 102 | 103 | ```javascript 104 | 20125: function (e) { 105 | var n, t, r, 106 | i = function (e) {...}, 107 | o = function (e) {...}, 108 | a = /\+/g; 109 | function c(e) {...} 110 | function s(e) {...} 111 | function A(e, n) {...} 112 | // 就是下面这行的 function 113 | (t = n = function (e, n, r) {...}).defaults = {}, 114 | r = function (e, t) {...}, 115 | n.remove = r, 116 | e.exports = n 117 | } 118 | ``` 119 | 120 | 11. 以上两个步骤可以确认 JavaScript 代码使用了 Webpack 打包技术,同时导航到 `index_at_370c2b59ad46e.js` 文件顶端并折叠源代码,可以看到开头有一个庞大的函数定义 121 | 122 | ```javascript 123 | function () {...}, 124 | 17739: function(e, n, t) {...}, 125 | 50755: function(e, n, t) {...}, 126 | // 后续是一大堆的加载器编号及其函数实现 127 | ``` 128 | 129 | 12. 在步骤9代码片段的第6行添加断点,刷新页面重新启动调试,可以找到加载器的具体代码片段 130 | 131 | ```javascript 132 | function o(e) { 133 | var n = i[e]; 134 | if (void 0 !== n) 135 | return n.exports; 136 | var t = i[e] = { 137 | id: e, 138 | loaded: !1, 139 | exports: {} 140 | }; 141 | return r[e].call(t.exports, t, t.exports, o), 142 | t.loaded = !0, 143 | t.exports; 144 | } 145 | ``` 146 | 147 | ## JavaScript 代码片段提取 148 | 149 | 1. 改造加载器,参考附录内容封装一个加载器 150 | 151 | 2. 在上一章最后小节的第10步,确定使用的模块编号为 `20125` ,将它整体取出放置于模块区域 152 | 153 | 3. 同样定义自调用匿名函数作为主函数使用,完善加密逻辑,尝试执行会遇到找不到 `document` 变量的问题 154 | 155 | ![image-20230418143722340](./assets/image-20230418143722340.png) 156 | 157 | 4. `document` 环境变量来自浏览器自动暴露,加密过程中需要 `document.cookie` 获取用户浏览器的 Cookies 信息,需要逆向开发者自己补环境变量 158 | 159 | 5. 在浏览器控制台使用 `document.cookie` 获取 Cookie 值,保存到 `document` 对象中 160 | 161 | ```javascript 162 | const document = { 163 | // 把浏览器控制台输出的超长 Cookie 贴进来 164 | "cookie": "message=5LiN5Lya5ZCn77yM5LiN5Lya5ZCn77yB5LiN5Lya5pyJ5Lq65Lul5Li66L+Z5piv55yf5a6e55qEIENvb2tpZSDlhoXlrrnlkKfvvJ8=" 165 | }; 166 | ``` 167 | 168 | 6. 再次执行脚本,获得加密内容,并确认是否与浏览器请求计算的密文匹配 169 | 170 | ![image-20230418145332640](./assets/image-20230418145332640.png) 171 | 172 | ![image-20230418145408736](./assets/image-20230418145408736.png) 173 | 174 | ## 附录 175 | 176 | ### Webpack 源代码结构特征 177 | 178 | Webpack 打包后的源代码有以下近似特征 179 | 180 | ```javascript 181 | // 定义一个全局变量用于对需要的特定模块进行导出 182 | let my_export; 183 | 184 | ( 185 | function (t) { 186 | // 这个部分被称为加载器 187 | var e = {}; 188 | function i(n) { 189 | // 加载器的实际加载逻辑基本上都长这个样子 190 | if (e[n]) { 191 | return e[n].exports; 192 | } 193 | var s = e[n] = { 194 | i: n, 195 | l: !1, 196 | exports: {} 197 | }; 198 | // 注意此处的变量 t 来自参数 199 | // 在扒取加载器源代码执行逻辑拼合的过程中 200 | // 要注意自己封装的加载器函数参数名与此处对应 201 | return t[n].call(s.exports, s, s.exports, i), 202 | s.l = !0, 203 | s.exports 204 | } 205 | my_export = i; 206 | }( 207 | { 208 | // 这个部分被称为模块 209 | "module_id": function (/* 不一定需要参数 */) { 210 | // 具体的模块代码 211 | } 212 | } 213 | ) 214 | ); 215 | 216 | // 这样就可以在外部取出需要的模块 217 | console.log(my_export("module_id")); 218 | ``` 219 | 220 | -------------------------------------------------------------------------------- /Youdao_Fanyi/src/decrypt/webpack_mixer.js: -------------------------------------------------------------------------------- 1 | const parser = require("@babel/parser"); 2 | const t = require("@babel/types"); 3 | const generator = require("@babel/generator"); 4 | const traverse = require("@babel/traverse").default; 5 | const fs = require("fs"); 6 | 7 | function wtofile(path, flags, code) { 8 | var fd = fs.openSync(path,flags); 9 | fs.writeSync(fd, code); 10 | fs.closeSync(fd); 11 | } 12 | 13 | function run(loader_path, out_path, modular_path) { 14 | let js_code = fs.readFileSync(loader_path, { 15 | encoding: "utf-8" 16 | }); 17 | 18 | // 转换为AST语法树 19 | let loader_ast = parser.parse(js_code); 20 | 21 | // 获取加载器代码 22 | let loader_body; 23 | if (loader_ast.program.body[0].expression.type === 'UnaryExpression'){ 24 | loader_body = loader_ast.program.body[0].expression.argument.callee.body.body; 25 | }else{ 26 | loader_body = loader_ast.program.body[0].expression.callee.body.body; 27 | } 28 | let export_function = null; 29 | traverse(loader_ast, { 30 | FunctionDeclaration(path){ 31 | if(path.toString().includes("exports:") && export_function == null){ 32 | export_function = path.node.id.name 33 | } 34 | } 35 | }); 36 | if(export_function == null){ 37 | throw "未找到导出函数错误" 38 | } 39 | 40 | for (let i = 0; i < loader_body.length; i++){ 41 | let item = loader_body[i]; 42 | if(item.type === 'ExpressionStatement'){ 43 | if(item.expression.type === 'SequenceExpression' && item.expression.expressions[0].type === 'AssignmentExpression' && item.expression.expressions[0].left.type === 'MemberExpression' && item.expression.expressions[0].left.object.type === 'Identifier' && item.expression.expressions[0].left.object.name === export_function){ 44 | let j = item.expression.expressions.length - 1; 45 | while (j >= 0){ 46 | let item2 = item.expression.expressions[j]; 47 | if(item2.left && item2.left.type === 'MemberExpression' && ((item2.left.object.type === 'Identifier' && item2.left.object.name === export_function) || (item2.left.object.type === 'MemberExpression' && item2.left.object.object.type === 'Identifier' && item2.left.object.object.name === export_function))){ 48 | item.expression.expressions.splice(j + 1, item.expression.expressions.length - j - 1); 49 | break 50 | }else{ 51 | j--; 52 | } 53 | } 54 | loader_body.splice(i + 1, loader_body.length - i - 1); 55 | loader_body.push(t.expressionStatement(t.assignmentExpression("=", t.identifier("export_function"), t.identifier(export_function)))); 56 | } 57 | }else if(item.type === 'ReturnStatement'){ 58 | loader_body[i] = t.expressionStatement(item.argument); 59 | let j = 0; 60 | while (j < loader_body[i].expression.expressions.length){ 61 | let item2 = loader_body[i].expression.expressions[j]; 62 | if(item2.left &&item2.left.type === 'MemberExpression' && item2.left.object.type === 'Identifier' && item2.left.object.name === export_function){ 63 | j++ 64 | }else{ 65 | loader_body[i].expression.expressions.splice(j, loader_body[i].expression.expressions.length - j); 66 | break 67 | } 68 | } 69 | loader_body.push(t.expressionStatement(t.assignmentExpression("=", t.identifier("export_function"), t.identifier(export_function)))); 70 | } 71 | } 72 | 73 | // 导入加载器中的函数体 74 | let loader_arguments; 75 | if (loader_ast.program.body[0].expression.type === 'UnaryExpression'){ 76 | loader_arguments = loader_ast.program.body[0].expression.argument.arguments[0]; 77 | }else{ 78 | loader_arguments = loader_ast.program.body[0].expression.arguments[0]; 79 | } 80 | if (loader_arguments.type === 'ArrayExpression'){ 81 | let tempobjectexpression = t.objectExpression([]); 82 | loader_arguments.elements.forEach(function (item, index) { 83 | if (item && item.type === 'FunctionExpression'){ 84 | tempobjectexpression.properties.push(t.objectProperty( 85 | t.numericLiteral(index), 86 | item, 87 | false, 88 | false 89 | )); 90 | } 91 | }); 92 | loader_arguments = tempobjectexpression; 93 | } 94 | 95 | // 加载外部函数体 96 | modular_path.forEach(function (item, index) { 97 | 98 | var jscode = fs.readFileSync(item, { 99 | encoding: "utf-8" 100 | }); 101 | 102 | let modular_ast = parser.parse(jscode); 103 | modular_ast.program.body[0].expression.arguments[0].elements.forEach(function (item2, index2) { 104 | if (item2.type === 'ArrayExpression'){ 105 | item2.elements.forEach(function (item3, index3) { 106 | if (item3 && item3.type === 'FunctionExpression'){ 107 | loader_arguments.properties.push(t.objectProperty( 108 | t.numericLiteral(index3), 109 | item3, 110 | false, 111 | false 112 | )); 113 | } 114 | }); 115 | }else { 116 | item2.properties.forEach(function (item3, index3) { 117 | loader_arguments.properties.push(item3) 118 | }) 119 | } 120 | }); 121 | }); 122 | if (loader_ast.program.body[0].expression.type === 'UnaryExpression'){ 123 | loader_ast.program.body[0].expression.argument.arguments[0] = loader_arguments; 124 | }else{ 125 | loader_ast.program.body[0].expression.arguments[0] = loader_arguments; 126 | } 127 | 128 | // 申请全局导出函数 129 | loader_ast.program.body.splice(0, 0, t.variableDeclaration("var",[t.variableDeclarator(t.identifier("export_function"))])); 130 | // 导出函数 131 | loader_ast.program.body.push(t.expressionStatement(t.assignmentExpression("=", t.memberExpression(t.identifier("module"), t.identifier("exports"), false), t.identifier("export_function")))); 132 | 133 | let code = generator.default(loader_ast, { 134 | compact: false, // 压缩格式 135 | comments: false, // 注释 136 | jsescOption: { 137 | minimal: false // 转义 138 | } 139 | }).code; 140 | wtofile(out_path, 'w', code); 141 | } 142 | 143 | !function () { 144 | let loader_path, out_path; 145 | let modular_path = []; 146 | for(let i = 0; i < process.argv.length; i++){ 147 | if (process.argv[i] === '-l'){ 148 | loader_path = process.argv[i + 1]; 149 | i += 1; 150 | }else if(process.argv[i] === '-m'){ 151 | modular_path.push(process.argv[i + 1]); 152 | i += 1; 153 | }else if(process.argv[i] === '-o'){ 154 | out_path = process.argv[i + 1]; 155 | i += 1; 156 | } 157 | } 158 | if (loader_path && out_path){ 159 | run(loader_path, out_path, modular_path) 160 | } 161 | }(); 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/python,node,yarn,virtualenv 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=python,node,yarn,virtualenv 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # Snowpack dependency directory (https://snowpack.dev/) 50 | web_modules/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional stylelint cache 62 | .stylelintcache 63 | 64 | # Microbundle cache 65 | .rpt2_cache/ 66 | .rts2_cache_cjs/ 67 | .rts2_cache_es/ 68 | .rts2_cache_umd/ 69 | 70 | # Optional REPL history 71 | .node_repl_history 72 | 73 | # Output of 'npm pack' 74 | *.tgz 75 | 76 | # Yarn Integrity file 77 | .yarn-integrity 78 | 79 | # dotenv environment variable files 80 | .env 81 | .env.development.local 82 | .env.test.local 83 | .env.production.local 84 | .env.local 85 | 86 | # parcel-bundler cache (https://parceljs.org/) 87 | .cache 88 | .parcel-cache 89 | 90 | # Next.js build output 91 | .next 92 | out 93 | 94 | # Nuxt.js build / generate output 95 | .nuxt 96 | dist 97 | 98 | # Gatsby files 99 | .cache/ 100 | # Comment in the public line in if your project uses Gatsby and not Next.js 101 | # https://nextjs.org/blog/next-9-1#public-directory-support 102 | # public 103 | 104 | # vuepress build output 105 | .vuepress/dist 106 | 107 | # vuepress v2.x temp and cache directory 108 | .temp 109 | 110 | # Docusaurus cache and generated files 111 | .docusaurus 112 | 113 | # Serverless directories 114 | .serverless/ 115 | 116 | # FuseBox cache 117 | .fusebox/ 118 | 119 | # DynamoDB Local files 120 | .dynamodb/ 121 | 122 | # TernJS port file 123 | .tern-port 124 | 125 | # Stores VSCode versions used for testing VSCode extensions 126 | .vscode-test 127 | 128 | # yarn v2 129 | .yarn/cache 130 | .yarn/unplugged 131 | .yarn/build-state.yml 132 | .yarn/install-state.gz 133 | .pnp.* 134 | 135 | ### Node Patch ### 136 | # Serverless Webpack directories 137 | .webpack/ 138 | 139 | # Optional stylelint cache 140 | 141 | # SvelteKit build / generate output 142 | .svelte-kit 143 | 144 | ### Python ### 145 | # Byte-compiled / optimized / DLL files 146 | __pycache__/ 147 | *.py[cod] 148 | *$py.class 149 | 150 | # C extensions 151 | *.so 152 | 153 | # Distribution / packaging 154 | .Python 155 | build/ 156 | develop-eggs/ 157 | dist/ 158 | downloads/ 159 | eggs/ 160 | .eggs/ 161 | lib/ 162 | lib64/ 163 | parts/ 164 | sdist/ 165 | var/ 166 | wheels/ 167 | share/python-wheels/ 168 | *.egg-info/ 169 | .installed.cfg 170 | *.egg 171 | MANIFEST 172 | 173 | # PyInstaller 174 | # Usually these files are written by a python script from a template 175 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 176 | *.manifest 177 | *.spec 178 | 179 | # Installer logs 180 | pip-log.txt 181 | pip-delete-this-directory.txt 182 | 183 | # Unit test / coverage reports 184 | htmlcov/ 185 | .tox/ 186 | .nox/ 187 | .coverage 188 | .coverage.* 189 | nosetests.xml 190 | coverage.xml 191 | *.cover 192 | *.py,cover 193 | .hypothesis/ 194 | .pytest_cache/ 195 | cover/ 196 | 197 | # Translations 198 | *.mo 199 | *.pot 200 | 201 | # Django stuff: 202 | local_settings.py 203 | db.sqlite3 204 | db.sqlite3-journal 205 | 206 | # Flask stuff: 207 | instance/ 208 | .webassets-cache 209 | 210 | # Scrapy stuff: 211 | .scrapy 212 | 213 | # Sphinx documentation 214 | docs/_build/ 215 | 216 | # PyBuilder 217 | .pybuilder/ 218 | target/ 219 | 220 | # Jupyter Notebook 221 | .ipynb_checkpoints 222 | 223 | # IPython 224 | profile_default/ 225 | ipython_config.py 226 | 227 | # pyenv 228 | # For a library or package, you might want to ignore these files since the code is 229 | # intended to run in multiple environments; otherwise, check them in: 230 | # .python-version 231 | 232 | # pipenv 233 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 234 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 235 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 236 | # install all needed dependencies. 237 | #Pipfile.lock 238 | 239 | # poetry 240 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 241 | # This is especially recommended for binary packages to ensure reproducibility, and is more 242 | # commonly ignored for libraries. 243 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 244 | #poetry.lock 245 | 246 | # pdm 247 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 248 | #pdm.lock 249 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 250 | # in version control. 251 | # https://pdm.fming.dev/#use-with-ide 252 | .pdm.toml 253 | 254 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 255 | __pypackages__/ 256 | 257 | # Celery stuff 258 | celerybeat-schedule 259 | celerybeat.pid 260 | 261 | # SageMath parsed files 262 | *.sage.py 263 | 264 | # Environments 265 | .venv 266 | env/ 267 | venv/ 268 | ENV/ 269 | env.bak/ 270 | venv.bak/ 271 | 272 | # Spyder project settings 273 | .spyderproject 274 | .spyproject 275 | 276 | # Rope project settings 277 | .ropeproject 278 | 279 | # mkdocs documentation 280 | /site 281 | 282 | # mypy 283 | .mypy_cache/ 284 | .dmypy.json 285 | dmypy.json 286 | 287 | # Pyre type checker 288 | .pyre/ 289 | 290 | # pytype static type analyzer 291 | .pytype/ 292 | 293 | # Cython debug symbols 294 | cython_debug/ 295 | 296 | # PyCharm 297 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 298 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 299 | # and can be added to the global gitignore or merged into this file. For a more nuclear 300 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 301 | #.idea/ 302 | 303 | ### Python Patch ### 304 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 305 | poetry.toml 306 | 307 | # ruff 308 | .ruff_cache/ 309 | 310 | # LSP config files 311 | pyrightconfig.json 312 | 313 | ### VirtualEnv ### 314 | # Virtualenv 315 | # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ 316 | [Bb]in 317 | [Ii]nclude 318 | [Ll]ib 319 | [Ll]ib64 320 | [Ll]ocal 321 | [Ss]cripts 322 | pyvenv.cfg 323 | pip-selfcheck.json 324 | 325 | ### yarn ### 326 | # https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored 327 | 328 | .yarn/* 329 | !.yarn/releases 330 | !.yarn/patches 331 | !.yarn/plugins 332 | !.yarn/sdks 333 | !.yarn/versions 334 | 335 | # if you are NOT using Zero-installs, then: 336 | # comment the following lines 337 | !.yarn/cache 338 | 339 | # and uncomment the following lines 340 | # .pnp.* 341 | 342 | # End of https://www.toptal.com/developers/gitignore/api/python,node,yarn,virtualenv 343 | -------------------------------------------------------------------------------- /Day4/src/Music_Cracker.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import json 4 | import os 5 | import urllib.parse 6 | 7 | 8 | def canshu(): 9 | keys = """ 10 | 输入【a】指定页面下载,比如输入5只下载第5页数据 11 | 输入【b】下载相关页数据,比如输入5下载1-5页数据 12 | """ 13 | print(keys) 14 | 15 | 16 | def k_reqeust(url): 17 | headers = { 18 | "user-agent": ( 19 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " 20 | "AppleWebKit/537.36 (KHTML, like Gecko) " 21 | "Chrome/94.0.4606.81 Safari/537.36" 22 | ), 23 | "cookie": ( 24 | "kg_mid=09fbe19da8563f6fd444a3657c4c71f6; " 25 | "kg_dfid=0hoWuV15LpJc3XeE0j46EoR1; " 26 | "Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1633592836" 27 | ), 28 | "referer": "https://www.kugou.com/", 29 | } 30 | res = requests.get(url, headers=headers) 31 | return res 32 | 33 | 34 | def k_dowaload(items): 35 | """ 36 | 父级地址 解析歌曲 37 | https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash=4D6C21507053B174CCCE4A6A5F34AB35&dfid=dfid&mid=mid&platid=4&album_id=555030 38 | https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash=4D6C21507053B174CCCE4A6A5F34AB35&dfid=dfid&mid=mid&platid=4&album_id=555030 39 | music地址 40 | """ 41 | if isinstance(items, list): 42 | for it in items: 43 | """ 44 | FileHash 45 | AlbumID bum_id 46 | """ 47 | hash = it.get("FileHash") 48 | a_id = it.get("AlbumID") 49 | """ 50 | https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash=4D6C21507053B174CCCE4A6A5F34AB35&dfid=dfid&mid=mid 51 | 52 | https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash=71F78C6D200CDE66C2075FF8D2C42DC7&dfid=dfid&mid=mid 53 | """ 54 | # https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash=71F78C6D200CDE66C2075FF8D2C42DC7&dfid=dfid&mid=mid&platid=4 55 | music_url = "" 56 | if a_id: 57 | music_url = f"https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash={hash}&dfid=dfid&mid=mid&platid=4&album_id={a_id}" 58 | else: 59 | music_url = f"https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery&hash={hash}&dfid=dfid&mid=mid" 60 | m_res = requests.get( 61 | music_url, 62 | headers={ 63 | "user-agent": ( 64 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " 65 | "AppleWebKit/537.36 (KHTML, like Gecko) " 66 | "Chrome/94.0.4606.81 Safari/537.36" 67 | ), 68 | "cookie": ( 69 | "kg_mid=09fbe19da8563f6fd444a3657c4c71f6; " 70 | "kg_dfid=0hoWuV15LpJc3XeE0j46EoR1; " 71 | "Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1633592836" 72 | ), 73 | }, 74 | ) 75 | match_obj = re.search(r"jQuery\((.*?)\);", m_res.text) 76 | if match_obj: 77 | content = match_obj.group(1) 78 | else: 79 | raise ValueError("Regex error! Cannot find anything ...") 80 | try: 81 | con = json.loads(content) 82 | if con.get("status") == 1: 83 | item = con.get("data") 84 | m_url = item.get("play_url") 85 | title = item.get("song_name") 86 | music = requests.get(m_url) 87 | if os.path.exists("kugou") is False: 88 | os.mkdir("kugou") 89 | path = "./kugou/" + title + ".mp3" 90 | with open(path, "wb") as f: 91 | f.write(music.content) 92 | print("正在下载", title) 93 | except Exception as e: 94 | print(e, m_res.url, "有毒") 95 | continue 96 | else: 97 | exit() 98 | 99 | 100 | def KuGou(singer, num): 101 | key = urllib.parse.quote(singer) 102 | url = ( 103 | "https://songsearch.kugou.com/" 104 | + f"song_search_v2?keyword={key}&page={str(num)}" 105 | ) 106 | try: 107 | res = k_reqeust(url) 108 | res_items = res.json().get("data") 109 | page_size = res_items["pagesize"] 110 | total = res_items["total"] 111 | print(singer + f"相关歌曲共{total}首,共{page_size}页") 112 | canshu() 113 | num_key = input("请根据需求输入相关下载页面 a or b:") 114 | page_num = input("请输入下载的页码:") 115 | if int(page_num) > int(page_size): 116 | print("页面超过下限,请重新开始") 117 | exit() 118 | if not page_num.isdigit(): 119 | print("让你输入数字,你输入啥玩意?") 120 | exit() 121 | if num_key == "a": 122 | a_url = ( 123 | "https://songsearch.kugou.com/song_search_v2" 124 | + f"?keyword={key}&page={str(page_num)}" 125 | ) 126 | res1 = k_reqeust(a_url) 127 | items = res1.json().get("data")["lists"] 128 | k_dowaload(items) 129 | elif num_key == "b": 130 | for page in range(1, int(page_num) + 1): 131 | b_url = ( 132 | "https://songsearch.kugou.com/song_search_v2" 133 | + f"?keyword={key}&page={page}" 134 | ) 135 | res2 = k_reqeust(b_url) 136 | items = res2.json().get("data")["lists"] 137 | k_dowaload(items) 138 | else: 139 | print("输入错误") 140 | exit() 141 | except Exception as e: 142 | print(e) 143 | exit() 144 | 145 | 146 | def kuwo_download(items): 147 | for i in items["list"]: 148 | rid = i["rid"] 149 | name = i["name"] 150 | # https://antiserver.kuwo.cn/anti.s?type=convert_url&format=mp3&response=url&rid=228908 151 | # https://antiserver.kuwo.cn/anti.s?type=convert_url&format=mp3&response=url&rid=440613 152 | new_url = "https://antiserver.kuwo.cn/anti.s?type=convert_url&format=mp3&response=url&rid={}".format( 153 | rid 154 | ) 155 | # new_url = f"https://kuwo.cn/api/v1/www/music/playUrl?mid={rid}" 156 | # + "&type=music&httpsStatus=1&reqId=8b6a0650-36fd-11ec-970b-9d2518c9e2df" 157 | # 请求新网址 158 | try: 159 | res = requests.get(new_url) 160 | if res.status_code == 200: 161 | # 下载歌曲 最后一次请求 162 | r = requests.get(res.text).content 163 | # 路径 164 | import os 165 | 166 | if os.path.exists("music") is False: 167 | os.mkdir("music") 168 | path = os.path.join(os.getcwd(), "./music/" + name + ".mp3") 169 | # 保存 文件操作 以二进制写入 170 | with open(path, "wb") as f: 171 | f.write(r) 172 | print("正在下载", name) 173 | else: 174 | print("付费资源,请遵纪守法") 175 | continue 176 | except Exception as e: 177 | print(e) 178 | break 179 | 180 | 181 | def KuWo(singer, num): 182 | # 确定目标的网址 183 | # 目标网址 184 | url = ( 185 | "https://kuwo.cn/api/www/search/searchMusicBykeyWord" 186 | f"?key={singer}&pn={num}&rn=20&httpsStatus=1&reqId=f20168c0-1d06-11eb-91ba-83cb90e3e81e" 187 | ) 188 | # 伪装一下 请求头 189 | # https://kuwo.cn/api/www/search/searchMusicBykeyWord?key=%E5%91%A8%E6%9D%B0%E4%BC%A6&pn=1&rn=30&httpsStatus=1&reqId=08d77840-36fc-11ec-b30f-d75ca0bd3e75 190 | headers = { 191 | # 代理信息 模拟浏览器 192 | "User-Agent": ( 193 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " 194 | "AppleWebKit/537.36 (KHTML, like Gecko) " 195 | "Chrome/86.0.4240.111 Safari/537.36" 196 | ), 197 | # 令牌 钥匙 198 | "csrf": "RQW36E2YL2", 199 | # 打开哪个门 200 | "Cookie": ( 201 | "_ga=GA1.2.1608470527.1605515874; _gid=GA1.2.978722468.1613715177; " 202 | "Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1612616832,1612685393,1612786462,1613715177; " 203 | "Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1613739771; kw_token=RQW36E2YL2" 204 | ), 205 | # 域名 206 | "Host": "kuwo.cn", 207 | # 防盗链 从哪里来的 208 | "Referer": "https://kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6", 209 | } 210 | # 模拟浏览器发送请求 211 | response = requests.get(url, headers=headers) 212 | response = response.json() 213 | data = response["data"] 214 | total = data["total"] 215 | import math 216 | 217 | page_size = math.ceil(int(total) / 19) 218 | print(singer + f"相关歌曲共{total}首,共{page_size}页") 219 | canshu() 220 | num_key = input("请根据需求输入相关下载页面 a or b:") 221 | page_num = input("请输入下载的页码:") 222 | if int(page_num) > int(page_size): 223 | print("页面超过下限,请重新开始") 224 | exit() 225 | if num_key == "a": 226 | a_url = ( 227 | "https://kuwo.cn/api/www/search/searchMusicBykeyWord" 228 | f"?key={singer}&pn={page_num}&rn=20&httpsStatus=1&reqId=f20168c0-1d06-11eb-91ba-83cb90e3e81e" 229 | ) 230 | res1 = requests.get(a_url, headers=headers).json() 231 | items = res1.get("data") 232 | kuwo_download(items) 233 | 234 | elif num_key == "b": 235 | for i in range(1, int(page_num) + 1): 236 | b_url = ( 237 | "https://kuwo.cn/api/www/search/searchMusicBykeyWord?" 238 | f"key={singer}&pn={i}&rn=20&httpsStatus=1&reqId=f20168c0-1d06-11eb-91ba-83cb90e3e81e" 239 | ) 240 | res2 = requests.get(b_url, headers=headers).json() 241 | items = res2.get("data") 242 | kuwo_download(items) 243 | 244 | else: 245 | print("输入错误") 246 | exit() 247 | 248 | 249 | def run(): 250 | a = """ 251 | 1. VIP酷狗歌曲破解 252 | 2. VIP酷我歌曲破解 253 | """ 254 | print(a) 255 | num = 1 256 | singer = input("请输入歌星得名字:") 257 | select = int(input("请选择平台:")) 258 | if select == 1: 259 | KuGou(singer, num) 260 | elif select == 2: 261 | KuWo(singer, num) 262 | else: 263 | print("输入错误") 264 | exit() 265 | 266 | 267 | if __name__ == "__main__": 268 | run() 269 | -------------------------------------------------------------------------------- /Meituan/src/main.js: -------------------------------------------------------------------------------- 1 | const { readFileSync, realpathSync } = require("fs"); 2 | const { join } = require("path"); 3 | 4 | // 全局变量用于导出加载器 5 | let t; 6 | 7 | // 人工补环境,此处 Cookie 已登录,涉及重要隐私内容,以外部文件加载形式添加到此文件 8 | const document = JSON.parse(readFileSync(realpathSync(join(__dirname, "document.json")), "utf-8")); 9 | 10 | // 这是一个自运行体 11 | !( 12 | // 这个部分全都是加载器 13 | function (r) { 14 | i = {}; 15 | function o(e) { 16 | var n = i[e]; 17 | if (void 0 !== n) 18 | return n.exports; 19 | var t = i[e] = { 20 | id: e, 21 | loaded: !1, 22 | exports: {} 23 | }; 24 | // 注意此处的 r 来自函数的参数名,必须与参数名称对应 25 | return r[e].call(t.exports, t, t.exports, o), 26 | t.loaded = !0, 27 | t.exports 28 | } 29 | o.m = r, 30 | o.amdO = {}, 31 | e = [], 32 | o.O = function (n, t, r, i) { 33 | if (!t) { 34 | var a = 1 / 0; 35 | for (A = 0; A < e.length; A++) { 36 | t = e[A][0], 37 | r = e[A][1], 38 | i = e[A][2]; 39 | for (var c = !0, s = 0; s < t.length; s++) 40 | (!1 & i || a >= i) && Object.keys(o.O).every((function (e) { 41 | return o.O[e](t[s]) 42 | } 43 | )) ? t.splice(s--, 1) : (c = !1, 44 | i < a && (a = i)); 45 | c && (e.splice(A--, 1), 46 | n = r()) 47 | } 48 | return n 49 | } 50 | i = i || 0; 51 | for (var A = e.length; A > 0 && e[A - 1][2] > i; A--) 52 | e[A] = e[A - 1]; 53 | e[A] = [t, r, i] 54 | } 55 | , 56 | o.F = {}, 57 | o.E = function (e) { 58 | Object.keys(o.F).map((function (n) { 59 | o.F[n](e) 60 | } 61 | )) 62 | } 63 | , 64 | o.n = function (e) { 65 | var n = e && e.__esModule ? function () { 66 | return e.default 67 | } 68 | : function () { 69 | return e 70 | } 71 | ; 72 | return o.d(n, { 73 | a: n 74 | }), 75 | n 76 | } 77 | , 78 | o.d = function (e, n) { 79 | for (var t in n) 80 | o.o(n, t) && !o.o(e, t) && Object.defineProperty(e, t, { 81 | enumerable: !0, 82 | get: n[t] 83 | }) 84 | } 85 | , 86 | o.f = {}, 87 | o.e = function (e) { 88 | return Promise.all(Object.keys(o.f).reduce((function (n, t) { 89 | return o.f[t](e, n), 90 | n 91 | } 92 | ), [])) 93 | } 94 | , 95 | o.u = function (e) { 96 | return e + "_at_" + { 97 | "whereami-knb": "d1eb58e98338f", 98 | "whereami-weixin": "eb0fbf6b0285c", 99 | "node_modules-@dp-owl-lib-index-js": "9dad6890d025a", 100 | "node_modules-date-fns-esm-format-index-js": "59e17707443e2", 101 | "node_modules-@sfe-montage-dynamic-label-eyjpzci6odc5fq-dist-dynamic-label-umd-js": "30127fc120a0b", 102 | "static-home-components-home-page-homepage-school-jsx": "0671c91843077", 103 | home: "f870982c98898", 104 | evaluate: "7e38e64e2c142", 105 | poipicker: "dc93493ae6426", 106 | refundorder: "dbe14ade99058", 107 | refundprocess: "123234f57108f", 108 | mine: "8ca7dbc52a505", 109 | "node_modules-@babel-runtime-helpers-esm-applydecorateddescriptor-js": "2bd7e43a4203c", 110 | "node_modules-@babel-runtime-helpers-esm-get-js": "a59e39816426c", 111 | orderdetail: "2cbc210caa7f2", 112 | orderflow: "e2760d712b88c", 113 | orderedit: "c8c981d163815", 114 | "node_modules-core-js-modules-web-url-js": "0341f8288b32f", 115 | orderlist: "450a834dc0729", 116 | "node_modules-@better-scroll-core-dist-core-esm-js": "2783cc11e6268", 117 | "node_modules-react-scroll-modules-index-js": "1043f620c546f", 118 | "node_modules-recompose-dist-recompose-esm-js": "fb2f2315a763f", 119 | "node_modules-@wmfe-common_module_mobile-comp-label-index-js": "4930d0b214517", 120 | "static-home-components-menu-page-cart-container-jsx": "4e0b54165ced6", 121 | menu: "389b0eac2409f", 122 | menusearch: "754ce9603136d", 123 | "static-home-app-preview-page-style-css": "0dc4eaca15d9b", 124 | preview: "77c93136d4fe6", 125 | poipickercity: "53697a3881216", 126 | geofail: "316511a59bacc", 127 | search: "69e588b04284b", 128 | searchresult: "f6b94be540abb", 129 | addresslist: "dbcf71da060af", 130 | addaddress: "2927cbcf2c9d8", 131 | poi: "422af2a3e5922", 132 | brandlist: "20c75d994b649", 133 | couponlist: "f1f73977595d5", 134 | myfavorite: "e59b0364cb78a", 135 | schoolchannel: "00471abd491de", 136 | "static-home-app-edi-page-index-jsx": "3572a13926d30", 137 | "static-home-app-privacy-page-privacypage-jsx": "4b20ff72e6b7b", 138 | "node_modules-@dp-knb-compiled-common-log-js": "3b775d112a95f", 139 | "node_modules-@dp-knb-compiled-dpapp-index-js": "b238dbc0a6ebc", 140 | "node_modules-@dp-knb-compiled-mtnb-index-js": "f085116ec05f3", 141 | "node_modules-@dp-knb-compiled-hbnb-index-js": "b3136a6429f65", 142 | wx: "5903ceabf5e72", 143 | titans: "78af583c7c0da", 144 | dpzeus: "0b18a8b419cd7" 145 | }[e] + ".js" 146 | } 147 | , 148 | o.g = function () { 149 | if ("object" == typeof globalThis) 150 | return globalThis; 151 | try { 152 | return this || new Function("return this")() 153 | } catch (e) { 154 | if ("object" == typeof window) 155 | return window 156 | } 157 | }(), 158 | o.hmd = function (e) { 159 | return (e = Object.create(e)).children || (e.children = []), 160 | Object.defineProperty(e, "exports", { 161 | enumerable: !0, 162 | set: function () { 163 | throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: " + e.id) 164 | } 165 | }), 166 | e 167 | } 168 | , 169 | o.o = function (e, n) { 170 | return Object.prototype.hasOwnProperty.call(e, n) 171 | } 172 | , 173 | n = {}, 174 | t = "waimai_c_openh5:", 175 | o.l = function (e, r, i, a) { 176 | if (n[e]) 177 | n[e].push(r); 178 | else { 179 | var c, s; 180 | if (void 0 !== i) 181 | for (var A = document.getElementsByTagName("script"), u = 0; u < A.length; u++) { 182 | var l = A[u]; 183 | if (l.getAttribute("src") == e || l.getAttribute("data-webpack") == t + i) { 184 | c = l; 185 | break 186 | } 187 | } 188 | if (!c) { 189 | if (s = !0, 190 | i && "__thunder__" in window && __thunder__ && __thunder__.running) { 191 | a = i.slice(6), 192 | n[e] = [r]; 193 | var d = function () { 194 | var t = n[e]; 195 | delete n[e], 196 | t && t.forEach((function (n) { 197 | n({ 198 | type: "thunder", 199 | target: { 200 | src: e 201 | } 202 | }) 203 | } 204 | )) 205 | }; 206 | return Promise.all([__thunder__.styleLoader(a), __thunder__.bundleLoader(a)]).then(d).catch(d) 207 | } 208 | (c = document.createElement("script")).charset = "utf-8", 209 | c.timeout = 120, 210 | o.nc && c.setAttribute("nonce", o.nc), 211 | c.setAttribute("data-webpack", t + i), 212 | c.src = e 213 | } 214 | n[e] = [r], 215 | d = function (t, r) { 216 | c.onerror = c.onload = null, 217 | clearTimeout(p); 218 | var i = n[e]; 219 | if (delete n[e], 220 | c.parentNode && c.parentNode.removeChild(c), 221 | i && i.forEach((function (e) { 222 | return e(r) 223 | } 224 | )), 225 | t) 226 | return t(r) 227 | } 228 | ; 229 | var p = setTimeout(d.bind(null, void 0, { 230 | type: "timeout", 231 | target: c 232 | }), 12e4); 233 | c.onerror = d.bind(null, c.onerror), 234 | c.onload = d.bind(null, c.onload), 235 | s && document.head.appendChild(c) 236 | } 237 | } 238 | , 239 | o.r = function (e) { 240 | "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { 241 | value: "Module" 242 | }), 243 | Object.defineProperty(e, "__esModule", { 244 | value: !0 245 | }) 246 | } 247 | , 248 | o.nmd = function (e) { 249 | return e.paths = [], 250 | e.children || (e.children = []), 251 | e 252 | } 253 | , 254 | o.j = "index", 255 | o.p = "//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:9096d347/", 256 | function () { 257 | var e = { 258 | index: 0 259 | }; 260 | o.f.j = function (n, t) { 261 | var r = o.o(e, n) ? e[n] : void 0; 262 | if (0 !== r) 263 | if (r) 264 | t.push(r[2]); 265 | else { 266 | var i = new Promise((function (t, i) { 267 | r = e[n] = [t, i] 268 | } 269 | )); 270 | t.push(r[2] = i); 271 | var a = o.p + o.u(n) 272 | , c = new Error; 273 | o.l(a, (function (t) { 274 | if (o.o(e, n) && (0 !== (r = e[n]) && (e[n] = void 0), 275 | r)) { 276 | var i = t && ("load" === t.type ? "missing" : t.type) 277 | , a = t && t.target && t.target.src; 278 | c.message = "Loading chunk " + n + " failed.\n(" + i + ": " + a + ")", 279 | c.name = "ChunkLoadError", 280 | c.type = i, 281 | c.request = a, 282 | r[1](c) 283 | } 284 | } 285 | ), "chunk-" + n, n) 286 | } 287 | } 288 | , 289 | o.F.j = function (n) { 290 | if (!o.o(e, n) || void 0 === e[n]) { 291 | e[n] = null; 292 | var t = document.createElement("link"); 293 | o.nc && t.setAttribute("nonce", o.nc), 294 | t.rel = "prefetch", 295 | t.as = "script", 296 | t.href = o.p + o.u(n), 297 | document.head.appendChild(t) 298 | } 299 | } 300 | , 301 | o.O.j = function (n) { 302 | return 0 === e[n] 303 | } 304 | ; 305 | var n = function (n, t) { 306 | var r, i, a = t[0], c = t[1], s = t[2], A = 0; 307 | for (r in c) 308 | o.o(c, r) && (o.m[r] = c[r]); 309 | if (s) 310 | var u = s(o); 311 | for (n && n(t); A < a.length; A++) 312 | i = a[A], 313 | o.o(e, i) && e[i] && e[i][0](), 314 | e[a[A]] = 0; 315 | return o.O(u) 316 | } 317 | // 这里调用的 self 会出现异常,对其注释以实现逻辑屏蔽 318 | // , t = self.webpackChunkwaimai_c_openh5 = self.webpackChunkwaimai_c_openh5 || []; 319 | // t.forEach(n.bind(null, 0)), 320 | // t.push = n.bind(null, t.push.bind(t)) 321 | }(), 322 | o.O(0, ["index"], (function () { 323 | ["common", "node_modules-@better-scroll-core-dist-core-esm-js", "node_modules-react-scroll-modules-index-js", "node_modules-recompose-dist-recompose-esm-js", "node_modules-@wmfe-common_module_mobile-comp-label-index-js", "static-home-components-menu-page-cart-container-jsx", "menu"].map(o.E) 324 | } 325 | ), 5); 326 | 327 | // 这是片段自带的加载过程 328 | // var a = o.O(void 0, ["common", "node_modules-@babel-runtime-helpers-esm-classcallcheck-js", "node_modules-@babel-runtime-helpers-esm-getprototypeof-js", "node_modules-@babel-runtime-helpers-esm-slicedtoarray-js", "node_modules-@babel-runtime-helpers-esm-objectwithoutproperties-js", "node_modules-@babel-runtime-helpers-esm-asynctogenerator-js", "node_modules-@dp-wm-component-location-index-js", "static-cortex_modules-@cortex-zepto-dist-zepto-js"], (function () { 329 | // return o(88119) 330 | // } 331 | // )); 332 | // a = o.O(a) 333 | 334 | // 把加载器导出 335 | t = o; 336 | }( 337 | // 这个部分是以对象形式存储的模块 338 | { 339 | 20125: function (e) { 340 | var n, t, r, i = function (e) { 341 | return "[object Function]" == Object.prototype.toString.call(e) 342 | }, o = function (e) { 343 | return Array.prototype.slice.call(arguments, 1).forEach((function (n) { 344 | if (n) 345 | for (var t in n) 346 | e[t] = n[t] 347 | } 348 | )), 349 | e 350 | }, a = /\+/g; 351 | function c(e) { 352 | return t.raw ? e : encodeURIComponent(e) 353 | } 354 | function s(e) { 355 | return c(t.json ? JSON.stringify(e) : String(e)) 356 | } 357 | function A(e, n) { 358 | var r = t.raw ? e : function (e) { 359 | 0 === e.indexOf('"') && (e = e.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\")); 360 | try { 361 | return e = decodeURIComponent(e.replace(a, " ")), 362 | t.json ? JSON.parse(e) : e 363 | } catch (n) { } 364 | }(e); 365 | return i(n) ? n(r) : r 366 | } 367 | (t = n = function (e, n, r) { 368 | if (void 0 !== n && !i(n)) { 369 | if ("number" == typeof (r = o({}, t.defaults, r)).expires) { 370 | var a = r.expires 371 | , u = r.expires = new Date; 372 | u.setTime(+u + 864e5 * a) 373 | } 374 | return document.cookie = [c(e), "=", s(n), r.expires ? "; expires=" + r.expires.toUTCString() : "", r.path ? "; path=" + r.path : "", r.domain ? "; domain=" + r.domain : "", r.secure ? "; secure" : ""].join("") 375 | } 376 | for (var l, d = e ? void 0 : {}, p = document.cookie ? document.cookie.split("; ") : [], f = 0, m = p.length; f < m; f++) { 377 | var g = p[f].split("=") 378 | , h = (l = g.shift(), 379 | t.raw ? l : decodeURIComponent(l)) 380 | , b = g.join("="); 381 | if (e && e === h) { 382 | d = A(b, n); 383 | break 384 | } 385 | e || void 0 === (b = A(b)) || (d[h] = b) 386 | } 387 | return d 388 | } 389 | ).defaults = {}, 390 | r = function (e, t) { 391 | return void 0 !== n(e) && (n(e, "", o({}, t, { 392 | expires: -1 393 | })), 394 | !n(e)) 395 | } 396 | , 397 | n.remove = r, 398 | e.exports = n 399 | } 400 | } 401 | ) 402 | ); 403 | 404 | // 主函数逻辑 405 | (function () { 406 | let p = t(20125), f = t.n(p), o = f()("iuuid") || f()("uuid") || f()("_lxsdk"); 407 | console.info(o); 408 | })(); 409 | -------------------------------------------------------------------------------- /Qichacha/src/encrypt.js: -------------------------------------------------------------------------------- 1 | function get_pack() { 2 | var t = t || function (t, e) { 3 | var n = Object.create || function () { 4 | function t() { } 5 | return function (e) { 6 | var n; 7 | return t.prototype = e, 8 | n = new t, 9 | t.prototype = null, 10 | n 11 | } 12 | }() 13 | , r = {} 14 | , i = r.lib = {} 15 | , o = i.Base = { 16 | extend: function (t) { 17 | var e = n(this); 18 | return t && e.mixIn(t), 19 | e.hasOwnProperty("init") && this.init !== e.init || (e.init = function () { 20 | e.$super.init.apply(this, arguments) 21 | } 22 | ), 23 | e.init.prototype = e, 24 | e.$super = this, 25 | e 26 | }, 27 | create: function () { 28 | var t = this.extend(); 29 | return t.init.apply(t, arguments), 30 | t 31 | }, 32 | init: function () { }, 33 | mixIn: function (t) { 34 | for (var e in t) 35 | t.hasOwnProperty(e) && (this[e] = t[e]); 36 | t.hasOwnProperty("toString") && (this.toString = t.toString) 37 | }, 38 | clone: function () { 39 | return this.init.prototype.extend(this) 40 | } 41 | } 42 | , a = i.WordArray = o.extend({ 43 | init: function (t, n) { 44 | t = this.words = t || [], 45 | this.sigBytes = n != e ? n : 4 * t.length 46 | }, 47 | toString: function (t) { 48 | return (t || s).stringify(this) 49 | }, 50 | concat: function (t) { 51 | var e = this.words 52 | , n = t.words 53 | , r = this.sigBytes 54 | , i = t.sigBytes; 55 | if (this.clamp(), 56 | r % 4) 57 | for (var o = 0; o < i; o++) { 58 | var a = n[o >>> 2] >>> 24 - o % 4 * 8 & 255; 59 | e[r + o >>> 2] |= a << 24 - (r + o) % 4 * 8 60 | } 61 | else 62 | for (o = 0; o < i; o += 4) 63 | e[r + o >>> 2] = n[o >>> 2]; 64 | return this.sigBytes += i, 65 | this 66 | }, 67 | clamp: function () { 68 | var e = this.words 69 | , n = this.sigBytes; 70 | e[n >>> 2] &= 4294967295 << 32 - n % 4 * 8, 71 | e.length = t.ceil(n / 4) 72 | }, 73 | clone: function () { 74 | var t = o.clone.call(this); 75 | return t.words = this.words.slice(0), 76 | t 77 | }, 78 | random: function (e) { 79 | for (var n, r = [], i = function (e) { 80 | var n = 987654321 81 | , r = 4294967295; 82 | return function () { 83 | var i = ((n = 36969 * (65535 & n) + (n >> 16) & r) << 16) + (e = 18e3 * (65535 & e) + (e >> 16) & r) & r; 84 | return i /= 4294967296, 85 | (i += .5) * (t.random() > .5 ? 1 : -1) 86 | } 87 | }, o = 0; o < e; o += 4) { 88 | var c = i(4294967296 * (n || t.random())); 89 | n = 987654071 * c(), 90 | r.push(4294967296 * c() | 0) 91 | } 92 | return new a.init(r, e) 93 | } 94 | }) 95 | , c = r.enc = {} 96 | , s = c.Hex = { 97 | stringify: function (t) { 98 | for (var e = t.words, n = t.sigBytes, r = [], i = 0; i < n; i++) { 99 | var o = e[i >>> 2] >>> 24 - i % 4 * 8 & 255; 100 | r.push((o >>> 4).toString(16)), 101 | r.push((15 & o).toString(16)) 102 | } 103 | return r.join("") 104 | }, 105 | parse: function (t) { 106 | for (var e = t.length, n = [], r = 0; r < e; r += 2) 107 | n[r >>> 3] |= parseInt(t.substr(r, 2), 16) << 24 - r % 8 * 4; 108 | return new a.init(n, e / 2) 109 | } 110 | } 111 | , u = c.Latin1 = { 112 | stringify: function (t) { 113 | for (var e = t.words, n = t.sigBytes, r = [], i = 0; i < n; i++) { 114 | var o = e[i >>> 2] >>> 24 - i % 4 * 8 & 255; 115 | r.push(String.fromCharCode(o)) 116 | } 117 | return r.join("") 118 | }, 119 | parse: function (t) { 120 | for (var e = t.length, n = [], r = 0; r < e; r++) 121 | n[r >>> 2] |= (255 & t.charCodeAt(r)) << 24 - r % 4 * 8; 122 | return new a.init(n, e) 123 | } 124 | } 125 | , l = c.Utf8 = { 126 | stringify: function (t) { 127 | try { 128 | return decodeURIComponent(escape(u.stringify(t))) 129 | } catch (t) { 130 | throw new Error("Malformed UTF-8 data") 131 | } 132 | }, 133 | parse: function (t) { 134 | return u.parse(unescape(encodeURIComponent(t))) 135 | } 136 | } 137 | , f = i.BufferedBlockAlgorithm = o.extend({ 138 | reset: function () { 139 | this._data = new a.init, 140 | this._nDataBytes = 0 141 | }, 142 | _append: function (t) { 143 | "string" == typeof t && (t = l.parse(t)), 144 | this._data.concat(t), 145 | this._nDataBytes += t.sigBytes 146 | }, 147 | _process: function (e) { 148 | var n = this._data 149 | , r = n.words 150 | , i = n.sigBytes 151 | , o = this.blockSize 152 | , c = i / (4 * o) 153 | , s = (c = e ? t.ceil(c) : t.max((0 | c) - this._minBufferSize, 0)) * o 154 | , u = t.min(4 * s, i); 155 | if (s) { 156 | for (var l = 0; l < s; l += o) 157 | this._doProcessBlock(r, l); 158 | var f = r.splice(0, s); 159 | n.sigBytes -= u 160 | } 161 | return new a.init(f, u) 162 | }, 163 | clone: function () { 164 | var t = o.clone.call(this); 165 | return t._data = this._data.clone(), 166 | t 167 | }, 168 | _minBufferSize: 0 169 | }) 170 | , h = (i.Hasher = f.extend({ 171 | cfg: o.extend(), 172 | init: function (t) { 173 | this.cfg = this.cfg.extend(t), 174 | this.reset() 175 | }, 176 | reset: function () { 177 | f.reset.call(this), 178 | this._doReset() 179 | }, 180 | update: function (t) { 181 | return this._append(t), 182 | this._process(), 183 | this 184 | }, 185 | finalize: function (t) { 186 | return t && this._append(t), 187 | this._doFinalize() 188 | }, 189 | blockSize: 16, 190 | _createHelper: function (t) { 191 | return function (e, n) { 192 | return new t.init(n).finalize(e) 193 | } 194 | }, 195 | _createHmacHelper: function (t) { 196 | return function (e, n) { 197 | return new h.HMAC.init(t, n).finalize(e) 198 | } 199 | } 200 | }), 201 | r.algo = {}); 202 | return r 203 | }(Math); 204 | return function (e) { 205 | var n = t 206 | , r = n.lib 207 | , i = r.Base 208 | , o = r.WordArray 209 | , a = n.x64 = {}; 210 | a.Word = i.extend({ 211 | init: function (t, e) { 212 | this.high = t, 213 | this.low = e 214 | } 215 | }), 216 | a.WordArray = i.extend({ 217 | init: function (t, n) { 218 | t = this.words = t || [], 219 | this.sigBytes = n != e ? n : 8 * t.length 220 | }, 221 | toX32: function () { 222 | for (var t = this.words, e = t.length, n = [], r = 0; r < e; r++) { 223 | var i = t[r]; 224 | n.push(i.high), 225 | n.push(i.low) 226 | } 227 | return o.create(n, this.sigBytes) 228 | }, 229 | clone: function () { 230 | for (var t = i.clone.call(this), e = t.words = this.words.slice(0), n = e.length, r = 0; r < n; r++) 231 | e[r] = e[r].clone(); 232 | return t 233 | } 234 | }) 235 | }(), function () { 236 | var e = t 237 | , n = e.lib.Hasher 238 | , r = e.x64 239 | , i = r.Word 240 | , o = r.WordArray 241 | , a = e.algo; 242 | function c() { 243 | return i.create.apply(i, arguments) 244 | } 245 | var s = [c(1116352408, 3609767458), c(1899447441, 602891725), c(3049323471, 3964484399), c(3921009573, 2173295548), c(961987163, 4081628472), c(1508970993, 3053834265), c(2453635748, 2937671579), c(2870763221, 3664609560), c(3624381080, 2734883394), c(310598401, 1164996542), c(607225278, 1323610764), c(1426881987, 3590304994), c(1925078388, 4068182383), c(2162078206, 991336113), c(2614888103, 633803317), c(3248222580, 3479774868), c(3835390401, 2666613458), c(4022224774, 944711139), c(264347078, 2341262773), c(604807628, 2007800933), c(770255983, 1495990901), c(1249150122, 1856431235), c(1555081692, 3175218132), c(1996064986, 2198950837), c(2554220882, 3999719339), c(2821834349, 766784016), c(2952996808, 2566594879), c(3210313671, 3203337956), c(3336571891, 1034457026), c(3584528711, 2466948901), c(113926993, 3758326383), c(338241895, 168717936), c(666307205, 1188179964), c(773529912, 1546045734), c(1294757372, 1522805485), c(1396182291, 2643833823), c(1695183700, 2343527390), c(1986661051, 1014477480), c(2177026350, 1206759142), c(2456956037, 344077627), c(2730485921, 1290863460), c(2820302411, 3158454273), c(3259730800, 3505952657), c(3345764771, 106217008), c(3516065817, 3606008344), c(3600352804, 1432725776), c(4094571909, 1467031594), c(275423344, 851169720), c(430227734, 3100823752), c(506948616, 1363258195), c(659060556, 3750685593), c(883997877, 3785050280), c(958139571, 3318307427), c(1322822218, 3812723403), c(1537002063, 2003034995), c(1747873779, 3602036899), c(1955562222, 1575990012), c(2024104815, 1125592928), c(2227730452, 2716904306), c(2361852424, 442776044), c(2428436474, 593698344), c(2756734187, 3733110249), c(3204031479, 2999351573), c(3329325298, 3815920427), c(3391569614, 3928383900), c(3515267271, 566280711), c(3940187606, 3454069534), c(4118630271, 4000239992), c(116418474, 1914138554), c(174292421, 2731055270), c(289380356, 3203993006), c(460393269, 320620315), c(685471733, 587496836), c(852142971, 1086792851), c(1017036298, 365543100), c(1126000580, 2618297676), c(1288033470, 3409855158), c(1501505948, 4234509866), c(1607167915, 987167468), c(1816402316, 1246189591)] 246 | , u = []; 247 | !function () { 248 | for (var t = 0; t < 80; t++) 249 | u[t] = c() 250 | }(); 251 | var l = a.SHA512 = n.extend({ 252 | _doReset: function () { 253 | this._hash = new o.init([new i.init(1779033703, 4089235720), new i.init(3144134277, 2227873595), new i.init(1013904242, 4271175723), new i.init(2773480762, 1595750129), new i.init(1359893119, 2917565137), new i.init(2600822924, 725511199), new i.init(528734635, 4215389547), new i.init(1541459225, 327033209)]) 254 | }, 255 | _doProcessBlock: function (t, e) { 256 | for (var n = this._hash.words, r = n[0], i = n[1], o = n[2], a = n[3], c = n[4], l = n[5], f = n[6], h = n[7], p = r.high, d = r.low, v = i.high, y = i.low, g = o.high, m = o.low, b = a.high, _ = a.low, w = c.high, x = c.low, z = l.high, T = l.low, M = f.high, S = f.low, C = h.high, O = h.low, H = p, A = d, E = v, k = y, L = g, V = m, j = b, P = _, R = w, F = x, D = z, N = T, I = M, B = S, $ = C, U = O, W = 0; W < 80; W++) { 257 | var q = u[W]; 258 | if (W < 16) 259 | var Y = q.high = 0 | t[e + 2 * W] 260 | , X = q.low = 0 | t[e + 2 * W + 1]; 261 | else { 262 | var G = u[W - 15] 263 | , K = G.high 264 | , J = G.low 265 | , Z = (K >>> 1 | J << 31) ^ (K >>> 8 | J << 24) ^ K >>> 7 266 | , Q = (J >>> 1 | K << 31) ^ (J >>> 8 | K << 24) ^ (J >>> 7 | K << 25) 267 | , tt = u[W - 2] 268 | , et = tt.high 269 | , nt = tt.low 270 | , rt = (et >>> 19 | nt << 13) ^ (et << 3 | nt >>> 29) ^ et >>> 6 271 | , it = (nt >>> 19 | et << 13) ^ (nt << 3 | et >>> 29) ^ (nt >>> 6 | et << 26) 272 | , ot = u[W - 7] 273 | , at = ot.high 274 | , ct = ot.low 275 | , st = u[W - 16] 276 | , ut = st.high 277 | , lt = st.low; 278 | Y = (Y = (Y = Z + at + ((X = Q + ct) >>> 0 < Q >>> 0 ? 1 : 0)) + rt + ((X += it) >>> 0 < it >>> 0 ? 1 : 0)) + ut + ((X += lt) >>> 0 < lt >>> 0 ? 1 : 0), 279 | q.high = Y, 280 | q.low = X 281 | } 282 | var ft, ht = R & D ^ ~R & I, pt = F & N ^ ~F & B, dt = H & E ^ H & L ^ E & L, vt = A & k ^ A & V ^ k & V, yt = (H >>> 28 | A << 4) ^ (H << 30 | A >>> 2) ^ (H << 25 | A >>> 7), gt = (A >>> 28 | H << 4) ^ (A << 30 | H >>> 2) ^ (A << 25 | H >>> 7), mt = (R >>> 14 | F << 18) ^ (R >>> 18 | F << 14) ^ (R << 23 | F >>> 9), bt = (F >>> 14 | R << 18) ^ (F >>> 18 | R << 14) ^ (F << 23 | R >>> 9), _t = s[W], wt = _t.high, xt = _t.low, zt = $ + mt + ((ft = U + bt) >>> 0 < U >>> 0 ? 1 : 0), Tt = gt + vt; 283 | $ = I, 284 | U = B, 285 | I = D, 286 | B = N, 287 | D = R, 288 | N = F, 289 | R = j + (zt = (zt = (zt = zt + ht + ((ft += pt) >>> 0 < pt >>> 0 ? 1 : 0)) + wt + ((ft += xt) >>> 0 < xt >>> 0 ? 1 : 0)) + Y + ((ft += X) >>> 0 < X >>> 0 ? 1 : 0)) + ((F = P + ft | 0) >>> 0 < P >>> 0 ? 1 : 0) | 0, 290 | j = L, 291 | P = V, 292 | L = E, 293 | V = k, 294 | E = H, 295 | k = A, 296 | H = zt + (yt + dt + (Tt >>> 0 < gt >>> 0 ? 1 : 0)) + ((A = ft + Tt | 0) >>> 0 < ft >>> 0 ? 1 : 0) | 0 297 | } 298 | d = r.low = d + A, 299 | r.high = p + H + (d >>> 0 < A >>> 0 ? 1 : 0), 300 | y = i.low = y + k, 301 | i.high = v + E + (y >>> 0 < k >>> 0 ? 1 : 0), 302 | m = o.low = m + V, 303 | o.high = g + L + (m >>> 0 < V >>> 0 ? 1 : 0), 304 | _ = a.low = _ + P, 305 | a.high = b + j + (_ >>> 0 < P >>> 0 ? 1 : 0), 306 | x = c.low = x + F, 307 | c.high = w + R + (x >>> 0 < F >>> 0 ? 1 : 0), 308 | T = l.low = T + N, 309 | l.high = z + D + (T >>> 0 < N >>> 0 ? 1 : 0), 310 | S = f.low = S + B, 311 | f.high = M + I + (S >>> 0 < B >>> 0 ? 1 : 0), 312 | O = h.low = O + U, 313 | h.high = C + $ + (O >>> 0 < U >>> 0 ? 1 : 0) 314 | }, 315 | _doFinalize: function () { 316 | var t = this._data 317 | , e = t.words 318 | , n = 8 * this._nDataBytes 319 | , r = 8 * t.sigBytes; 320 | return e[r >>> 5] |= 128 << 24 - r % 32, 321 | e[30 + (r + 128 >>> 10 << 5)] = Math.floor(n / 4294967296), 322 | e[31 + (r + 128 >>> 10 << 5)] = n, 323 | t.sigBytes = 4 * e.length, 324 | this._process(), 325 | this._hash.toX32() 326 | }, 327 | clone: function () { 328 | var t = n.clone.call(this); 329 | return t._hash = this._hash.clone(), 330 | t 331 | }, 332 | blockSize: 32 333 | }); 334 | e.SHA512 = n._createHelper(l), 335 | e.HmacSHA512 = n._createHmacHelper(l) 336 | }(), t 337 | }; 338 | 339 | // 参数 e 是摘要明文,参数 n 是摘要盐,此处的盐是固定的 340 | // 摘要算法不可逆,因此盐必须硬编码写死 341 | function o(e, t) { 342 | return get_pack().HmacSHA512(e, t).toString(); 343 | }; 344 | 345 | var r_01 = function () { 346 | const o = { 347 | "default": { 348 | "n": 20, 349 | "codes": { 350 | "0": "W", 351 | "1": "l", 352 | "2": "k", 353 | "3": "B", 354 | "4": "Q", 355 | "5": "g", 356 | "6": "f", 357 | "7": "i", 358 | "8": "i", 359 | "9": "r", 360 | "10": "v", 361 | "11": "6", 362 | "12": "A", 363 | "13": "K", 364 | "14": "N", 365 | "15": "k", 366 | "16": "4", 367 | "17": "L", 368 | "18": "1", 369 | "19": "8" 370 | } 371 | } 372 | }; 373 | // 这一部分整体是 API 路径地址 374 | for (var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), 375 | t = e + e, n = "", i = 0; 376 | i < t.length; ++i) { 377 | // .charCodeAt() 获取字符的 Unicode 编码 378 | // o.default.n 是密钥长度,此处为 20 379 | var a = t[i].charCodeAt() % o.default.n; 380 | // o.default.codes 是一个密钥映射表,用于从中获取密钥字符进行拼接 381 | // 对象 o 已被硬编码固定 382 | n += o.default.codes[a]; 383 | } 384 | return n; 385 | }; 386 | 387 | var s_01 = function () { 388 | // arguments 是以数组形式封装的函数参数 389 | // 此处的 (void 0) 写法会产生一个 undefined 390 | var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {} 391 | , t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase() 392 | , n = JSON.stringify(e).toLowerCase(); 393 | // 此处涉及2个加密函数 394 | return o(t + n, r_01(t)).toLowerCase().substr(8, 20); 395 | }; 396 | 397 | function _default() { 398 | // var list = ["w", "i", "n", "d", "o", "w", ".", "t", "i", "d"]; 399 | // return eval(list.join("")); 400 | 401 | // 本质是 window.pid 属性值,它来自请求头的 X-Pid 参数 402 | return "98f045b7cdb9c1fc05bfdd218eccfa6b"; 403 | }; 404 | 405 | var s_02 = function () { 406 | var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {} 407 | , t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "" 408 | , n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase() 409 | , i = JSON.stringify(e).toLowerCase(); 410 | return o(n + "pathString" + i + t, r_01(n)) 411 | }; 412 | 413 | var r_02 = function (e) { 414 | return JSON.stringify(e) 415 | }; 416 | 417 | var u = function (e) { 418 | // 传入的参数 t 是请求的 API 路径,去除开头的协议/域名前缀 419 | let t = e.url.replace(e.baseURL, ""); 420 | const n = r_02(e.params || {}); 421 | // 此处 undefined 原文是 o.default.options.delimeter 422 | n && (t += (-1 === t.indexOf("?") ? "?" : undefined || "&") + n), 423 | t = t.toLowerCase(); 424 | // 原片段涉及运算优先级 (0, a.default) 写法,可以直接简化 425 | // 此处 undefined 原文是 e.data 426 | const i = s_01(t, undefined); 427 | // const l = s_02(t, undefined, _default()); 428 | 429 | console.info("加密Key:", i); 430 | // console.info("加密Value:", l); 431 | }; 432 | 433 | (function () { 434 | u({ 435 | url: "https://www.qcc.com/api/datalist/mainmember?keyNo=5dffb644394922f9073544a08f38be9f&nodeName=Employees&pageIndex=1", 436 | baseURL: "https://www.qcc.com" 437 | }) 438 | })(); 439 | --------------------------------------------------------------------------------