--- title: "集成指南" description: "AutoScript 与定时任务集成 - 执行流程、作用域与最佳实践" --- 了解如何将 AutoScript 脚本集成到定时任务中,以及脚本的执行时机、作用范围和注意事项。 ## 执行流程 当定时任务触发时,AutoLibrary 按以下顺序执行: 1. **读取配置**:从用户配置文件中读取所有用户分组的预约参数 2. **遍历用户组**:对每个启用的用户组,遍历其中的每个启用用户 3. **执行 AutoScript**:对每个用户运行 AutoScript 脚本,动态调整变量值 4. **执行定时任务**:使用调整后的参数运行预约/签到/续约操作 ```text 定时任务触发 │ ├─ 用户组 A │ ├─ 用户 1 → 执行 AutoScript → 预约/签到/续约 │ └─ 用户 2 → 执行 AutoScript → 预约/签到/续约 │ └─ 用户组 B ├─ 用户 3 → 执行 AutoScript → 预约/签到/续约 └─ 用户 4 → 执行 AutoScript → 预约/签到/续约 ``` ## 作用域 AutoScript 脚本的作用域限定为单个用户的单次执行: - **每次执行独立**:脚本对每个用户独立运行,不同用户之间互不影响 - **不修改配置文件**:脚本对变量的修改仅存在于内存中,不会回写到 `user.json` - **下次执行重置**:下次定时任务触发时,从配置文件重新读取原始值 ## 配置方式 ### 在定时任务中指定脚本 点击主界面底部的 [] 按钮。 点击 [**添加任务**] 创建新任务,或右键现有任务选择 [**编辑**]。 在编辑对话框中找到 [**AutoScript**] 区域,点击 [**编辑**] 按钮打开内置代码编辑器编写脚本。 脚本编写完成后直接内嵌保存至定时任务配置,无需管理外部文件。 点击 [**确认**] 保存任务配置。 {/* TODO: 添加定时任务 AutoScript 配置截图 */} ![定时任务 AutoScript 配置](/images/v1.4.0/timer-autoscript-config.png) ## 典型示例 ### 示例 1:始终预约明天的座位 ```lua -- 将预约日期设为明天 RESERVE_DATE = dateadd(datenow(), 1) -- 设置固定时间段 RESERVE_BEGIN_TIME = time(9, 0) RESERVE_END_TIME = time(21, 0) ``` ### 示例 2:根据星期调整预约策略 配合定时任务的重复执行功能,可以为不同日子设置不同的预约参数。如果你需要基于实际星期进行判断,可以在脚本中根据日期特性调整: ```lua -- 始终预约明天 RESERVE_DATE = dateadd(datenow(), 1) -- 默认时间段 RESERVE_BEGIN_TIME = time(9, 0) RESERVE_END_TIME = time(21, 0) ``` ### 示例 3:条件性跳过用户 ```lua -- 如果当前时间已经超过上午 10 点,跳过该用户 if timenow() > time(10, 0) then USER_ENABLE = false end ``` ### 示例 4:根据用户名差异化配置 ```lua if USERNAME == "20250101001" then -- 用户 A 的预约策略 RESERVE_BEGIN_TIME = time(8, 0) RESERVE_END_TIME = time(20, 0) end ``` ## 最佳实践 ### 先调试,后配置 在将脚本关联到定时任务之前,使用编辑器的调试运行功能在模拟数据上验证脚本逻辑。 ### 保持脚本简洁 每个脚本只关注一个明确的目标,避免在一个脚本中处理过多复杂逻辑。如果需要针对不同用户组执行不同逻辑,建议为每个用户组创建独立的定时任务。 ### 注意沙箱限制 AutoScript 运行在受限的沙箱环境中,不能访问文件系统或执行系统命令。如果脚本需要外部数据(如个人日程表),请使用条件判断和工具函数实现。 ### 验证类型兼容性 确保所有赋值操作的类型与目标变量声明的类型一致。类型错误会导致脚本执行失败并跳过该用户。 ### 处理边缘情况 编写脚本时考虑边缘情况: ```lua -- 确保开始时间不早于 7:30 if RESERVE_BEGIN_TIME < time(7, 30) then RESERVE_BEGIN_TIME = time(7, 30) end -- 确保结束时间不晚于 22:30 if RESERVE_END_TIME > time(22, 30) then RESERVE_END_TIME = time(22, 30) end ```