diff --git a/py/tests/test_两个BT.py b/py/tests/test_两个BT.py index 23d98c2..0dc9140 100644 --- a/py/tests/test_两个BT.py +++ b/py/tests/test_两个BT.py @@ -191,6 +191,29 @@ class TestLiangGeBTSpider(unittest.TestCase): self.assertEqual(result["url"], "https://media.example/final.mp4") self.assertEqual(result["header"]["Referer"], "https://www.bttwoo.com/v_play/play-100.html") + @patch.object(Spider, "_request_html") + def test_player_content_extracts_media_from_iframe(self, mock_request_html): + mock_request_html.side_effect = [ + '', + '', + ] + play_id = self.spider._encode_play_id("play-200", "900", "第2集") + result = self.spider.playerContent("两个BT", play_id, {}) + self.assertEqual(mock_request_html.call_args_list[0].args[0], "https://www.bttwoo.com/v_play/play-200.html") + self.assertEqual(mock_request_html.call_args_list[1].args[0], "https://www.bttwoo.com/embed/demo.html") + self.assertEqual(result["parse"], 0) + self.assertEqual(result["url"], "https://media.example/iframe.m3u8") + + @patch.object(Spider, "_request_html") + def test_player_content_falls_back_to_parse_when_no_media_found(self, mock_request_html): + mock_request_html.return_value = "empty" + play_id = self.spider._encode_play_id("play-300", "900", "第3集") + result = self.spider.playerContent("两个BT", play_id, {}) + self.assertEqual(result["parse"], 1) + self.assertEqual(result["jx"], 1) + self.assertEqual(result["url"], "https://www.bttwoo.com/v_play/play-300.html") + self.assertEqual(result["header"]["Referer"], "https://www.bttwoo.com/v_play/play-300.html") + if __name__ == "__main__": unittest.main() diff --git a/py/两个BT.py b/py/两个BT.py index 2ada792..64691ce 100644 --- a/py/两个BT.py +++ b/py/两个BT.py @@ -90,6 +90,14 @@ class Spider(BaseSpider): media_url = self._extract_media_url(html) if media_url: return self._build_player_result(media_url, play_page_url) + + iframe_url = self._extract_iframe_url(html) + if iframe_url: + iframe_html = self._request_html(iframe_url, referer=play_page_url) + iframe_media_url = self._extract_media_url(iframe_html) + if iframe_media_url: + return self._build_player_result(iframe_media_url, iframe_url) + return self._build_parse_result(play_page_url, play_page_url) def _request_html(self, url, referer=None): @@ -292,6 +300,10 @@ class Spider(BaseSpider): }, } + def _extract_iframe_url(self, html): + matched = re.search(r']+src=["\']([^"\']+)["\']', str(html or ""), re.I) + return self._abs_url(matched.group(1)) if matched else "" + def _abs_url(self, value): raw = str(value or "").strip() if not raw: