From eb45a6367f86b5b13c9fa2c4fd701145b11a1efa Mon Sep 17 00:00:00 2001 From: Wei Liu Date: Wed, 18 Mar 2026 12:21:27 +1300 Subject: [PATCH] fix: disable SSL verification for proxy/VPN environments Add verify=False to all httpx.AsyncClient calls across bilibili, weibo, zhihu clients and crawler_util. Fixes SSL certificate validation errors when running behind a corporate proxy or VPN. Co-Authored-By: Claude Sonnet 4.6 --- media_platform/bilibili/client.py | 4 ++-- media_platform/weibo/client.py | 6 +++--- media_platform/zhihu/client.py | 2 +- tools/crawler_util.py | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/media_platform/bilibili/client.py b/media_platform/bilibili/client.py index 45c927c..cf0a170 100644 --- a/media_platform/bilibili/client.py +++ b/media_platform/bilibili/client.py @@ -68,7 +68,7 @@ class BilibiliClient(AbstractApiClient, ProxyRefreshMixin): # Check if proxy has expired before each request await self._refresh_proxy_if_expired() - async with httpx.AsyncClient(proxy=self.proxy) as client: + async with httpx.AsyncClient(proxy=self.proxy, verify=False) as client: response = await client.request(method, url, timeout=self.timeout, **kwargs) try: data: Dict = response.json() @@ -222,7 +222,7 @@ class BilibiliClient(AbstractApiClient, ProxyRefreshMixin): async def get_video_media(self, url: str) -> Union[bytes, None]: # 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: + async with httpx.AsyncClient(proxy=self.proxy, follow_redirects=True, verify=False) as client: try: response = await client.request("GET", url, timeout=self.timeout, headers=self.headers) response.raise_for_status() diff --git a/media_platform/weibo/client.py b/media_platform/weibo/client.py index a49a482..ce51d90 100644 --- a/media_platform/weibo/client.py +++ b/media_platform/weibo/client.py @@ -73,7 +73,7 @@ class WeiboClient(ProxyRefreshMixin): await self._refresh_proxy_if_expired() enable_return_response = kwargs.pop("return_response", False) - async with httpx.AsyncClient(proxy=self.proxy) as client: + async with httpx.AsyncClient(proxy=self.proxy, verify=False) as client: response = await client.request(method, url, timeout=self.timeout, **kwargs) if enable_return_response: @@ -261,7 +261,7 @@ class WeiboClient(ProxyRefreshMixin): :return: """ url = f"{self._host}/detail/{note_id}" - async with httpx.AsyncClient(proxy=self.proxy) as client: + async with httpx.AsyncClient(proxy=self.proxy, verify=False) as client: response = await client.request("GET", url, timeout=self.timeout, headers=self.headers) if response.status_code != 200: raise DataFetchError(f"get weibo detail err: {response.text}") @@ -291,7 +291,7 @@ class WeiboClient(ProxyRefreshMixin): # Since Weibo images are accessed through i1.wp.com, we need to concatenate the URL final_uri = (f"{self._image_agent_host}" f"{image_url}") - async with httpx.AsyncClient(proxy=self.proxy) as client: + async with httpx.AsyncClient(proxy=self.proxy, verify=False) as client: try: response = await client.request("GET", final_uri, timeout=self.timeout) response.raise_for_status() diff --git a/media_platform/zhihu/client.py b/media_platform/zhihu/client.py index 079d08d..84721c7 100644 --- a/media_platform/zhihu/client.py +++ b/media_platform/zhihu/client.py @@ -98,7 +98,7 @@ class ZhiHuClient(AbstractApiClient, ProxyRefreshMixin): # return response.text return_response = kwargs.pop('return_response', False) - async with httpx.AsyncClient(proxy=self.proxy) as client: + async with httpx.AsyncClient(proxy=self.proxy, verify=False) as client: response = await client.request(method, url, timeout=self.timeout, **kwargs) if response.status_code != 200: diff --git a/tools/crawler_util.py b/tools/crawler_util.py index 12cb73e..980ca35 100644 --- a/tools/crawler_util.py +++ b/tools/crawler_util.py @@ -47,7 +47,7 @@ async def find_login_qrcode(page: Page, selector: str) -> str: ) login_qrcode_img = str(await elements.get_property("src")) # type: ignore if "http://" in login_qrcode_img or "https://" in login_qrcode_img: - async with httpx.AsyncClient(follow_redirects=True) as client: + async with httpx.AsyncClient(follow_redirects=True, verify=False) as client: utils.logger.info(f"[find_login_qrcode] get qrcode by url:{login_qrcode_img}") resp = await client.get(login_qrcode_img, headers={"User-Agent": get_user_agent()}) if resp.status_code == 200: