前言

国家中小学智慧教育平台作为国内最大的免费正版中小学电子教材收录平台,自然成为了大家下载电子教材的首选。但很可惜,在完成了“停课不停学”的使命后,平台悄悄下线了教材的直接下载功能,并要求用户登录后才可以浏览教材。好在,教材下载地址并没有改变,只需进行一些小的操作,仍旧可以下载到整本教材。本程序将这些操作半自动化,可以有效提升下载效率,适配目前所有学段:小学、小学(五·四学制)、初中、初中(五·四学制)、高中

文末提供下载链接

实现原理

进入国家中小学智慧教育平台的教材页面,打开任意一本教材,发现在地址栏中的“contentId=”后跟着由“-”连接的一串字符。如图:

contentId

这串字符即为该教材对应contentId,也是下载教材的关键。得益于前人的记录,我们得知教材下载地址为“https://r2-ndr.ykt.cbern.com.cn/edu_product/esp/assets_document/{contentId}.pkg/pdf.pdf”。其中,{contentId}是一个可变参数,将其替换为上面的contentId,即可得到该本教材的下载地址。按照这个逻辑,只要找出每本教材的contentId,完成替换动作,即可得到每本教材的下载地址

代码编写

导入模块

由于是Python编写,很多功能需要模块实现,所以先导入模块。

from tkinter import ttk, filedialog, messagebox
import re
import urllib.parse
import requests
from ttkbootstrap import Style

其中:tkinter 构建GUI,ttkbootstrap 美化 ;re 匹配正则表达式;urllib.parse 处理 URL 编码;requests 发送HTTP请求和获取响应。

如遇到库下载速度慢等问题,可参照这篇文章改用国内镜像PyPI源下载

下载文件

def download_file(url, save_path):
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with open(save_path, 'wb') as file:
            for chunk in response.iter_content(1024):
                file.write(chunk)
        return True
    return False

定义一个名为download_file 的函数,用于下载文件。该函数接受两个参数:url 是要下载教材的 URL,save_path 是保存文件的路径。使用requests.get() 获取文件内容,并写入到本地文件中。如果下载成功,函数返回True,否则返回False

事件处理

def download_handler():
    url = url_entry.get()

    # 提取 contentId
    pattern = r'contentId=([^&]+)'
    match = re.search(pattern, url)
    if match:
        content_id = match.group(1)
        download_url = f"https://r2-ndr.ykt.cbern.com.cn/edu_product/esp/assets_document/{content_id}.pkg/pdf.pdf"

        # URL 编码
        download_url = urllib.parse.quote(download_url, safe='/:')

        # 选择保存位置
        save_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF Files", "*.pdf")])
        if save_path:
            if download_file(download_url, save_path):
                messagebox.showinfo("下载成功", "文件已保存")
            else:
                messagebox.showerror("下载失败", "文件下载失败,请检查网址是否有效")
    else:
        messagebox.showerror("错误", "网址应包含 'contentId='")

定义一个名为download_handler 的函数。点击下载按钮时,该函数将被调用。首先,它从输入框中获取URL。然后,使用正则表达式提取URL中的contentId,构建下载地址。

接着,将下载链接进行URL编码,以防止链接中包含特殊字符导致下载失败。接下来,弹出文件对话框,选择保存位置和文件名。

最后,调用download_file() 函数下载教材。如果下载成功,将弹出消息框显示“下载成功”,否则显示“下载失败”。

整体GUI构建

#主题
style = Style(theme='cosmo')
style.configure('.', font=('System', 20))
style.configure('TButton', font=('System', 20), padding=4)

#主窗口
root = style.master
root.title("国家中小学智慧教育平台电子教材下载器")
root.geometry('450x150')
root.iconbitmap('icon.ico')
root.resizable(False, False)

#标签 输入框
url_label = ttk.Label(root, text="URL")
url_label.pack()
url_entry = ttk.Entry(root, width=50)
url_entry.pack()

#下载按钮
download_button = ttk.Button(root, text="Download", command=download_handler)
download_button.pack(expand=True)

root.mainloop()

程序下载

目前仅64位可用!

Github-Card