feat(scripts): 添加 PEP 723 脚本元数据并修复 HTTP/2 伪头过滤问题

- 为 build_studio_urls.py 和 lookup_groups.py 添加 PEP 723 依赖声明
- 修复 HTTP/2 伪头导致 requests 抛 InvalidHeader 的问题
- 添加 CDP 端口连通性预检查及启动指引
This commit is contained in:
2026-08-27 13:33:34 +08:00
parent b8bd749f43
commit 9020752eed
23 changed files with 885 additions and 294 deletions

View File

@@ -185,6 +185,29 @@ class TestDecodeZippedData:
with zipfile.ZipFile(io.BytesIO(out)) as zf:
assert zf.read("x.csv") == b"1,2"
def test_urlsafe_nopad_variant(self, downloader):
"""真实接口返回 URL-safe-/_且无 = 填充的 base64必须与标准表等价解码。"""
data = make_zip_bytes({"表格数据.csv": "a,b\n1,2"})
std = base64.b64encode(data).decode("ascii")
urlsafe_nopad = std.replace("+", "-").replace("/", "_").rstrip("=")
assert downloader.decode_zipped_data({"zippedData": urlsafe_nopad}) == data
def test_std_and_urlsafe_agree(self, downloader):
"""同一字节流的标准/URL-safe 两种编码解出相同结果。"""
data = make_zip_bytes({"x.csv": "1,2"})
std = base64.b64encode(data).decode("ascii")
urlsafe = base64.urlsafe_b64encode(data).decode("ascii").rstrip("=")
a = downloader.decode_zipped_data({"zippedData": std})
b = downloader.decode_zipped_data({"zippedData": urlsafe})
assert a == b == data
def test_non_zip_payload_raises_pk_error(self, downloader):
"""解码结果不是 zip缺 PK 头)时报错,而非静默落盘损坏文件。"""
import base64 as b64
bogus = b64.b64encode(b"not a zip at all------").decode("ascii")
with pytest.raises(ValueError, match="PK"):
downloader.decode_zipped_data({"zippedData": bogus})
def test_missing_field_raises(self, downloader):
with pytest.raises(ValueError, match="zippedData"):
downloader.decode_zipped_data({"foo": "bar"})
@@ -195,6 +218,24 @@ class TestDecodeZippedData:
downloader.decode_zipped_data({"zippedData": empty})
# ---------------------------------------------------------------------------
# verify_zipzip 完整性校验
# ---------------------------------------------------------------------------
class TestVerifyZip:
def test_valid_zip_passes(self, downloader):
downloader.verify_zip(make_zip_bytes({"a.csv": "1,2", "b.csv": "3,4"}))
def test_truncated_zip_raises_value_error(self, downloader):
good = make_zip_bytes({"a.csv": "1,2"})
bad = good[: len(good) // 2] # 截断中央目录
with pytest.raises(ValueError):
downloader.verify_zip(bad)
def test_not_a_zip_raises(self, downloader):
with pytest.raises(ValueError):
downloader.verify_zip(b"plain text")
# ---------------------------------------------------------------------------
# intercept_and_save拦截器FakePage 模拟)
# ---------------------------------------------------------------------------