通过 getYunFiles API 从超星 WPS 查看器 URL 下载 PDF 文件。
核心原理
每个超星查看器 URL 中都包含一个 objectid(32 位十六进制字符串)。调用 getYunFiles API 即可获取直接的 PDF 下载链接 —— 无需 Cookie 或认证令牌。
参数说明
$ARGUMENTS 包含用户的下载请求,通常为一个或多个条目,包含页数、文件名和查看器 URL。需解析这些内容以提取所需数据。
下载流程
步骤 1:从每个 URL 提取 objectid
在每个查看器 URL 中查找 objectid=([a-f0-9]{32}) 参数。
步骤 2:调用 getYunFiles API
对每个 objectid,调用以下接口:
https://contestyd.chaoxing.com/app/files/{objectid}/getYunFiles?key=allData
返回的 JSON 数据包含:
data.pdf —— 直接指向 s3.cldisk.com 或 s3.ananas.chaoxing.com 的 PDF 下载链接(优先使用)data.download —— 带有认证令牌的备用下载链接(降级方案)data.filename —— 原始文件名data.pagenum —— 页数
步骤 3:下载 PDF 文件
使用 data.pdf 的链接直接下载,无需添加任何认证头。
保存路径:~/Downloads/chaoxing_pdfs/{用户指定的名称}.pdf
步骤 4:验证页数
将 data.pagenum 与用户预期的页数进行对比,若不一致则发出警告。
步骤 5:将 PDF 转换为 TXT(带 OCR 备用)
下载完成后,自动提取每页文本生成纯文本文件。采用双阶段策略:先尝试原生文本提取,若失败则使用 OCR 作为后备。
前置依赖:
pip install pymupdf rapidocr-onnxruntime
转换方法(Python 实现):
import sys, os, fitz
from rapidocr_onnxruntime import RapidOCR
if sys.platform == "win32":
sys.stdout.reconfigure(encoding="utf-8")
ocr = RapidOCR()
pdf_path = "~/Downloads/chaoxing_pdfs/{name}.pdf"
doc = fitz.open(pdf_path)
all_text = []
for i, page in enumerate(doc):
# 阶段一:优先尝试原生文本提取
native = page.get_text().strip()
if len(native) > 50:
all_text.append(f"--- 第{i+1}页 ---\n{native}")
continue
# 阶段二:图像页使用 OCR 备用
pix = page.get_pixmap(dpi=200)
img_bytes = pix.tobytes("png")
result, _ = ocr(img_bytes)
ocr_text = "\n".join([item[1] for item in result]) if result else ""
label = "OCR" if len(ocr_text) > 0 else "(empty)"
all_text.append(f"--- 第{i+1}页 [{label}] ---\n{ocr_text}")
doc.close()
full_text = "\n".join(all_text)
with open(pdf_path.replace(".pdf", ".txt"), "w", encoding="utf-8") as f:
f.write(full_text)
# 汇总信息
native_pages = sum(1 for p in all_text if "[OCR]" not in p and "[empty]" not in p)
ocr_pages = sum(1 for p in all_text if "[OCR]" in p)
print(f"原生提取: {native_pages}页, OCR: {ocr_pages}页, 总字符数: {len(full_text)}")
每份下载生成的文件:
{name}.pdf —— 原始 PDF 文件{name}.txt —— 文本提取结果(原生提取页与 OCR 页会标注 [OCR])
工作方式:
- 每一页首先检查是否存在原生文本层(文本可选中)
- 若原生文本长度小于 50 字符,则将该页渲染为 200 DPI 图像,并由 RapidOCR 处理
- OCR 提取的页面在输出中标注为
[OCR],便于识别 - 无文本且 OCR 失败的页面标记为
[empty]
CLI 工具(替代方案)
可在路径 C:/Users/Cameron/Downloads/chaoxing_dl.py 找到一个命令行工具:
# 单个下载
python ~/Downloads/chaoxing_dl.py "VIEWER_URL" -n "文件名"
# 批量从 JSON 文件处理
python ~/Downloads/chaoxing_dl.py --batch tasks.json
# 含页数校验
python ~/Downloads/chaoxing_dl.py "URL" -n "name" --json
# 强制覆盖已有文件
python ~/Downloads/chaoxing_dl.py "URL" -n "name" -f
批量任务 JSON 格式:
[
{"name": "文件名", "url": "viewer_url_or_objectid", "pages": 22},
...
]
批量处理(无需 CLI 工具)
如需手动批量下载而无需 CLI 工具,可使用 Bash 循环脚本:
for oid_name in "OBJECTID1:名称1" "OBJECTID2:名称2"; do
oid="${oid_name%%:*}"; name="${oid_name##*:}"
info=$(curl -s -L "https://contestyd.chaoxing.com/app/files/$oid/getYunFiles?key=allData")
pagenum=$(echo "$info" | grep -o '"pagenum":[0-9]*' | cut -d: -f2)
pdf_url=$(echo "$info" | grep -o '"pdf":"[^"]*"' | head -1 | tr -d '"' | sed 's/^pdf://')
echo "$name: ${pagenum}p"
curl -s -L -o ~/Downloads/chaoxing_pdfs/${name}.pdf "$pdf_url"
done
重要提示
- 仅需
objectid —— 不需要 resid、tk、addPointInfo 或 Cookie - 必须将实际页数与用户预期值进行比对
s3.cldisk.com 上的 PDF 链接为公开直链,可直接访问- 若
data.pdf 为空,应降级使用 data.download - 若目标文件已存在,应跳过,除非用户明确要求覆盖