@@ -44,76 +44,48 @@ async def lifespan(app: FastAPI):
4444 await db .check_and_migrate_db (config_dict )
4545 print ("✓ Database migration check completed." )
4646
47- # Load admin config from database
48- admin_config = await db .get_admin_config ()
49- if admin_config :
50- config .set_admin_username_from_db (admin_config .username )
51- config .set_admin_password_from_db (admin_config .password )
52- config .api_key = admin_config .api_key
53-
54- # Load cache configuration from database
55- cache_config = await db .get_cache_config ()
56- config .set_cache_enabled (cache_config .cache_enabled )
57- config .set_cache_timeout (cache_config .cache_timeout )
58- config .set_cache_base_url (cache_config .cache_base_url or "" )
59-
60- # Load generation configuration from database
61- generation_config = await db .get_generation_config ()
62- config .set_image_timeout (generation_config .image_timeout )
63- config .set_video_timeout (generation_config .video_timeout )
64-
65- # Load debug configuration from database
66- debug_config = await db .get_debug_config ()
67- config .set_debug_enabled (debug_config .enabled )
68-
69- # Load captcha configuration from database
47+ # 启动时统一把数据库配置同步到内存,避免 personal/brower 相关运行时配置遗漏。
48+ await db .reload_config_to_memory ()
7049 captcha_config = await db .get_captcha_config ()
71-
72- config .set_captcha_method (captcha_config .captcha_method )
73- config .set_yescaptcha_api_key (captcha_config .yescaptcha_api_key )
74- config .set_yescaptcha_base_url (captcha_config .yescaptcha_base_url )
75- config .set_capmonster_api_key (captcha_config .capmonster_api_key )
76- config .set_capmonster_base_url (captcha_config .capmonster_base_url )
77- config .set_ezcaptcha_api_key (captcha_config .ezcaptcha_api_key )
78- config .set_ezcaptcha_base_url (captcha_config .ezcaptcha_base_url )
79- config .set_capsolver_api_key (captcha_config .capsolver_api_key )
80- config .set_capsolver_base_url (captcha_config .capsolver_base_url )
81- config .set_remote_browser_base_url (captcha_config .remote_browser_base_url )
82- config .set_remote_browser_api_key (captcha_config .remote_browser_api_key )
83- config .set_remote_browser_timeout (captcha_config .remote_browser_timeout )
50+
51+ # 尽量在浏览器服务启动前就拿到 token 快照,后续并发管理和预热共用。
52+ tokens = await token_manager .get_all_tokens ()
8453
8554 # Initialize browser captcha service if needed
8655 browser_service = None
8756 if captcha_config .captcha_method == "personal" :
8857 from .services .browser_captcha_personal import BrowserCaptchaService
8958 browser_service = await BrowserCaptchaService .get_instance (db )
9059 print ("✓ Browser captcha service initialized (nodriver mode)" )
91-
92- # 启动常驻模式:从第一个可用token获取project_id
93- tokens = await token_manager .get_all_tokens ()
94- resident_project_id = None
95- for t in tokens :
96- if t .current_project_id and t .is_active :
97- resident_project_id = t .current_project_id
98- break
99-
100- if resident_project_id :
101- # 直接启动常驻模式(会自动导航到项目页面,cookie已持久化)
102- await browser_service .start_resident_mode (resident_project_id )
103- print (f"✓ Browser captcha resident mode started (project: { resident_project_id [:8 ]} ...)" )
60+
61+ warmup_limit = max (1 , int (config .personal_max_resident_tabs or 1 ))
62+ warmup_project_ids = await token_manager .get_personal_warmup_project_ids (
63+ tokens = tokens ,
64+ limit = warmup_limit ,
65+ )
66+
67+ warmed_slots = await browser_service .warmup_resident_tabs (
68+ warmup_project_ids ,
69+ limit = warmup_limit ,
70+ )
71+ if warmed_slots :
72+ print (
73+ f"✓ Browser captcha shared resident tabs warmed "
74+ f"({ len (warmed_slots )} slot(s), limit={ warmup_limit } )"
75+ )
76+ elif tokens :
77+ print ("⚠ Browser captcha resident warmup skipped: no tab warmed successfully" )
10478 else :
105- # 没有可用的project_id时 ,打开登录窗口供用户手动操作
79+ # 没有任何可用 token 时 ,打开登录窗口供用户手动操作
10680 await browser_service .open_login_window ()
107- print ("⚠ No active token with project_id found, opened login window for manual setup" )
81+ print ("⚠ No active token found, opened login window for manual setup" )
10882 elif captcha_config .captcha_method == "browser" :
10983 from .services .browser_captcha import BrowserCaptchaService
11084 browser_service = await BrowserCaptchaService .get_instance (db )
11185 await browser_service .warmup_browser_slots ()
11286 print ("? Browser captcha service initialized (headed mode)" )
11387
11488 # Initialize concurrency manager
115- tokens = await token_manager .get_all_tokens ()
116-
11789 await concurrency_manager .initialize (tokens )
11890
11991 if config .captcha_method == "remote_browser" :
0 commit comments