将多所高校院系的「通知公告」网页抓取并转换为 RSS 订阅源的 Node.js 服务。基于 Express + axios + cheerio + rss 实现,所有请求需携带 key 令牌校验。
| 编号 | 名称 | 路径 | 数据源 URL |
|---|---|---|---|
| 1 | 浙大计算机 | /rss/zju |
http://www.cs.zju.edu.cn/csen/27006/list.htm |
| 2 | 浙大生仪 | /rss/zju-bme |
http://www.cbeis.zju.edu.cn/tzgg_65358/list.htm |
| 3 | 北大计算机 | /rss/pku-cs |
https://cs.pku.edu.cn/zsxx/yjszs.htm |
| 4 | 清华计算机 | /rss/tsinghua-cs |
https://www.cs.tsinghua.edu.cn/zszp/zsxx.htm |
| 5 | 上海交大计算机 | /rss/sjtu-cs |
https://www.cs.sjtu.edu.cn/bsyjs_zsgz.html |
| 6 | 南大计算机 | /rss/nju-cs |
https://cs.nju.edu.cn/1702/list.htm |
| 7 | 上科大信息 | /rss/shanghaitech-sist |
https://sist.shanghaitech.edu.cn/tzgg/list.htm |
| 8 | 上海交大生仪 | /rss/sjtu-bme |
https://bme.sjtu.edu.cn/Web/Notice/11 |
| 9 | 北大人工智能研究院 | /rss/pku-ai |
https://www.ai.pku.edu.cn/xwgg1/tzgg.htm |
| 10 | 清华智能产业研究院(AIR) | /rss/tsinghua-air |
https://air.tsinghua.edu.cn/lby.jsp?urltype=tree.TreeTempUrl&wbtreeid=1007 |
| 11 | 中科院计算所(硕士招生) | /rss/ict-cas |
https://www.ict.ac.cn/yjsjy/zsxx/sszs/ |
| 12 | 通用模板 | /rss/template |
(示例模板,无实际数据源) |
访问方式(需带令牌):
http://<BASE_URL>/rss/zju?key=<API_TOKEN>
根路径 / 返回 404,缺失或错误的 key 返回 403,均为设计行为。
所有可变项统一通过项目根目录的 .env 文件管理(参考 .env.example):
| 变量 | 说明 | 默认值 |
|---|---|---|
PORT |
服务监听端口 | 3000 |
HOST |
服务监听地址。生产设为内网 IP 203.0.113.1,只绑定该网卡、不暴露公网;0.0.0.0 表示所有网卡 |
0.0.0.0 |
API_TOKEN |
访问令牌,请求必须携带 ?key=<API_TOKEN> |
无(必填,缺失则启动失败) |
BASE_URL |
RSS 输出中 feed_url 的对外地址,部署后改为内网可访问的 IP/域名 |
http://localhost:<PORT> |
MAX_PAGES |
每个订阅源最多抓取的页数(跟随「下一页」翻页),越大历史越全、请求越多 | 3 |
⚠️ 生产环境HOST=203.0.113.1,服务只监听该内网地址。此时用localhost/127.0.0.1访问不到,健康检查等需用203.0.113.1。
.env 已被 .gitignore 忽略,不会进入版本库;部署时需在服务器上单独创建。
pnpm install
cp .env.example .env # 然后填入真实的 API_TOKEN
pnpm start # 等价于 node index.js当前生产部署在 wangtian01 服务器,使用 pm2 常驻托管。
- 主机:
wangtian01(Ubuntu 24.04 LTS) - 部署目录:
/home/admin/rss - 运行时:Node.js v20 / pnpm 10 / pm2 6
- pm2 进程名:
rss(fork 模式,端口 3000)
# 1. 登录服务器
ssh wangtian01
# 2. 拉取/上传代码到部署目录
cd ~/rss
# 3. 安装依赖
pnpm install --prod
# 4. 创建并填写环境变量
cp .env.example .env
vim .env # 设置 API_TOKEN,并把 BASE_URL 改为对外域名
# 5. 用 pm2 启动
pm2 start index.js --name rss
# 6. 保存进程列表 + 配置开机自启(当前尚未配置,重启后不会自动拉起)
pm2 save
pm2 startup # 按提示复制并执行输出的 sudo 命令日常更新直接在本地项目根目录执行部署脚本,它会自动同步代码、装依赖、重启服务并做健康检查:
./deploy.sh脚本行为:
- 用
rsync增量同步代码到wangtian01:/home/admin/rss - 不覆盖远端的
.env与node_modules(保护服务器上的令牌与依赖) - 远端执行
pnpm install --prod→pm2 restart rss(不存在则首次启动)→pm2 save - 最后打印进程状态并对
/rss/zju做一次 HTTP 健康检查
如需手动更新:
ssh wangtian01
cd ~/rss
pnpm install --prod # 依赖有变动时执行(如新增了 dotenv)
pm2 restart rss --update-envpm2 list # 查看进程状态
pm2 logs rss # 实时查看日志
pm2 restart rss # 重启
pm2 stop rss # 停止
pm2 describe rss # 查看进程详情(脚本路径、cwd、日志路径等)日志位置:~/.pm2/logs/rss-out.log、~/.pm2/logs/rss-error.log
# 注意用 HOST 绑定的内网 IP,而非 localhost
curl -s -o /dev/null -w "%{http_code}\n" \
"http://203.0.113.1:3000/rss/zju?key=<API_TOKEN>" # 期望 200.
├── index.js # 入口:加载 .env、令牌校验中间件、挂载路由
├── routes/ # 各高校订阅源,每个文件一个 Router
├── .env # 环境变量(不入库)
├── .env.example # 环境变量模板
└── package.json