更新
This commit is contained in:
@@ -331,7 +331,7 @@ class DouyinImService:
|
||||
self.account_id = account_id
|
||||
# 由 worker 注入:周期性检测新粉丝并发送关注欢迎语(约每 60s 触发一次)
|
||||
self.follow_tick = follow_tick
|
||||
# 由 worker 注入:检测到 IM 登录失效(INVALID_REQUEST)时回调,用于自动下线
|
||||
# 由 worker 注入:检测到 IM 登录失效(INVALID_REQUEST/KICK)时回调,用于自动下线
|
||||
self.on_session_invalid = on_session_invalid
|
||||
self._on_ready = on_ready
|
||||
self._ready_notified = False
|
||||
@@ -1449,26 +1449,36 @@ class DouyinImService:
|
||||
return False, None
|
||||
|
||||
async def _note_session_invalid(self, error: str) -> None:
|
||||
"""根据发送失败原因判断 IM 是否已退出登录;连续 INVALID_REQUEST 即触发自动下线。
|
||||
"""根据发送失败原因判断 IM 是否已退出登录,并触发自动下线。
|
||||
|
||||
INVALID_REQUEST 来自 create_conversation/发送:会话/签名被抖音判为无效,强相关于「登录失效」。
|
||||
decision=KICK 是安全网关明确要求终止当前登录态,一次即可确认,无需等待第二次发送。
|
||||
而 8xxx/7xxx 等业务错误(关系/频控/内容)说明请求已到达抖音、登录仍有效,重置计数。
|
||||
"""
|
||||
err = error or ""
|
||||
if "INVALID_REQUEST" not in err:
|
||||
upper_err = err.upper()
|
||||
is_kicked = "DECISION=KICK" in upper_err
|
||||
is_invalid_request = "INVALID_REQUEST" in upper_err
|
||||
if not is_invalid_request and not is_kicked:
|
||||
self._session_invalid_strikes = 0
|
||||
return
|
||||
self._session_invalid_strikes += 1
|
||||
if self._session_invalid_strikes < 2 or self._session_invalid_fired:
|
||||
threshold = 1 if is_kicked else 2
|
||||
if self._session_invalid_strikes < threshold or self._session_invalid_fired:
|
||||
return
|
||||
self._session_invalid_fired = True
|
||||
reason = "IM 会话失效(INVALID_REQUEST),登录可能已退出"
|
||||
if is_kicked:
|
||||
reason = "抖音安全网关已踢下线(decision=KICK)"
|
||||
failure_detail = "发送接口返回 decision=KICK"
|
||||
else:
|
||||
reason = "IM 会话失效(INVALID_REQUEST),登录可能已退出"
|
||||
failure_detail = f"连续 {self._session_invalid_strikes} 次发送返回 INVALID_REQUEST"
|
||||
logger.warning(
|
||||
f"Account {self.account_id} {reason};连续 {self._session_invalid_strikes} 次 -> 自动下线"
|
||||
f"Account {self.account_id} {reason} -> 自动下线"
|
||||
)
|
||||
system_logger.record(
|
||||
"IM 登录失效,自动下线",
|
||||
detail=f"{reason}(连续 {self._session_invalid_strikes} 次发送返回 INVALID_REQUEST)。"
|
||||
detail=f"{reason}({failure_detail})。"
|
||||
"请停止托管后用浏览器模式重新登录并打开私信页,再重新启动托管。",
|
||||
level="error",
|
||||
category="auth",
|
||||
|
||||
Reference in New Issue
Block a user