适用学校:广东建设职业技术学院(广州校区 / 清远校区) 目标系统:岗位实习管理信息系统(学校教务实习子系统) 运行环境:Windows 10+(打包版双击即用,无需 Python)
一次性补写整个实习周期的实习日记,并批量提交到学校岗位实习管理信息系统。与日常签到主脚本 gdcvi-checkin 相互独立、互不影响。
- 按星期智能生成:工作日写办公室日常、周末写生活场景、法定节假日注入假期场景(内置
holidays.txt) - 多批次自动选择:解析下拉框全部批次及起止日期,每篇按日记日期自动落到对应批次,无覆盖时兜底当前批次并提示
- 分批流水线:线程池并发生成 + 串行提交 + 随机间隔,降低元数据集中度
- 断点续跑:每篇结果即时落盘
diary_batch_state.json,中断/失败后重跑自动跳过已成功项,只补缺 - 两道安全闸:
--dry-run全量预演 + 大写YES确认(日记无删除入口,提交即永久) - 配置驱动:
config.json+ 命令行覆盖,正式运行无需逐项问答 - 单实例锁:Windows 命名 mutex,重复双击不会开多实例并发提交
环境要求
| 项 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11(打包版) |
| 源码运行 | Python 3.9+(需 cancel_futures),依赖 requests>=2.32.0 |
| LLM 接口 | OpenAI 兼容(NewAPI / OneAPI 等聚合网关均可) |
| 网络 | 能访问学校实习系统与 LLM API |
打包版双击 dist\diary_batch_submit.exe 即用;源码运行 python diary_batch_submit.py。
| 命令 | 用途 |
|---|---|
diary_batch_submit.exe --init |
首次配置:交互引导,写入 config.json(账号 / LLM / batch) |
diary_batch_submit.exe --test |
生成 1 篇看质量,不登录不提交 |
diary_batch_submit.exe --test --date 2026-08-26 |
测指定日期(看不同星期 / 节假日场景) |
diary_batch_submit.exe --dry-run |
走完全量生成 + 统计,不提交(验证生成链路) |
diary_batch_submit.exe |
正式批量:输大写 YES 后才开始提交 |
典型顺序:--init(首次)→ --test(验质量)→ --dry-run(验全量)→ 正式跑。
1. 单实例锁检查(已有实例在跑 → 提示退出)
2. 读 config.json + 命令行覆盖 → 打印参数总览
3. 登录(显示「姓名(学号)」;失败立即退出,防锁号)
4. 解析实习批次列表(只读,含各批次起止日期)
5. 当月日历查重(服务端仅能判断当月)
6. 打印待提交篇数(跨批次时列出各批次篇数)
┌─────────────────────────────────────┐
7. │ 输入大写 YES ★(唯一确认闸,不输不提交)│
└─────────────────────────────────────┘
8. 分批流水线(每批 batch_size 篇):
① 线程池并发生成本批(gen_workers 路,单篇重试 3 次)
② 串行提交本批(篇间随机 gap 秒,每篇结果即时写 state)
③ 批间随机停顿 pause 秒
9. 全部完成 → 打印统计(成功 / 判重 / 失败)
- Ctrl+C:随时中断。排队中的生成任务立即取消,已提交的已存盘,重跑自动跳过已成功项
- 进程异常退出:已落盘的结果保留,重跑只补缺
- 生成失败的单篇:标记
failed落盘,不影响整批;重跑时failed不算完成,会重新生成
190 篇约 35-40 分钟(默认激进档:并发 4 线程、gap 3-8s、pause 15-30s)。提交节奏是瓶颈,加速生成无意义;想更快可调小 gap / pause。
位置:exe 同目录(或脚本目录)。首次用 --init 生成,也可手动编辑。
{
"version": 2,
"accounts": [
{"student_id": "YourStudentID", "password": "YourPassword123"}
],
"llm": {
"api_base": "http://your-newapi-host:3000/v1",
"api_key": "sk-xxxxxxxx",
"model": "your-model-name",
"prompt": "",
"timeout_sec": 60
},
"batch": {
"start": "2026-07-13",
"end": "2027-01-18",
"weekday_mode": 1,
"holiday_mode": 3,
"batch_size": 10,
"gen_workers": 4,
"gap": [3, 8],
"pause": [15, 30]
}
}上例中的学号 / 密码 / API key / 域名均为占位符,请替换为真实值。该文件含明文凭证,勿外传。
accounts
| 字段 | 说明 |
|---|---|
student_id |
学号 |
password |
登录密码(明文) |
llm
| 字段 | 说明 |
|---|---|
api_base |
OpenAI 兼容 API 地址,结尾保留 /v1 |
api_key |
API 密钥 |
model |
模型名(NewAPI 中的模型 / 渠道别名) |
prompt |
自定义系统提示词;留空用内置 DEFAULT_LLM_PROMPT |
timeout_sec |
单次 LLM 请求超时秒数 |
batch
| 字段 | 说明 | 默认 |
|---|---|---|
start / end |
实习起止日期(YYYY-MM-DD) | 2026-07-13 / 2027-01-18 |
weekday_mode |
1=每天 2=仅工作日 3=周一到周六 | 1 |
holiday_mode |
1=照常写 2=跳过 3=注入节假日场景 | 3 |
batch_size |
每批篇数(生成 → 提交 → 停顿) | 10 |
gen_workers |
并发生成线程数(1-8) | 4 |
gap |
提交篇间隔随机区间(秒) | [3, 8] |
pause |
批间停顿随机区间(秒) | [15, 30] |
均覆盖 config,单次生效。
| 参数 | 说明 |
|---|---|
--init |
交互式配置引导,写入 config.json |
--test |
生成 1 篇看质量(不登录不提交) |
--date YYYY-MM-DD |
--test 指定日期(默认 batch.start) |
--dry-run |
全量生成 + 统计,不提交 |
--start / --end |
覆盖起止日期 |
--weekday N |
覆盖星期规则(1/2/3) |
--holiday N |
覆盖节假日模式(1/2/3) |
--batch-size N |
覆盖每批篇数 |
--gap A-B |
覆盖篇间隔(如 --gap 5-10) |
--pause A-B |
覆盖批间停顿 |
--workers N |
覆盖并发生成线程数(1-8) |
--student-id |
覆盖学号(用 config 里同账号的密码) |
安全机制
- 提交即永久:日记无删除入口。正式提交前必须输入大写
YES - dry-run 预演:走完登录 + 查重 + 全量生成,不提交
- 断点续跑:每篇结果实时写
diary_batch_state.json - Ctrl+C:随时中断,已提交的已保存,排队任务立即取消
- 登录失败立即退出:不重试(连续错 5 次锁号 5 分钟)
- 单实例锁:Windows 命名 mutex,防止重复双击开多实例
- 会话失效自动重登:提交途中会话过期自动重登 1 次(令牌刷新),仍失败记 state 继续
已知边界
- 日历查重仅能判断当月:服务端限制,早期月份若已有日记会重提、被服务端判重复(DUP 标记,无害但耗时)
- 多批次按日期自动选择:批次下拉框选项自带起止日期,每篇提交到覆盖该日的批次;不在任何批次范围内的日期兜底用当前批次(计划概览会
[!]提示) - 未来日期:可直接提交(已实测);日记入库日期为目标日期,非提交当天
- 节假日列表:内置
holidays.txt(同目录),每行一个yyyy-MM-dd,#后为注释;holiday_mode=3时命中节假日的日期换用假期场景提示词
常见问题排查
| 现象 | 排查 |
|---|---|
LLM 403(AllocationQuota.FreeTierOnly) |
NewAPI 渠道上游免费额度耗尽。用同一 key 逐模型实测(GET /v1/models 后逐个 POST chat)定位是账户级还是单渠道,换可用模型或修上游 |
| exe 双击闪退 | 命令行运行看报错;常见为打包时漏装运行依赖 requests(exe 体积异常小是信号) |
| 生成全失败 | 先 --test 验证 LLM 链路,API 正常后再跑批量 |
| 多个 cmd 窗口 | 旧版无单实例锁,连点导致多实例并发;新版已用 mutex 锁,重复开会被拒 |
| 提交被判 DUP | 该日期日历已有日记(当月)或主脚本已写过(早期月份);无害,重跑会自动跳过 |
diary-batch/
├── diary_batch_submit.py # 主脚本(子命令 + 分批流水线 + 线程池)
├── diary_batch_state.json # 断点续跑状态(运行后生成)
├── config.json # 配置(--init 生成或手动编辑;含明文凭证)
├── holidays.txt # 法定节假日列表(可选,可自行追加)
├── README.md # 本文档
└── dist/
├── diary_batch_submit.exe # 打包版(双击即用)
└── config.json # 打包版的配置(同目录)
打包前确保打包用的 Python 已装 requests 与 pyinstaller:
env -u CODEBUDDY_SESSION_ID -u CLAUDE_SESSION_ID python -m pip install "requests>=2.32.0" pyinstaller
env -u CODEBUDDY_SESSION_ID -u CLAUDE_SESSION_ID python -m PyInstaller --onefile --console \
--name diary_batch_submit --collect-all requests diary_batch_submit.py --noconfirm产物:dist\diary_batch_submit.exe。
- 打包后用
./dist/diary_batch_submit.exe --help验证 import 链(看 banner 是否出现) - 清
CODEBUDDY_SESSION_ID/CLAUDE_SESSION_ID是为绕过本机 safe-delete 对os.remove的拦截(详见.workbuddy/memory日志) - 清理旧产物(build / .spec / 旧 exe)也用清了 SESSION_ID 的 Python(
shutil.rmtree/os.remove),勿用 bashrm
本工具用 LLM 批量生成实习日记并提交学校系统,属于学术诚信灰色地带:
- 日记内容由 AI 生成,非真实实习记录
- 提交元数据(连续 ID、集中时间戳)可能被教师后台识别
- 一旦提交无法删除,提交即永久
使用者须自行承担相应后果。工具开发者不鼓励、不建议伪造实习记录,仅在技术层面提供维护。提交与否、提交多少,由使用者自行决定。