Chaoxing Download

从超星平台下载PDF并转为TXT文本,支持批量处理。

已扫描
适合谁
高校学生、知识整理者
不适合谁
需要保留原始格式的用户、对OCR结果有高精度要求的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @artminding/chaoxing-download

Skill 说明

命令、参数、文件名以原文为准

超星文档下载器 (Chaoxing Document Downloader)

通过 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.coms3.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]

工作方式:

  1. 每一页首先检查是否存在原生文本层(文本可选中)
  2. 若原生文本长度小于 50 字符,则将该页渲染为 200 DPI 图像,并由 RapidOCR 处理
  3. OCR 提取的页面在输出中标注为 [OCR],便于识别
  4. 无文本且 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 —— 不需要 residtkaddPointInfo 或 Cookie
  • 必须将实际页数与用户预期值进行比对
  • s3.cldisk.com 上的 PDF 链接为公开直链,可直接访问
  • data.pdf 为空,应降级使用 data.download
  • 若目标文件已存在,应跳过,除非用户明确要求覆盖
A
@artminding

已收录 1 个 Skill

相关推荐