Skip to content

Repository files navigation

课铃(CourseBell)—— AstrBot 课程提醒插件

Version License Python

直接读取本地文件夹中的课表文件,以 3:4 比例图片展示今日/明日/本周/下周课表,支持课前提醒与每日定时推送。

使用提示:本插件不依赖用户上传课表文件。只需把 .ics 课表文件放入指定文件夹,发送 /绑定课表 选择文件即可;文件名以用户 ID 开头时无需绑定、自动匹配。

观前提示

本插件大量使用AI

功能概览

  • 本地文件夹课表:直接读取本地文件夹中的 .ics 文件(可在插件配置中指定路径),放入新文件即刻生效,无需重载插件;也支持在绑定流程中直接上传 .ics 文件,下载到文件夹并自动绑定。
  • 3:4 比例课表图片:今日/明日/本周/下周课表渲染为 3:4 比例的竖屏图片。画布尺寸随渲染环境自适应——兼容本地 Playwright 与远程 t2i 渲染服务的任意 viewport;内容自适应缩放,课少时字体自动放大填满画布,课多时自动缩小保证完整、不丢课程;未安装 Playwright 时自动降级为文本。
  • 按周次显示课程:自动识别课表中的周次信息(如「2-16周」「4-5周,7-12周」「单周」「双周」),第 N 周只显示当周实际有课的课程;插件配置 term_start_date 可设置学期开始日期(留空自动推断),周课表副标题显示「第N周」。
  • 日期倒计时:设置考研、期末等日期倒计时,支持每日通知每周通知(每周一),并显示在课表图片上。
  • 调休课表映射:把某天的课调为另一天的课表(如 /设置调休 09-27=10-07),或直接设为放假;查询、推送、课前提醒全部按调休后的课表执行。
  • 课前提醒:每 60 秒扫描课表,开课前 N 分钟(默认 15,可配置 1-120)自动推送提醒,同一节课只提醒一次。提醒只在绑定课表的群聊中推送(私聊绑定则推送到私聊,群聊绑定则推送到对应群聊)。
  • 每日定时推送:每天指定时间(如 07:00)自动推送当日课表;定时任务持久化,插件重启后自动恢复。推送只在绑定课表的群聊中生效
  • 自动匹配绑定:文件名以用户 ID 开头的课表文件(如 123456.ics)自动匹配用户,无需手动绑定。
  • 示例课表:一键生成示例课表(含一节 20 分钟后开始的测试课),快速体验提醒与推送功能。
  • ICS 兼容:支持重复课程(RRULE)展开、EXDATE 排除、东八区时间换算;重复事件解析失败时自动降级为单次事件,不丢课。

快速安装

前置要求

  • AstrBot >= 4.19.4
  • Python 3.9+
  • 可选:Playwright 渲染环境(用于输出竖屏课表图片;未安装时自动降级为文本消息,功能不受影响)

安装方式

从文件安装:在插件界面右下角点击加号,选择「从文件安装」,上传本仓库 Releases 中的 astrbot_plugin_coursebell.zip

链接安装:在插件界面右下角点击加号,选择「从链接安装」,输入:

https://github.com/Lillna-Rina/astrbot_plugin_coursebell

依赖会按 requirements.txt 自动安装(icalendarpython-dateutiltzdata)。

最小配置

插件配置中可设置:

  • ics_dir:本地课表文件夹路径(支持绝对路径如 D:/课表~/ 开头路径,或相对 AstrBot 运行目录的路径);
  • 留空时使用插件数据目录下的 ics 文件夹(data/plugin_data/astrbot_plugin_coursebell/ics/),直接把 .ics 文件放进去即可;
  • 文件夹无法创建或写入时会自动回退到默认目录,并在 /课表文件 中显示警告。
  • term_start_date学期开始日期(校历第一周周一,格式 YYYY-MM-DD,如 2026-08-31)。设置后插件按周次过滤课程(课表中的「2-16周」「单周」等标注生效),周课表显示「第N周」;留空时自动以课表文件中最早课程的所在周作为第一周。

常用入口:

绑定与推送范围

课表绑定是按用户在特定会话中绑定的:

  • 群聊中使用 /绑定课表 → 绑定该群聊,课前提醒、每日推送、倒计时通知只会推送到该群聊
  • 私聊中使用 /绑定课表 → 绑定私聊,推送只发到私聊
  • 同一个用户可以在不同群聊中绑定不同的课表文件,互不影响
  • /今日课表 等查询命令在任何会话中都可使用(只要该用户已在某处绑定过课表)
  • 个人建议:只在私聊使用,群聊可能会有bug

推送不会全局广播:如果你在 A 群绑定了课表,只有 A 群会收到推送,B 群不会收到。

常用命令

命令 说明 示例
/绑定课表 列出文件夹中的课表文件并绑定 /绑定课表 后回复文件名
/绑定课表 [文件名] 直接绑定指定文件 /绑定课表 我的课表.ics
/课表文件 查看文件夹中的所有 .ics 文件 /课表文件
/删除课表 解除绑定(不删除本地文件) /删除课表
/今日课表 输出今日课表 /今日课表
/明日课表 输出明日课表 /明日课表
/本周课表 输出本周课表 /本周课表
/下周课表 输出下周课表 /下周课表
/设置提醒时间 设置课前提醒提前分钟数 /设置提醒时间 后回复 15
/设置每日推送 设置每日定时推送课表 /设置每日推送 后回复 开启 07:00关闭
/设置倒计时 设置日期倒计时(支持每日/每周通知) /设置倒计时 考研 2026-12-26 每日 08:00
/倒计时 查看全部倒计时与剩余天数 /倒计时
/删除倒计时 删除指定倒计时 /删除倒计时 考研
/设置调休 把某天调为另一天的课表,或设为放假 /设置调休 09-27=10-07/设置调休 10-07=放假
/查看调休 查看全部调休规则 /查看调休
/删除调休 删除某天的调休规则 /删除调休 09-27
/清空调休 清空全部调休规则 /清空调休
/查看设置 查看当前绑定与配置 /查看设置
/示例课表 生成示例课表并绑定 /示例课表
/课表帮助 查看指令列表 /课表帮助

所有指令均支持简短别名:/today/tomorrow/week/nextweek/bind/unbind/files/sample/settings/help

日期倒计时

/设置倒计时 考研 2026-12-26             # 默认每日通知(08:00)
/设置倒计时 考研 2026-12-26 每周         # 每周一通知
/设置倒计时 期末 2027-01-10 每日 20:00   # 指定通知时间
/设置倒计时 考研 2026-12-26 关闭         # 只记录不通知
/倒计时                                 # 查看全部(含剩余天数)
/删除倒计时 考研
  • 日期支持 2026-12-262026/12/2612-26(只写月日时自动判断年份)
  • 通知任务持久化保存,插件重启后自动恢复
  • 「今日课表」图片顶部会显示最近一个倒计时
  • 倒计时通知只在绑定课表的群聊中推送(私聊绑定推送到私聊,群聊绑定推送到对应群聊)

调休课表映射

/设置调休 09-27=10-07     # 9月27日按 10月7日 的课表上课(补课)
/设置调休 10-07=放假      # 10月7日放假无课
/查看调休
/删除调休 09-27
/清空调休

规则生效后:

场景 行为
查询 9月27日课表 显示 10月7日 的课程(日期平移到当天,上课时刻不变)
查询 10月7日课表 显示「🚫 放假」,无课
每日推送 按调休后的课表推送;放假日推送空课表
课前提醒 调休日的课正常提醒;放假日不提醒
周课表 对应日期标注「🔄 调休」/「🚫 放假」

设计说明:采用单向映射 + 显式放假(而非 A↔B 双向交换)——补课日上被调那天的课、放假日休息, 符合真实调休语义,也避免了双向映射时的循环歧义。如需两天互换,分别设置两条规则即可。

数据存储

  • 课表文件:你指定的本地文件夹(插件只读);
  • 绑定信息与设置:data/plugin_data/astrbot_plugin_coursebell/bindings.json(插件重装/更新不会丢失);
  • 文件变更自动检测:每次读取前对比文件修改时间与大小,替换文件后无需任何操作即生效。

项目结构

astrbot_plugin_coursebell/
├── main.py                 # 插件主入口(命令、提醒循环、每日推送、倒计时)
├── ics_parser.py           # ICS 解析(RRULE 展开、周次过滤、EXDATE、时区换算)
├── schedule_engine.py      # 课表查询、调休映射与提醒命中引擎
├── command_parsers.py      # 指令参数解析(倒计时 / 调休)
├── storage.py              # 绑定信息与本地文件管理
├── render_templates.py     # 竖屏课表图片 HTML 模板
├── sample_ics.py           # 示例课表生成器
├── course_types.py         # 数据模型
├── _conf_schema.json       # 配置 Schema(ics_dir、term_start_date)
├── metadata.yaml           # 插件元数据
├── requirements.txt        # 依赖清单
└── logo.png                # 插件图标

贡献

欢迎提交 IssuePull Request

许可证

MIT License - 详见 LICENSE

常见问题

  • 课表输出为文本而不是图片:AstrBot 未安装 Playwright 渲染环境,功能不受影响;安装 Playwright 后即可获得竖屏图片。
  • 文件夹中没有文件:确认 .ics 文件已放入配置的文件夹(可在 WebUI 插件配置中查看路径),并发送 /绑定课表
  • 示例课表失败:查看 /课表文件 是否提示目录回退;插件会自动回退到数据目录并继续生成。
  • 时区:插件固定按东八区(Asia/Shanghai)计算日期与提醒时间。

About

课铃(CourseBell):AstrBot 课程提醒插件,直接读取本地文件夹中的课表文件,展示今日/明日/本周/下周课表,支持课前提醒与每日定时推送。

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages