WIP-CHECKPOINT[auth-refactor]: 固化工程师崩溃前部分成果 + 同树其他未提交WIP(仅源码,不含密钥/二进制)-- 待重激活工程师续作
This commit is contained in:
@@ -126,6 +126,10 @@ async def check_emergency_role(
|
||||
|
||||
# 方式 1:企微标签检测
|
||||
tag_id = getattr(settings, "wecom_agent_tag_id", None)
|
||||
user_info = None
|
||||
role = "user"
|
||||
method = "default"
|
||||
|
||||
if tag_id:
|
||||
try:
|
||||
access_token = await wecom_service.get_access_token()
|
||||
@@ -144,14 +148,12 @@ async def check_emergency_role(
|
||||
]
|
||||
if userid in user_ids:
|
||||
logger.info(f"标签检测: userid={userid} 是坐席")
|
||||
return success_response(
|
||||
{"role": "agent", "userid": userid, "method": "tag"}
|
||||
)
|
||||
role = "agent"
|
||||
method = "tag"
|
||||
else:
|
||||
logger.info(f"标签检测: userid={userid} 是员工")
|
||||
return success_response(
|
||||
{"role": "user", "userid": userid, "method": "tag"}
|
||||
)
|
||||
role = "user"
|
||||
method = "tag"
|
||||
else:
|
||||
logger.warning(
|
||||
f"标签 API 失败: errcode={result.get('errcode')}, "
|
||||
@@ -166,16 +168,50 @@ async def check_emergency_role(
|
||||
agent_ids = [x.strip() for x in hardcoded.split(",") if x.strip()]
|
||||
if userid in agent_ids:
|
||||
logger.info(f"硬编码名单: userid={userid} 是坐席")
|
||||
return success_response(
|
||||
{"role": "agent", "userid": userid, "method": "hardcoded"}
|
||||
)
|
||||
role = "agent"
|
||||
method = "hardcoded"
|
||||
else:
|
||||
return success_response(
|
||||
{"role": "user", "userid": userid, "method": "hardcoded"}
|
||||
)
|
||||
role = "user"
|
||||
method = "hardcoded"
|
||||
|
||||
# 方式 3:默认 user
|
||||
logger.info(f"未配置检测方式, userid={userid} 默认 user")
|
||||
return success_response(
|
||||
{"role": "user", "userid": userid, "method": "default"}
|
||||
)
|
||||
# 获取用户详细信息(名称、头像)- 添加超时,避免长时间阻塞
|
||||
user_info = None
|
||||
try:
|
||||
import asyncio
|
||||
import httpx
|
||||
# 设置获取 access_token 的超时时间
|
||||
access_token = await asyncio.wait_for(
|
||||
wecom_service.get_access_token(),
|
||||
timeout=2.0 # 2秒超时
|
||||
)
|
||||
user_url = f"https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&userid={userid}"
|
||||
async with httpx.AsyncClient(timeout=2.0) as client:
|
||||
user_resp = await client.get(user_url)
|
||||
user_result = user_resp.json()
|
||||
if user_result.get("errcode", 0) == 0:
|
||||
user_info = {
|
||||
"name": user_result.get("name", ""),
|
||||
"avatar": user_result.get("avatar", ""),
|
||||
"department": "" # 简化:暂不获取部门名称
|
||||
}
|
||||
logger.info(f"获取用户信息成功: userid={userid}, name={user_info['name']}")
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning(f"获取用户信息超时: userid={userid}")
|
||||
except Exception as e:
|
||||
logger.warning(f"获取用户信息失败: {e}")
|
||||
|
||||
# 构建返回数据
|
||||
response_data = {
|
||||
"role": role,
|
||||
"userid": userid,
|
||||
"method": method
|
||||
}
|
||||
# 添加用户信息(如果有)
|
||||
if user_info:
|
||||
response_data.update(user_info)
|
||||
|
||||
# 方式 3:默认 user(当未配置检测方式时)
|
||||
if method == "default":
|
||||
logger.info(f"未配置检测方式, userid={userid} 默认 user")
|
||||
|
||||
return success_response(response_data)
|
||||
|
||||
Reference in New Issue
Block a user