diff --git a/astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py b/astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py index 5069795729..abb4c95999 100644 --- a/astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py +++ b/astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py @@ -593,10 +593,10 @@ async def _prepare_media_item( len(str(payload.get("upload_param", ""))), ) upload_param = str(payload.get("upload_param", "")).strip() - if not upload_param: - raise RuntimeError("getuploadurl returned empty upload_param") + upload_full_url = str(payload.get("upload_full_url", "")).strip() encrypted_query_param = await self.client.upload_to_cdn( + upload_full_url, upload_param, file_key, aes_key_hex, diff --git a/astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py b/astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py index 51b0b6ed7c..1ea44df527 100644 --- a/astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py +++ b/astrbot/core/platform/sources/weixin_oc/weixin_oc_client.py @@ -108,11 +108,21 @@ def parse_media_aes_key(aes_key_value: str) -> bytes: async def upload_to_cdn( self, + upload_full_url: str, upload_param: str, file_key: str, aes_key_hex: str, media_path: Path, ) -> str: + if upload_full_url: + cdn_url = upload_full_url + elif upload_param: + cdn_url = self._build_cdn_upload_url(upload_param, file_key) + else: + raise ValueError( + "CDN upload URL missing (need upload_full_url or upload_param)" + ) + raw_data = media_path.read_bytes() logger.debug( "weixin_oc(%s): prepare CDN upload file=%s size=%s md5=%s filekey=%s", @@ -135,7 +145,6 @@ async def upload_to_cdn( await self.ensure_http_session() assert self._http_session is not None timeout = aiohttp.ClientTimeout(total=self.api_timeout_ms / 1000) - cdn_url = self._build_cdn_upload_url(upload_param, file_key) async with self._http_session.post( cdn_url,