Ethanfly 19 часов назад
Родитель
Сommit
952164ce92

+ 17 - 2
.gitignore

@@ -1,4 +1,4 @@
-# Dependencies
+# Dependencies
 node_modules/
 .pnpm-store/
 
@@ -47,4 +47,19 @@ playwright-report/
 test-results/
 
 # Matrix
-matrix/
+matrix/
+
+# Python 虚拟环境与缓存(仅本地,不上传)
+server/python/venv/
+server/python/.venv/
+**/venv/
+**/.venv/
+server/python/__pycache__/
+server/python/**/__pycache__/
+*.py[cod]
+*$py.class
+*.pyo
+.pytest_cache/
+.mypy_cache/
+*.egg-info/
+*.egg

BIN
server/python/platforms/__pycache__/base.cpython-311.pyc


BIN
server/python/platforms/__pycache__/douyin.cpython-311.pyc


BIN
server/python/platforms/__pycache__/xiaohongshu.cpython-311.pyc


+ 15 - 17
server/src/services/HeadlessBrowserService.ts

@@ -58,9 +58,9 @@ const PLATFORM_API_CONFIG: Record<string, {
       // 必须有用户信息(name 或 app_id)
       const hasUserInfo = !!(resp?.data?.user?.name || resp?.data?.user?.app_id);
 
-      // 用户状态不能是 'banned' 或其他异常状态
+      // 用户状态不能是 'banned' 或其他异常状态(兼容 normal 等常见正常状态)
       const userStatus = resp?.data?.user?.status;
-      const isStatusOk = !userStatus || userStatus === 'audit' || userStatus === 'pass' || userStatus === 'active';
+      const isStatusOk = !userStatus || ['audit', 'pass', 'active', 'normal'].includes(String(userStatus));
 
       const isValid = isErrnoOk && hasUserInfo && isStatusOk;
 
@@ -268,26 +268,24 @@ class HeadlessBrowserService {
         return false;
       }
 
-      // 百家号特殊处理:根据 errno 判断
+      // 百家号特殊处理:API 用 Node fetch 调用时可能因分散认证等返回 errno !== 0,但 Cookie 在浏览器内仍有效
+      // 因此当 API 判为无效时,回退到浏览器检查,避免“能登录后台却显示过期”
       if (platform === 'baijiahao') {
         const errno = (data as { errno?: number })?.errno;
 
-        // errno 为 0 表示请求成功,但可能没有用户信息(已在 isValidResponse 中检查)
-        if (errno === 0) {
-          // 如果 isValid 为 false,说明虽然请求成功但没有用户信息,可能是 Cookie 无效
-          if (!isValid) {
-            logger.warn(`[API] Baijiahao errno=0 but no user info, cookie may be invalid`);
-            return false;
-          }
-          return true;
+        if (errno === 0 && isValid) return true;
+        if (errno === 0 && !isValid) {
+          logger.warn(`[API] Baijiahao errno=0 but no user info, falling back to browser check`);
+          return this.checkCookieValidByBrowser(platform, cookies);
         }
 
-        // errno 非 0 表示请求失败,可能是 Cookie 无效
-        // 常见错误码:
-        // - 110: 未登录
-        // - 其他非 0 值:可能是权限问题或其他错误
-        logger.warn(`[API] Baijiahao errno=${errno}, cookie is invalid`);
-        return false;
+        // errno 110 通常表示未登录,可直接判无效;其他 errno(如 10001402 分散认证)可能只是接口限制,用浏览器再判一次
+        if (errno === 110) {
+          logger.warn(`[API] Baijiahao errno=110 (not logged in), cookie invalid`);
+          return false;
+        }
+        logger.info(`[API] Baijiahao errno=${errno}, falling back to browser check (may be dispersed auth)`);
+        return this.checkCookieValidByBrowser(platform, cookies);
       }
 
       // 不确定的状态(如 status_code=7),回退到浏览器检查