项目简介
通过逆向希沃网页版 JS 代码,发现其所有 API 走统一网关 /api.json?actionName=XXX,页面内置了完整的 ENBX → PPTX 转换功能。本项目封装了这一能力,支持一键下载 PPTX。
实测结果:36 页课件、约 24 秒完成转换,输出 204 MB PPTX 文件,文字/排版完整保留。
解决什么问题
希沃白板 EN5 课件(.enbx)是专有格式,只能在希沃客户端或在线平台打开。脱离希沃环境后无法查看,给课件分享、归档、打印带来不便。
本工具解决:
- 一键导出 PPTX:通过 API 直接转换,保留全部文字、图片、排版
- 无需截图:服务端转换,保真度高,文件体积小
- 支持代理隧道:内置 Xray 代理工具,可搭配代理使用
技术原理
API 网关
希沃网页版使用统一 API 网关:
POST /api.json?actionName=GET_ENBX_TO_PPTX
Content-Type: application/json
x-auth-refer: ENOW
Body: {"cwId": "课件ID", "version": "1", "source": "en-mac"}
调用后返回转换任务的 traceId,通过轮询 GET_TRANSFORM_STATUS 接口获取进度,转换完成后拿到 CDN 签名下载链接。
完整流程
- 浏览器打开希沃分享页面
- 调 API
GET_ENBX_TO_PPTX触发转换 - 每 2-3 秒轮询
GET_TRANSFORM_STATUS查进度 - 转换完成后下载 PPTX 文件
使用方法
方式一:通过 browser-harness 手动调用
browser-harness -c "
# 1. 获取课件信息
info = js('ENOWSDK.getCoursewareInfo()')
cwId = info['coursewareId']
# 2. 调 API 触发转换
js('fetch(\"/api.json?actionName=GET_ENBX_TO_PPTX&ts=\" + Date.now(), {
method: \"POST\",
credentials: \"include\",
headers: {\"Content-Type\": \"application/json\", \"x-auth-refer\": \"ENOW\"},
body: JSON.stringify({cwId: \"' + cwId + '\", version: \"1\", source: \"en-mac\"})
})')
# 3. 轮询进度并下载
traceId = cwId + ':1'
for i in range(30):
res = js('...GET_TRANSFORM_STATUS...')
if res.get('progress') >= 100:
dl_url = res.get('file_download_url')
break
time.sleep(3)
# 4. 下载 PPTX
import urllib.request
urllib.request.urlretrieve(dl_url, '课件导出.pptx')"
方式二:代理隧道下载器(推荐跨国/受限网络)
项目附带 seewo-proxy-tool/ 子工具,通过 Xray 核心建立独立代理隧道,配合 Web 管理界面操作:
# 交互选择服务器
python seewo-proxy-tool/seewo_download_pptx_proxy.py -s 节点名称
# 或启动 Web UI
python seewo-proxy-tool/webui.py
# 浏览器打开 http://127.0.0.1:5000
Web UI 支持服务器测速(颜色标注延迟)、一键启动/停止、实时日志 SSE 推送。
项目结构
项目根/
├── 技术说明.md ← API 网关逆向文档
├── README.md ← 使用说明
├── AGENTS.md ← AI 项目记忆
│
└── seewo-proxy-tool/ ← 代理隧道下载器
├── seewo_download_pptx_proxy.py ← CLI 主程序
├── webui.py ← Flask Web 管理界面
├── templates/index.html
└── static/app.js + style.css
适用场景
- 教师备份课件为通用 Office 格式
- 课件分享给没有希沃环境的用户
- 打印课件内容为纸质资料
- 课件归档与版本管理
