2026-03-09 14:05:00 +08:00
|
|
|
|
"""
|
|
|
|
|
|
Weibo-HotSign Task Scheduler Service
|
2026-03-18 09:19:29 +08:00
|
|
|
|
Celery app + Beat configuration.
|
|
|
|
|
|
|
|
|
|
|
|
策略:每 5 分钟运行一次 check_and_run_due_tasks,
|
|
|
|
|
|
该任务从数据库读取所有 enabled 的 Task,用 croniter 判断
|
|
|
|
|
|
当前时间是否在 cron 窗口内(±3 分钟),如果是则提交签到。
|
|
|
|
|
|
这样无需动态修改 beat_schedule,简单可靠。
|
2026-03-09 14:05:00 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import os
|
2026-03-09 16:10:29 +08:00
|
|
|
|
import sys
|
|
|
|
|
|
import logging
|
|
|
|
|
|
|
2026-03-09 14:05:00 +08:00
|
|
|
|
from celery import Celery
|
2026-03-18 09:33:33 +08:00
|
|
|
|
from celery.schedules import crontab
|
2026-03-09 14:05:00 +08:00
|
|
|
|
|
2026-03-18 09:19:29 +08:00
|
|
|
|
# 确保 shared 模块可导入
|
2026-03-09 16:10:29 +08:00
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../.."))
|
|
|
|
|
|
|
|
|
|
|
|
from .config import settings
|
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
2026-03-09 14:05:00 +08:00
|
|
|
|
|
|
|
|
|
|
# Create Celery app
|
|
|
|
|
|
celery_app = Celery(
|
2026-03-18 09:19:29 +08:00
|
|
|
|
"weibo_scheduler",
|
2026-03-09 14:05:00 +08:00
|
|
|
|
broker=settings.CELERY_BROKER_URL,
|
|
|
|
|
|
backend=settings.CELERY_RESULT_BACKEND,
|
2026-03-18 09:19:29 +08:00
|
|
|
|
include=["task_scheduler.app.tasks.signin_tasks"],
|
2026-03-09 14:05:00 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
celery_app.conf.update(
|
|
|
|
|
|
task_serializer="json",
|
|
|
|
|
|
accept_content=["json"],
|
|
|
|
|
|
result_serializer="json",
|
|
|
|
|
|
timezone="Asia/Shanghai",
|
2026-03-18 09:19:29 +08:00
|
|
|
|
enable_utc=False,
|
|
|
|
|
|
beat_schedule_filename="/tmp/celerybeat-schedule",
|
|
|
|
|
|
beat_max_loop_interval=60,
|
|
|
|
|
|
beat_schedule={
|
|
|
|
|
|
"check-due-tasks": {
|
|
|
|
|
|
"task": "task_scheduler.app.tasks.signin_tasks.check_and_run_due_tasks",
|
|
|
|
|
|
"schedule": 60.0, # 每分钟检查一次(轻量查询,只在到期前 5 分钟才真正提交)
|
|
|
|
|
|
},
|
2026-03-18 09:33:33 +08:00
|
|
|
|
"cleanup-old-logs": {
|
|
|
|
|
|
"task": "task_scheduler.app.tasks.signin_tasks.cleanup_old_signin_logs",
|
|
|
|
|
|
"schedule": crontab(hour=3, minute=0), # 每天凌晨 3 点
|
|
|
|
|
|
},
|
2026-03-18 09:19:29 +08:00
|
|
|
|
},
|
2026-03-09 14:05:00 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2026-03-18 09:19:29 +08:00
|
|
|
|
# 导入 task 模块以注册
|
|
|
|
|
|
from .tasks import signin_tasks # noqa: F401, E402
|