fix: 企微 API 通过代理绕过 IP 白名单限制,补充错误日志
- 新增 WECHAT_API_BASE_URL 配置项,支持企微 API 代理转发 - _send_message 增加 API 错误日志(errcode + errmsg) - _get_access_token 增加失败日志 - handle_text 不再为空,返回菜单引导提示 - 防重入触发时通知用户等待时间 - menu.py API 调用统一使用配置化的 base URL Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+15
-3
@@ -1,9 +1,12 @@
|
||||
import logging
|
||||
import time
|
||||
|
||||
import httpx
|
||||
|
||||
from app.config import settings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class WeChatClient:
|
||||
def __init__(self):
|
||||
@@ -15,7 +18,7 @@ class WeChatClient:
|
||||
if self._access_token and now < self._token_expires_at:
|
||||
return self._access_token
|
||||
|
||||
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
|
||||
url = f"{settings.wechat_api_base_url}/cgi-bin/gettoken"
|
||||
params = {
|
||||
"corpid": settings.wechat_corp_id,
|
||||
"corpsecret": settings.wechat_secret,
|
||||
@@ -27,6 +30,7 @@ class WeChatClient:
|
||||
self._access_token = data["access_token"]
|
||||
self._token_expires_at = now + data.get("expires_in", 7200) - 300
|
||||
return self._access_token
|
||||
logger.error(f"获取 access_token 失败: {data}")
|
||||
return None
|
||||
|
||||
async def send_text(self, content: str, to_user: str = "@all") -> bool:
|
||||
@@ -59,9 +63,10 @@ class WeChatClient:
|
||||
) -> bool:
|
||||
token = await self._get_access_token()
|
||||
if not token:
|
||||
logger.error("无法获取 access_token,跳过消息发送")
|
||||
return False
|
||||
|
||||
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send"
|
||||
url = f"{settings.wechat_api_base_url}/cgi-bin/message/send"
|
||||
params = {"access_token": token}
|
||||
body = {
|
||||
"touser": to_user,
|
||||
@@ -73,4 +78,11 @@ class WeChatClient:
|
||||
async with httpx.AsyncClient(timeout=30) as client:
|
||||
response = await client.post(url, params=params, json=body)
|
||||
data = response.json()
|
||||
return data.get("errcode") == 0
|
||||
errcode = data.get("errcode")
|
||||
if errcode == 0:
|
||||
return True
|
||||
logger.error(
|
||||
f"企业微信消息发送失败: errcode={errcode} errmsg={data.get('errmsg')} "
|
||||
f"msgtype={msgtype} touser={to_user}"
|
||||
)
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user