From 3954c40e69f555281c863b77880c843fc49f321b Mon Sep 17 00:00:00 2001 From: LePao1 <2814411507@qq.com> Date: Wed, 24 Sep 2025 12:27:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(bilibili)=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=B8=85=E6=99=B0=E5=BA=A6=E5=8F=82=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87`BILI=5FQN`?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=8B=E8=BD=BD=E7=9A=84=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=B8=85=E6=99=B0=E5=BA=A6=EF=BC=9B=20=E5=9C=A8=20BilibiliClie?= =?UTF-8?q?nt=20=E4=B8=AD=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E9=85=8D=E7=BD=AE=E5=B9=B6=E6=94=B9=E8=BF=9B=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=A4=84=E7=90=86=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E8=AF=B7=E6=B1=82=E8=A2=AB=20302=20=E9=87=8D=E5=AE=9A?= =?UTF-8?q?=E5=90=91=E5=88=B0=20CDN=EF=BC=8C=E6=97=A7=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9C=AA=E8=B7=9F=E9=9A=8F=E9=87=8D=E5=AE=9A=E5=90=91=E4=B8=94?= =?UTF-8?q?=E5=8F=AA=E6=8E=A5=E5=8F=97=20=E2=80=9COK=E2=80=9D=20=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=A4=B1=E8=B4=A5=EF=BC=8C=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E5=8D=B3=E4=BE=BF=E6=98=AF=E4=BD=8E=E6=B8=85=E6=99=B0=E5=BA=A6?= =?UTF-8?q?/CDN=20=E8=B7=B3=E8=BD=AC=E7=9A=84=E9=93=BE=E6=8E=A5=E4=B9=9F?= =?UTF-8?q?=E8=83=BD=E6=AD=A3=E5=B8=B8=E4=B8=8B=E8=BD=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/bilibili_config.py | 5 +++++ media_platform/bilibili/client.py | 15 +++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/config/bilibili_config.py b/config/bilibili_config.py index 2b516b4..7882824 100644 --- a/config/bilibili_config.py +++ b/config/bilibili_config.py @@ -34,6 +34,11 @@ END_DAY = "2024-01-01" # 搜索模式 BILI_SEARCH_MODE = "normal" +# 视频清晰度(qn)配置,常见取值: +# 16=360p, 32=480p, 64=720p, 80=1080p, 112=1080p高码率, 116=1080p60, 120=4K +# 注意:更高清晰度需要账号/视频本身支持 +BILI_QN = 80 + # 是否爬取用户信息 CREATOR_MODE = True diff --git a/media_platform/bilibili/client.py b/media_platform/bilibili/client.py index 0abf872..7019c10 100644 --- a/media_platform/bilibili/client.py +++ b/media_platform/bilibili/client.py @@ -189,10 +189,11 @@ class BilibiliClient(AbstractApiClient): if not aid or not cid or aid <= 0 or cid <= 0: raise ValueError("aid 和 cid 必须存在") uri = "/x/player/wbi/playurl" + qn_value = getattr(config, "BILI_QN", 80) params = { "avid": aid, "cid": cid, - "qn": 80, + "qn": qn_value, "fourk": 1, "fnval": 1, "platform": "pc", @@ -201,15 +202,17 @@ class BilibiliClient(AbstractApiClient): return await self.get(uri, params, enable_params_sign=True) async def get_video_media(self, url: str) -> Union[bytes, None]: - async with httpx.AsyncClient(proxy=self.proxy) as client: + # Follow CDN 302 redirects and treat any 2xx as success (some endpoints return 206) + async with httpx.AsyncClient(proxy=self.proxy, follow_redirects=True) as client: try: response = await client.request("GET", url, timeout=self.timeout, headers=self.headers) response.raise_for_status() - if not response.reason_phrase == "OK": - utils.logger.error(f"[BilibiliClient.get_video_media] request {url} err, res:{response.text}") - return None - else: + if 200 <= response.status_code < 300: return response.content + utils.logger.error( + f"[BilibiliClient.get_video_media] Unexpected status {response.status_code} for {url}" + ) + return None except httpx.HTTPError as exc: # some wrong when call httpx.request method, such as connection error, client error, server error or response status code is not 2xx utils.logger.error(f"[BilibiliClient.get_video_media] {exc.__class__.__name__} for {exc.request.url} - {exc}") # 保留原始异常类型名称,以便开发者调试 return None