From 6179a871d1781186b6540ca03ddca992dd1bcbb5 Mon Sep 17 00:00:00 2001 From: cluntop <85211716+cluntop@users.noreply.github.com> Date: Fri, 27 Feb 2026 02:35:57 +0800 Subject: [PATCH] Update Up --- py/sinparty.py | 94 +++++++++++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/py/sinparty.py b/py/sinparty.py index 69cdb6ca4..679c2fa09 100644 --- a/py/sinparty.py +++ b/py/sinparty.py @@ -19,13 +19,14 @@ async def fetch_m3u8(session: aiohttp.ClientSession, name: str, link: str): if match: m3u8_url = match.group(1).replace('\\/', '/') # 【可视化新增】:实时输出成功嗅探到底层流的数据 - print(f" [√ 流捕获] {name.ljust(15)} -> {m3u8_url}") + print(f" [√ 流捕获成功] {name.ljust(15)} -> {m3u8_url}") return name, m3u8_url, link - except Exception: + except Exception as e: + print(f" [x] 网络请求异常 ({name}): {e}") pass # 【可视化新增】:实时输出未命中底层流,降级处理的数据 - print(f" [- 未嗅探] {name.ljust(15)} -> 未发现直接 m3u8,保留原始跳转链接") + print(f" [- 嗅探失败/降级] {name.ljust(15)} -> 未发现直接 m3u8,保留原始跳转链接") return name, None, link async def main(): @@ -33,21 +34,28 @@ async def main(): # === 阶段 1:Playwright 全站分页抓取 === async with async_playwright() as p: + print("[*] 正在启动 Chromium 无头浏览器...") browser = await p.chromium.launch(headless=True) page = await browser.new_page(ignore_https_errors=True) # 注入反爬虫绕过脚本,抹除自动化特征,欺骗防御蜘蛛的探测 await page.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") - print("\n[*] 已挂载 Stealth 反检测脚本,webdriver 特征已抹除。") + print("[*] 已挂载 Stealth 反检测脚本,webdriver 特征已抹除,准备渗透。") page_num = 1 while True: - print(f"\n{'='*50}") - print(f"[*] 正在加载并抓取第 {page_num} 页数据... (URL: https://sinparty.com/?page={page_num})") + print(f"\n{'='*60}") + print(f"[*] [抓取网站流程] 正在加载并抓取第 {page_num} 页... ") + print(f"[*] [目标 URL] https://sinparty.com/?page={page_num}") # 动态改变 page=&& 参数 url = f"https://sinparty.com/?page={page_num}" # 移除不可靠的 networkidle,使用默认导航机制 - await page.goto(url) + response = await page.goto(url) + + if response: + print(f"[*] [网络状态] 页面响应码: {response.status} (200为正常)") + else: + print(f"[!] [网络状态] 未获取到页面响应信息,可能存在拦截。") # 强制屏蔽拦截遮罩,破坏防御弹窗,恢复“可操作、可活动、可点击”状态 await page.add_style_tag(content=''' @@ -58,60 +66,75 @@ async def main(): await page.evaluate('''() => { document.querySelectorAll('.app-modal__overlay, .modal-auth__inner').forEach(el => el.remove()); }''') - print("[*] 防御拦截层 (.app-modal__overlay) 已被强制物理摧毁,DOM 可点击限制已解除。") + print("[*] [防御突破] 拦截层 (.app-modal__overlay) 已强制物理摧毁,DOM 可点击限制解除。") # 定位目标:跳过 skeleton 骨架屏,直接锁定在线主播节点 try: # 显式等待真实数据的 CSS 节点渲染到 DOM 中(最长容忍 20 秒) - # 统一