536 字
3 分钟
企微机器人推送课表
2025-10-07
2025-10-03
浏览量:加载中...访问次数:加载中...

前提条件#

  1. 需要一份准备好的ics文件(通用日历格式)
  2. 需要企业微信机器人WebHook地址
  3. 需要安装NodeJS
  4. 一个聪明的大脑

先上脚本#

Workers.mjs
// by 鈴奈咲桜
import ical from "node-ical";
import schedule from "node-schedule";
import axios from "axios";
import fs from "fs";
const icsPath = "./kebiao.ics"; // 你的课表文件
const webhookUrl =
"https://your.wechat.webhook"; // webhook地址
const data = fs.readFileSync(icsPath, "utf8");
const events = ical.parseICS(data);
console.log("==== 上课提醒任务 ====");
let upcoming = []; // 保存未来所有提醒
for (let k in events) {
const ev = events[k];
if (ev.type === "VEVENT") {
let startTimes = [];
if (ev.rrule) {
startTimes = ev.rrule.all();
} else if (ev.start) {
startTimes = [ev.start];
}
for (let start of startTimes) {
const remindTimes = [
new Date(start.getTime() - 30 * 60 * 1000), // 提前 30 分钟
new Date(start.getTime() - 15 * 60 * 1000), // 提前 15 分钟
];
for (let remindTime of remindTimes) {
if (remindTime > new Date()) {
upcoming.push({ ev, start, remindTime });
}
}
}
}
}
// 按提醒时间排序
upcoming.sort((a, b) => a.remindTime - b.remindTime);
if (upcoming.length === 0) {
console.log("近期没有需要提醒的课程。");
} else {
// 最近的一次提醒
const first = upcoming[0];
console.log(
`最近提醒: ${first.ev.summary} | 上课时间: ${first.start.toLocaleString()} | 提醒时间: ${first.remindTime.toLocaleString()}`
);
// 启动时推送一次测试提醒
await sendReminder(first.ev, first.start, true);
// 注册所有提醒
for (const { ev, start, remindTime } of upcoming) {
schedule.scheduleJob(remindTime, () => sendReminder(ev, start, false));
}
}
console.log("========================");
async function sendReminder(ev, start, isTest = false) {
const header = isTest ? "[本次为测试提醒(可以不理会)]\n" : "**上课提醒**\n";
const text =
`${header}` +
`课程:${ev.summary}\n` +
`地点:${ev.location}\n` +
`时间:${start.toLocaleString()}`;
const payload = {
msgtype: "markdown",
markdown: {
content: text,
},
};
try {
const res = await axios.post(webhookUrl, payload, {
headers: { "Content-Type": "application/json" },
});
console.log("提醒已发送:", text);
console.log("服务器返回:", res.data);
} catch (err) {
console.error("发送失败:", err.message);
if (err.response) {
console.error("响应状态:", err.response.status);
console.error("响应内容:", err.response.data);
}
}
}

使用方法#

  1. 在一个空文件夹创建上述脚本,并修改webhook地址
  2. 准备你的ics文件将其改名为 kebiao.ics 放在 Workers.mjs 相同的文件夹下
  3. 运行脚本
Terminal window
node Workers.mjs

就这么简单,可能从哪里搞ics文件比较有难度,不过直接把你的课表喂给ai生成即可


文章编辑:@鈴奈咲桜

企微机器人推送课表
https://blog.sakura.ink/posts/icskebiaotixing/
作者
鈴奈咲桜
发布于
2025-10-07
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时