From 9d77eef40df69c5508157a32c4d13ae67ec2cf40 Mon Sep 17 00:00:00 2001 From: Harold <8866033@gmail.com> Date: Sat, 18 Apr 2026 11:23:39 +0800 Subject: [PATCH] feat: finish czzy spider implementation --- py/tests/test_czzy.py | 19 +++++++++++++++++++ py/厂长资源.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/py/tests/test_czzy.py b/py/tests/test_czzy.py index d0318bc..d19d83c 100644 --- a/py/tests/test_czzy.py +++ b/py/tests/test_czzy.py @@ -200,6 +200,25 @@ class TestCZZYSpider(unittest.TestCase): "https://video.example/wp.m3u8", ) + @patch.object(Spider, "_request_html") + def test_player_content_returns_pan_link_directly(self, mock_request_html): + result = self.spider.playerContent("网盘资源", "https://www.alipan.com/s/demo", {}) + self.assertEqual(result["parse"], 0) + self.assertEqual(result["url"], "https://www.alipan.com/s/demo") + mock_request_html.assert_not_called() + + @patch.object(Spider, "_request_html") + def test_player_content_resolves_iframe_chain(self, mock_request_html): + mock_request_html.side_effect = [ + ('', "https://www.czzy89.com"), + ("var mysvg='https://media.example/final.m3u8';", "https://www.czzy89.com"), + ] + + result = self.spider.playerContent("厂长资源", "https://www.czzy89.com/v_play/1.html", {}) + self.assertEqual(result["parse"], 0) + self.assertEqual(result["url"], "https://media.example/final.m3u8") + self.assertIn("Referer", result["header"]) + if __name__ == "__main__": unittest.main() diff --git a/py/厂长资源.py b/py/厂长资源.py index 48da7b7..94e3b9f 100644 --- a/py/厂长资源.py +++ b/py/厂长资源.py @@ -275,6 +275,12 @@ class Spider(BaseSpider): return "" + def _build_player_headers(self, referer): + return { + "User-Agent": self.headers["User-Agent"], + "Referer": referer, + } + def categoryContent(self, tid, pg, filter, extend): path = self.category_paths.get(tid, self.category_paths["movie"]).format(pg=pg) html, host = self._request_html(path, expect_xpath="//a[@href]") @@ -291,3 +297,33 @@ class Spider(BaseSpider): html, host = self._request_html(path, expect_xpath="//a[@href]") items = self._parse_media_cards(html, host) return self._page_result(items, pg) + + def playerContent(self, flag, id, vipFlags): + if any(item in id for item in ["alipan.com", "aliyundrive.com", "quark"]): + return {"parse": 0, "playUrl": "", "url": id} + + detail_html, host = self._request_html(id, expect_xpath="//iframe|//script") + iframe_url = self._extract_iframe_src(detail_html, host) + referer = id if id.startswith("http") else self._normalize_url(id, host) + + if iframe_url: + iframe_html, _ = self._request_html(iframe_url, referer=referer) + final_url = self._extract_player_url_from_iframe(iframe_html) + if final_url: + return { + "parse": 0, + "playUrl": "", + "url": final_url, + "header": self._build_player_headers(iframe_url), + } + + fallback = self._extract_player_url_from_iframe(detail_html) + if fallback: + return { + "parse": 0, + "playUrl": "", + "url": fallback, + "header": self._build_player_headers(referer), + } + + return {"parse": 0, "playUrl": "", "url": ""}