将 Moodle 平台上 Timeline 中的事件(作业、测验截止日期等)自动同步到 Microsoft To Do 的指定列表中,并设置提前 24 小时的提醒。
- 从 Moodle Timeline 获取未来 N 天内的所有事件
- 自动在 Microsoft To Do 中创建对应任务
- 任务包含:课程名 + 事件名、截止日期、提前 24h 的闹钟提醒
- 课程别名:为冗长的课程名设置简短别名(如 "网安"),任务标题自动替换
- 本地 JSON 去重,避免重复创建
- Microsoft Token 缓存,避免重复登录
- Docker 部署:支持容器化部署,定时自动同步
只需你的 Moodle 用户名和密码即可。工具会通过 Moodle Mobile 接口 (/login/token.php) 自动获取 API Token,无需手动申请安全密钥。
- 访问 Azure Portal - 应用注册
- 点击 新注册
- 填写:
- 名称:
Moodle2MSTodo(随意) - 受支持的账户类型: 选择 个人 Microsoft 帐户
- 重定向 URI: 留空(设备代码流不需要)
- 名称:
- 点击 注册,记下 应用程序(客户端) ID
- 进入 身份验证 页面:
- 在 高级设置 中,将 允许公共客户端流 设为 是
- 点击 保存
- 进入 API 权限 页面:
- 点击 添加权限 → Microsoft Graph → 委托的权限
- 搜索并添加
Tasks.ReadWrite - 点击 授予管理员同意(如果可用,个人账号可能不需要)
首次运行时程序会交互式引导你完成所有配置(Moodle 登录、Azure Client ID、课程别名、To Do 列表选择),无需手动编辑配置文件。
如果你希望手动配置,可以复制模板并编辑:
cp config.example.json config.json{
"moodle": {
"url": "https://ispace.uic.edu.cn"
},
"microsoft": {
"client_id": "你的Azure应用客户端ID"
},
"sync": {
"todo_list_name": "Moodle Assignments",
"reminder_hours_before": 24,
"days_ahead": 30,
"timezone": "Asia/Shanghai"
}
}| 配置项 | 说明 |
|---|---|
moodle.url |
你的 Moodle 平台地址(已预填 UIC) |
microsoft.client_id |
Azure 应用的客户端 ID(首次运行时会交互询问) |
sync.todo_list_name |
To Do 中的目标列表名称(不存在会自动创建) |
sync.reminder_hours_before |
提前多少小时提醒(默认 24) |
sync.days_ahead |
获取未来多少天的事件(默认 30) |
sync.timezone |
时区(默认 Asia/Shanghai) |
可选: 如果你有手动获取的 Moodle Web Service Token,可以在
moodle中添加"token": "你的Token"字段跳过登录提示。
# 安装依赖
pip install -r requirements.txt
# 运行同步
python main.py运行时会依次完成以下步骤:
1. Moodle 登录(在终端中输入):
请输入你的 Moodle 账号信息:
用户名: your_student_id
密码: (隐藏输入)
2. 课程别名设置(首次运行或出现新课程时):
==================================================
设置课程别名
==================================================
以下课程尚未设置别名 (直接回车跳过,保持原名):
「Computer and Network Security (1002) (Dr. Donald Donglong CHEN) [Semester 2 of 2025-2026]」
别名: 网安
设置后,任务标题将显示为 [网安] Assignment 1 而非完整课程名。别名保存在 CourseAlias.json 中:
{
"12345": {
"original_name": "Computer and Network Security (1002) (Dr. Donald Donglong CHEN) [Semester 2 of 2025-2026]",
"alias": "网安"
}
}- 直接回车跳过的课程不会被重复询问
- 所有课程都已设置别名时,此步骤自动跳过
3. Microsoft 登录(在浏览器中完成,首次需要,后续自动缓存):
============================================================
Microsoft 登录认证
============================================================
请在浏览器中访问: https://microsoft.com/devicelogin
并输入代码: XXXXXXXX
============================================================
支持通过 Docker 容器化部署到云服务器,实现定时自动同步。
1. 编辑 docker-compose.yml
填写你的 Azure 应用 Client ID,以及可选的 Moodle Token:
environment:
MS_CLIENT_ID: "你的Azure应用客户端ID"
MOODLE_TOKEN: "你的Moodle Token(可选,留空则首次交互登录)"2. 构建镜像
docker compose build3. 首次交互设置
docker compose run -it moodle-sync python entrypoint.py --once此命令会以交互模式引导你完成:
- Moodle 账号登录(获取并保存 Token)
- 课程别名设置
- Microsoft 账号认证(Device Code Flow,在浏览器中完成)
- To Do 目标列表选择
所有配置和认证信息会保存到 ./data/ 目录,后续自动同步时直接使用。
4. 启动定时同步
docker compose up -d容器将在后台运行,默认每小时自动同步一次。
5. 查看日志
docker compose logs -f moodle-sync所有环境变量均为可选。非空值会覆盖 config.json 中的对应配置,空值("")不会覆盖,因此首次交互设置的结果会被保留。
| 环境变量 | 说明 | 默认值 |
|---|---|---|
MOODLE_URL |
Moodle 平台地址 | https://ispace.uic.edu.cn |
MOODLE_TOKEN |
Moodle API Token(留空则首次交互获取) | "" |
MS_CLIENT_ID |
Azure 应用客户端 ID(留空则首次交互询问) | "" |
SYNC_INTERVAL_HOURS |
同步间隔(小时) | 1 |
SYNC_DAYS_AHEAD |
获取未来多少天的事件 | 30 |
SYNC_TIMEZONE |
时区 | Asia/Shanghai |
TODO_LIST_NAME |
To Do 目标列表名称 | Moodle Assignments |
REMINDER_HOURS |
提前多少小时提醒 | 24 |
容器通过目录映射 ./data:/app/data 持久化以下文件:
| 文件 | 用途 |
|---|---|
config.json |
合并后的完整配置 |
synced_state.json |
同步状态记录(去重) |
CourseAlias.json |
课程别名映射 |
token_cache.bin |
Microsoft Token 缓存 |
Microsoft Token 过期后,容器日志会输出 Device Code 认证链接和代码:
请在浏览器中访问: https://microsoft.com/devicelogin
并输入代码: XXXXXXXX
在任意设备的浏览器中完成认证即可,新 Token 会自动缓存到 ./data/token_cache.bin。
| 文件 | 用途 |
|---|---|
main.py |
入口脚本,串联同步流程 |
moodle_client.py |
Moodle Web Services API 客户端 |
ms_todo_client.py |
Microsoft Graph API 客户端(To Do) |
sync_state.py |
本地同步状态管理(去重) |
entrypoint.py |
Docker 入口,环境变量合并 + 定时调度 |
Dockerfile |
容器镜像定义 |
docker-compose.yml |
容器编排配置 |
.dockerignore |
Docker 构建排除规则 |
config.json |
用户配置(不要提交到 Git) |
config.example.json |
配置模板 |
CourseAlias.json |
课程别名映射(自动生成,不要提交到 Git) |
synced_state.json |
同步状态记录(自动生成) |
token_cache.bin |
Microsoft Token 缓存(自动生成) |
如果你需要将本地构建的镜像推送到 rinsutoringu/moddle2mstodo:
# 1. 登录 Docker Hub
docker login
# 2. 构建并打 tag(同时打 latest 和版本号)
docker build -t rinsutoringu/moddle2mstodo:latest -t rinsutoringu/moddle2mstodo:1.0.0 .
# 3. 推送所有 tag
docker push rinsutoringu/moddle2mstodo --all-tags只推单个 tag 的话:
docker push rinsutoringu/moddle2mstodo:latest