import os import threading from datetime import datetime, timedelta from apscheduler.schedulers.background import BackgroundScheduler import pytz import config import data_manager shanghai_tz = pytz.timezone(config.SHANGHAI_TZ_STR) scheduler = BackgroundScheduler(daemon=True, timezone=shanghai_tz) def initial_login_all_accounts_job(): print("程序启动,开始为所有账户执行初始登录...") threads = [] emails_to_login = data_manager.get_all_account_emails() for email in emails_to_login: thread = threading.Thread(target=data_manager.login_and_store_token, args=(email,)) threads.append(thread) thread.start() for thread in threads: thread.join() print("所有账户初始登录尝试完成。") def scheduled_login_all_accounts_job(): print(f"[{datetime.now(shanghai_tz)}] 定时任务:开始为所有账户重新登录...") threads = [] emails_to_login = data_manager.get_all_account_emails() for email in emails_to_login: thread = threading.Thread(target=data_manager.login_and_store_token, args=(email,)) threads.append(thread) thread.start() for thread in threads: thread.join() print(f"[{datetime.now(shanghai_tz)}] 定时任务:所有账户重新登录尝试完成。") scheduled_fetch_all_profiles_job() def scheduled_fetch_all_profiles_job(): print(f"[{datetime.now(shanghai_tz)}] 定时任务:开始为所有账户获取 Profile...") threads = [] emails_to_fetch = data_manager.get_all_account_emails() for email in emails_to_fetch: thread = threading.Thread(target=data_manager.fetch_and_store_profile, args=(email,)) threads.append(thread) thread.start() for thread in threads: thread.join() print(f"[{datetime.now(shanghai_tz)}] 定时任务:所有账户获取 Profile 尝试完成。") def manual_refresh_all_data_job(): print(f"[{datetime.now(shanghai_tz)}] 手动触发数据刷新...") threading.Thread(target=scheduled_fetch_all_profiles_job).start() def initialize_scheduler(is_gunicorn=False): if not data_manager.parse_accounts(): print("由于账户加载失败,定时任务无法初始化。请检查 ACCOUNTS 环境变量。") return False initial_login_all_accounts_job() scheduled_fetch_all_profiles_job() login_job_id = 'job_login_all_gunicorn' if is_gunicorn else 'job_login_all' profile_job_id = 'job_fetch_profiles_gunicorn' if is_gunicorn else 'job_fetch_profiles' if scheduler.get_job(login_job_id): scheduler.remove_job(login_job_id) if scheduler.get_job(profile_job_id): scheduler.remove_job(profile_job_id) run_date_login = datetime.now(shanghai_tz) + timedelta(days=3) run_date_profile = datetime.now(shanghai_tz) + timedelta(minutes=30) scheduler.add_job(scheduled_login_all_accounts_job, 'interval', days=3, id=login_job_id, next_run_time=run_date_login) scheduler.add_job(scheduled_fetch_all_profiles_job, 'interval', minutes=30, id=profile_job_id, next_run_time=run_date_profile) try: if not scheduler.running: scheduler.start() print(f"定时任务已启动 ({'Gunicorn' if is_gunicorn else 'Local'})。") else: print(f"定时任务已在运行中 ({'Gunicorn' if is_gunicorn else 'Local'})。") print(f"APScheduler jobs: {scheduler.get_jobs()}") return True except Exception as e: print(f"启动 APScheduler 失败 ({'Gunicorn' if is_gunicorn else 'Local'}): {e}") return False