From 2cb854505291a9a45cb9a9ada69484128b226305 Mon Sep 17 00:00:00 2001 From: Harold <8866033@gmail.com> Date: Mon, 20 Apr 2026 12:54:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20=E9=B2=B8=E9=B1=BCAPP=20spider=20?= =?UTF-8?q?skeleton=20with=20AES=20helpers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- py/tests/test_鲸鱼APP.py | 24 ++++++++++++++++++++ py/鲸鱼APP.py | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 py/tests/test_鲸鱼APP.py create mode 100644 py/鲸鱼APP.py diff --git a/py/tests/test_鲸鱼APP.py b/py/tests/test_鲸鱼APP.py new file mode 100644 index 0000000..04b7d12 --- /dev/null +++ b/py/tests/test_鲸鱼APP.py @@ -0,0 +1,24 @@ +import unittest +from importlib.machinery import SourceFileLoader +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +MODULE = SourceFileLoader("jingyu_spider", str(ROOT / "鲸鱼APP.py")).load_module() +Spider = MODULE.Spider + + +class TestJingyuSpider(unittest.TestCase): + def setUp(self): + Spider._instance = None + self.spider = Spider() + + def test_aes_encrypt_decrypt_roundtrip(self): + plaintext = '{"key":"value"}' + encrypted = self.spider._aes_encrypt(plaintext) + decrypted = self.spider._aes_decrypt(encrypted) + self.assertEqual(decrypted, plaintext) + + def test_aes_encrypt_produces_base64(self): + import re + encrypted = self.spider._aes_encrypt("hello") + self.assertTrue(re.match(r'^[A-Za-z0-9+/=]+$', encrypted)) diff --git a/py/鲸鱼APP.py b/py/鲸鱼APP.py new file mode 100644 index 0000000..10621d3 --- /dev/null +++ b/py/鲸鱼APP.py @@ -0,0 +1,49 @@ +# coding=utf-8 +import base64 +import json +import re +import sys +import time + +from Crypto.Cipher import AES +from Crypto.Util.Padding import pad, unpad +from base.spider import Spider as BaseSpider + +sys.path.append("..") + +AES_KEY = "AAdgrdghjfgsABC1" +AES_IV = "AAdgrdghjfgsABC1" + + +class Spider(BaseSpider): + def __init__(self): + self.name = "鲸鱼APP" + self.host = "" + self.ua = "okhttp/3.10.0" + self.api_path = "/api.php/qijiappapi.index" + self.init_endpoint = "initV122" + self.search_endpoint = "searchList" + self.search_verify = False + self.init_data = None + + def getName(self): + return self.name + + def init(self, extend=""): + pass + + def _aes_encrypt(self, plaintext): + key = AES_KEY.encode("utf-8") + iv = AES_IV.encode("utf-8") + cipher = AES.new(key, AES.MODE_CBC, iv) + padded = pad(plaintext.encode("utf-8"), AES.block_size) + encrypted = cipher.encrypt(padded) + return base64.b64encode(encrypted).decode("utf-8") + + def _aes_decrypt(self, ciphertext): + key = AES_KEY.encode("utf-8") + iv = AES_IV.encode("utf-8") + raw = base64.b64decode(ciphertext) + cipher = AES.new(key, AES.MODE_CBC, iv) + decrypted = unpad(cipher.decrypt(raw), AES.block_size) + return decrypted.decode("utf-8")