一个用于定时启动多个游戏自动化程序、完成每日任务后自动关闭程序的 Python 调度器。支持配置化管理、高度可扩展,方便添加新的自动化程序。
game_script/
├── src/ # 源代码目录
│ ├── __init__.py # 包初始化文件,导出所有公共类和函数
│ ├── config.py # 配置管理模块(配置数据类和配置管理器)
│ ├── executors.py # 程序执行器模块(执行器基类和具体实现)
│ ├── scheduler.py # 任务调度器模块(定时调度逻辑)
│ ├── logger.py # 日志模块(日志记录功能)
│ └── main.py # 主程序入口(程序启动入口)
├── config.json # 配置文件(运行时使用的配置)
├── requirements.txt # Python 依赖包列表
├── run.py # 启动脚本(推荐使用)
├── README.md # 项目说明文档(本文件)
└── logs/ # 日志文件目录(运行时自动生成)
└── scheduler_YYYYMMDD_HHMMSS.log
功能:管理所有配置信息,支持从 JSON 文件加载和保存配置
核心类:
ProgramConfig- 程序配置数据类,定义单个程序的配置项SchedulerConfig- 调度器配置数据类,定义调度器的全局配置ConfigManager- 配置管理器,负责配置的加载、保存和管理
功能:实现游戏自动化程序的启动、监控和关闭
核心类:
GameTaskExecutor- 抽象基类,定义执行器的标准接口BetterGIExecutor- BetterGI 专用执行器March7Executor- 三月七专用执行器ZZZExecutor- 绝区零专用执行器ExecutorFactory- 执行器工厂类,负责创建执行器实例
功能:定时执行所有配置的任务
核心类:
TaskScheduler- 任务调度器,支持定时模式和循环模式
功能:记录程序运行日志,支持控制台和文件输出
核心类:
Logger- 简易日志记录器
功能:程序的入口点,整合所有模块
核心函数:
create_default_config()- 创建默认配置main()- 主函数,启动调度器
- Python 3.11+
- Windows 操作系统
pip install -r requirements.txt编辑 config.json,修改以下关键配置:
{
"scheduler": {
"scheduled_times": ["00:00", "12:00", "20:00"], // 定时执行时间
"loop_mode": false, // 是否循环模式
"loop_interval": 3600, // 循环间隔(秒)
"log_enabled": true, // 是否启用日志
"log_dir": "./logs" // 日志目录
},
"programs": [
{
"name": "bettergi",
"display_name": "BetterGI",
"executable_path": "D:\\Games\\BetterGI\\BetterGI.exe", // 修改为实际路径
"arguments": ["--auto"], // 启动参数
"process_names": ["BetterGI.exe", "BetterGI"], // 进程名
"timeout": 0, // 超时时间(0=不限制)
"enabled": true, // 是否启用
"delay_before_start": 0, // 启动前延迟
"delay_after_start": 5 // 启动后延迟
}
// ... 其他程序配置
]
}方式一:使用启动脚本(推荐)
python run.py方式二:立即执行一次所有任务
python run.py --run-now方式三:直接运行主程序(需要先切换到src目录)
cd src
python main.py按 Ctrl+C 即可停止调度器
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
scheduled_times |
string[] | 定时执行时间列表(24 小时制,格式:HH:MM) | ["00:00", "12:00", "20:00"] |
loop_mode |
boolean | 是否启用循环模式 | false |
loop_interval |
integer | 循环执行间隔(秒),仅在 loop_mode=true 时有效 | 3600 |
log_enabled |
boolean | 是否启用日志记录 | true |
log_dir |
string | 日志文件存储目录 | "./logs" |
close_timeout |
integer | 关闭程序时的超时时间(秒) | 10 |
| 参数 | 类型 | 说明 | 必填 |
|---|---|---|---|
name |
string | 程序唯一标识(小写英文) | ✅ |
display_name |
string | 程序显示名称(中文) | ✅ |
executable_path |
string | 程序可执行文件完整路径 | ✅ |
arguments |
string[] | 启动参数列表 | ❌ |
process_names |
string[] | 进程名称列表(用于检测和关闭) | ❌ |
timeout |
integer | 执行超时时间(秒,0=不限制) | ❌ |
enabled |
boolean | 是否启用该程序 | ❌ |
delay_before_start |
integer | 启动前延迟时间(秒) | ❌ |
delay_after_start |
integer | 启动后延迟时间(秒) | ❌ |
在 executors.py 中添加:
class NewGameExecutor(GameTaskExecutor):
"""新游戏任务执行器"""
def get_name(self) -> str:
"""获取执行器名称"""
return "新游戏"在 ExecutorFactory.DEFAULT_EXECUTORS 中添加:
DEFAULT_EXECUTORS = {
'bettergi': BetterGIExecutor,
'march7': March7Executor,
'zzz': ZZZExecutor,
'newgame': NewGameExecutor, # 添加新的执行器
}在 config.json 的 programs 数组中添加:
{
"name": "newgame",
"display_name": "新游戏",
"executable_path": "D:\\Games\\NewGame\\NewGame.exe",
"arguments": ["--daily-task"],
"process_names": ["NewGame.exe"],
"enabled": true
}如果需要更复杂的执行逻辑,可以重写基类的方法:
class CustomExecutor(GameTaskExecutor):
def start(self) -> bool:
# 自定义启动逻辑
return super().start()
def wait_for_completion(self) -> bool:
# 自定义等待逻辑
return super().wait_for_completion()
def close(self) -> bool:
# 自定义关闭逻辑
return super().close()- 工厂模式:
ExecutorFactory负责创建执行器实例 - 策略模式:不同的执行器实现不同的策略
- 配置驱动:所有行为由配置文件控制
程序启动
↓
加载配置文件 (config.json)
↓
创建配置管理器 (ConfigManager)
↓
创建日志记录器 (Logger)
↓
创建任务调度器 (TaskScheduler)
↓
┌───────────────────────┐
│ 等待到预定时间 │
└───────────┬───────────┘
↓
┌───────────────────────┐
│ 执行所有任务 │
│ ┌───────────────┐ │
│ │ 遍历程序列表 │ │
│ └───────┬───────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ 创建执行器 │ │
│ └───────┬───────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ 启动程序 │ │
│ └───────┬───────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ 等待完成 │ │
│ └───────┬───────┘ │
│ ↓ │
│ ┌───────────────┐ │
│ │ 关闭程序 │ │
│ └───────────────┘ │
└───────────┬───────────┘
↓
等待到下次执行时间
↓
(循环)
┌─────────────────────────┐
│ ConfigManager │
│ - scheduler_config │
│ - program_configs │
└───────────┬─────────────┘
│
│ 使用
↓
┌─────────────────────────┐
│ TaskScheduler │
│ - config_manager │
│ - executor_factory │
└───────────┬─────────────┘
│
│ 使用
↓
┌─────────────────────────┐
│ ExecutorFactory │
│ - executor_map │
└───────────┬─────────────┘
│
│ 创建
↓
┌─────────────────────────┐
│ GameTaskExecutor │◁────────────┐
│ - config │ │
│ - process │ │
└───────────┬─────────────┘ │
│ │
│ 继承 │ 继承
┌───────┼───────┬───────────┐ │
↓ ↓ ↓ ↓ │
BetterGI March7 ZZZ Custom │
Executor Executor Executor Executor ───┘
程序会在 logs/ 目录下生成日志文件,文件名格式:scheduler_YYYYMMDD_HHMMSS.log
日志内容示例:
日志开始时间:2026-03-19 13:03:23
================================================================================
[2026-03-19 13:03:23] 调度器启动
[2026-03-19 13:03:25] [BetterGI] 启动程序:D:\Games\BetterGI\BetterGI.exe
[2026-03-19 13:03:30] [BetterGI] 程序启动成功
[2026-03-19 13:05:00] [BetterGI] 程序执行完成
[2026-03-19 13:05:01] [BetterGI] 程序已正常关闭
[2026-03-19 13:05:03] 调度器停止
A: 检查 config.json 中的 executable_path 是否配置正确,确保路径使用双反斜杠 \\ 或正斜杠 /。
A: 在 config.json 的 scheduled_times 数组中添加时间,例如:["00:00", "12:00", "20:00"]。
A: 将该程序的 enabled 配置改为 false,无需删除配置。
A:
- 定时模式:在指定的时间点执行(如每天 9:00、20:00)
- 循环模式:每隔固定时间间隔执行一次(如每隔 1 小时)
A: 日志文件保存在 logs/ 目录下,使用文本编辑器即可查看。
本项目仅供学习和个人使用。
如需添加新功能或修复 bug,请遵循以下步骤:
- Fork 项目
- 创建功能分支
- 提交更改
- 推送到分支
- 创建 Pull Request
如有问题或建议,请通过以下方式联系:
- 提交 Issue
- 发送邮件至开发者邮箱
最后更新时间:2026-03-19