更新
This commit is contained in:
@@ -160,6 +160,7 @@ def analyze_send_response(raw: bytes) -> dict:
|
||||
"raw_check_code": None,
|
||||
"delivered_with_notice": False,
|
||||
"status_reason": "",
|
||||
"decision": "",
|
||||
"message": "",
|
||||
"error_desc": "",
|
||||
"server_message_id": None,
|
||||
@@ -169,6 +170,45 @@ def analyze_send_response(raw: bytes) -> dict:
|
||||
if not raw:
|
||||
info["summary"] = "空响应"
|
||||
return info
|
||||
|
||||
# 风控/登录网关有时不返回 protobuf,而是直接返回 JSON,例如:
|
||||
# {"decision":"KICK"}。若继续按 protobuf 解码,JSON 的首字节“{”会被
|
||||
# 误读为 wire type 3,只留下 unsupported wire type 3 这种次生错误。
|
||||
stripped = raw.lstrip()
|
||||
if stripped.startswith(b"{"):
|
||||
try:
|
||||
payload = json.loads(stripped.decode("utf-8"))
|
||||
except (UnicodeDecodeError, json.JSONDecodeError):
|
||||
payload = None
|
||||
if isinstance(payload, dict):
|
||||
decision = str(
|
||||
payload.get("decision") or payload.get("decision_type") or ""
|
||||
).strip()
|
||||
info["decision"] = decision
|
||||
info["status_code"] = payload.get("status_code")
|
||||
info["raw_check_code"] = payload.get("raw_check_code")
|
||||
info["message"] = str(payload.get("message") or "")
|
||||
info["error_desc"] = str(
|
||||
payload.get("error_desc") or payload.get("error") or ""
|
||||
)
|
||||
info["status_reason"] = str(
|
||||
payload.get("tips") or payload.get("reason") or ""
|
||||
)
|
||||
summary_parts = ["JSON响应"]
|
||||
if decision:
|
||||
summary_parts.append(f"decision={decision}")
|
||||
if info["status_code"] is not None:
|
||||
summary_parts.append(f"status_code={info['status_code']}")
|
||||
if info["raw_check_code"] is not None:
|
||||
summary_parts.append(f"raw_check_code={info['raw_check_code']}")
|
||||
if info["message"]:
|
||||
summary_parts.append(f"message={info['message']}")
|
||||
if info["error_desc"]:
|
||||
summary_parts.append(f"error_desc={info['error_desc']}")
|
||||
info["summary"] = " ".join(summary_parts)
|
||||
# /message/send 的正常成功响应是 protobuf;独立 JSON 是网关级响应,
|
||||
# 不能据此确认消息已经写入会话。
|
||||
return info
|
||||
try:
|
||||
fields = decode_fields(raw)
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user