Skip to content
sctpeterPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

Repository files navigation

高校通知 RSS 服务

将多所高校院系的「通知公告」网页抓取并转换为 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-env

常用运维命令

pm2 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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages