教室画面查看器
点击前往:教室画面查看器
项目地址:GitHub
在浏览器里按 设备号 或 楼栋 + 门牌 查看教室直播流(HLS / m3u8)。数据来自本地 urlCache.json,不依赖外网接口;播放页通过 CDN 加载 hls.js。
环境要求
- Python 3.9+(使用标准库
http.server,无 pip 依赖) - 能访问流媒体地址的网络(多为校园网或内网)
- 浏览器需能访问
cdn.jsdelivr.net(加载 hls.js);若被拦截,可改用「复制地址」后用 VLC 等播放
快速开始
cd /path/to/abc
python3 classroom_stream_viewer.py
启动后默认打开 http://127.0.0.1:8765/。若 8765 已被占用,程序会自动尝试 8766、8767…(最多 32 个端口),并在终端提示实际端口。
指定监听地址与端口
默认只监听本机 127.0.0.1。部署到服务器供他人访问时,需监听所有网卡:
export CLASSROOM_STREAM_VIEWER_HOST=0.0.0.0
export CLASSROOM_STREAM_VIEWER_PORT=8765
python3 classroom_stream_viewer.py
一行写法:
CLASSROOM_STREAM_VIEWER_HOST=0.0.0.0 CLASSROOM_STREAM_VIEWER_PORT=8765 python3 classroom_stream_viewer.py
服务器部署
1. 准备文件
将以下文件拷到服务器同一目录(路径可自定,例如 /opt/classroom-viewer/):
classroom_stream_viewer.pyurlCache.jsonroom/(仅作维护参考时可一并拷贝;运行不依赖)
服务器需安装 Python 3,无需 pip install。
2. 放行防火墙与安全组
在云主机安全组或本机防火墙中放行所选 TCP 端口(示例 8765),例如 Ubuntu 上使用 ufw allow 8765/tcp。
3. 长期运行(systemd 示例)
创建 /etc/systemd/system/classroom-viewer.service(路径与 User 请按实际修改):
[Unit]
Description=Classroom stream viewer
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/classroom-viewer
Environment=CLASSROOM_STREAM_VIEWER_HOST=0.0.0.0
Environment=CLASSROOM_STREAM_VIEWER_PORT=8765
ExecStart=/usr/bin/python3 /opt/classroom-viewer/classroom_stream_viewer.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
然后:
sudo systemctl daemon-reload
sudo systemctl enable --now classroom-viewer
sudo systemctl status classroom-viewer
浏览器访问:http://服务器IP:8765/(若改了端口则换端口)。
4. 可选:Nginx 反向代理与 HTTPS
若希望使用 443、证书或域名,可在本进程前加 Nginx,把 location / 代理到 http://127.0.0.1:8765,此时可把 Python 的 CLASSROOM_STREAM_VIEWER_HOST 改回 127.0.0.1,只让 Nginx 对外监听。
5. 安全说明(重要)
当前服务 无登录、无权限控制,urlCache.json 与页面会暴露内网流地址信息。建议:
- 仅部署在 内网 / VPN 后,或配合 IP 白名单、Nginx 基本认证 等再对外开放;
- 流媒体 m3u8 本身通常仍需在校园网或指定网络下才能播放,与是否部署查看器无关。
项目文件
| 文件 | 说明 |
|---|---|
classroom_stream_viewer.py |
本地 HTTP 服务 + 内置页面逻辑 |
urlCache.json |
设备号 → 各画面类型的 m3u8 地址(需自行维护或从上游导出) |
room/A.txt … room/X2.txt(可选) |
历史/备用的「门牌→设备号」表;运行时已内置进脚本,修改映射需改 classroom_stream_viewer.py 中的 BUILDING_MAPS(或编辑 room/ 下 txt 后合并再粘贴进脚本) |
urlCache.json 结构
顶层键为 6 位设备号(字符串),值为包含以下键的对象:
| 键 | 含义 |
|---|---|
ppt_video |
PPT / 电脑画面 |
teacher_full |
教师全景 |
teacher_track |
教师跟踪 |
student_full |
学生全景 |
每个键对应值为完整的 m3u8 URL。
页面功能简述
- 楼栋 + 门牌:从下拉框选择后,会自动填入对应 设备号(例如 B 楼门牌 501 →
004370)。也可点 「写入设备号」 仅同步输入框而不查流。 - 设备号:可直接输入或修改;datalist 来自缓存中已有设备号列表。
- 画面类型 + 「显示画面」:请求本地
/api/lookup并尝试在页面内播放。 - 复制流地址 / 新窗口打开:便于在外部播放器或新标签页打开。
楼栋显示名称(内置)
- X:西大楼
- X1:信远1号楼
- X2:信远2号楼
- 其余为 A/B/C/D/J 教学楼等简称,见脚本内
BUILDING_LABELS。
API(本地)
| 路径 | 说明 |
|---|---|
GET / |
主页面(内嵌注入楼栋门牌数据) |
GET /api/rooms |
返回 urlCache.json 中所有设备号(排序) |
GET /api/lookup?room=<设备号>&type=<画面类型> |
返回 JSON:ok、url、错误信息等 |
常见问题
端口被占用
程序会自动递增端口;也可用环境变量 CLASSROOM_STREAM_VIEWER_PORT 指定起始端口,或自行 lsof -iTCP:8765 -sTCP:LISTEN 后结束占用进程。
服务器上浏览器打不开
需设置 CLASSROOM_STREAM_VIEWER_HOST=0.0.0.0 并放行防火墙,用 http://服务器IP:端口 访问;详见上文「服务器部署」。
浏览器无法播放 先试「新窗口打开」;仍失败则用 VLC / PotPlayer / ffplay 打开 m3u8 链接。
修改门牌与设备号对应关系
编辑 classroom_stream_viewer.py 中 BUILDING_MAPS 的 JSON 字符串(或从 room/A.txt 等合并后再粘贴),保存后重启服务即可。