Anon-Exploiter/ine-dl
GitHub: Anon-Exploiter/ine-dl
一个Python脚本,用于下载INE平台的课程内容以支持离线学习。
Stars: 47 | Forks: 19
# INE-DL (INE 课程下载器)
[](https://GitHub.com/Anon-Exploiter/ine-dl.js/graphs/commit-activity)
[](https://www.python.org/downloads/)


[](https://twitter.com/syed__umar)
[][linkedin-url]
**一个用于下载 INE 课程(包括实验、练习、测验、幻灯片和视频)的 Python 脚本!**
### 要求
- Python (3.6.* - 3.8.*)
- Python `pip3`
- Python 模块 `requests_toolbelt`
- Python 模块 `requests`
- Python 模块 `loguru`
- 外部下载工具 `aria2`
### 此脚本如何工作?(如果你想理解代码)
该脚本是基于 **iOS 应用程序**的 API 编写的,以绕过 Google 的隐形验证码实现。因此,你会在脚本中看到一个硬编码的头部 (`X-Ine-Mobile`),其中包含一个用于 iOS API 调用成功的静态 API 密钥(该密钥硬编码在 iOS 应用程序二进制文件中,可以轻松被提取)。
**初始化:**
1. 脚本首先从 `config.json` 文件加载凭据(`用户名/邮箱` 和 `密码`)
2. 然后登录 INE 账户,并将 `JWT` 令牌加载到 Authorization 头中,用于后续 API 调用
3. 脚本随后进行一次 API 调用,下载所有 INE 课程的元数据,并写入 `all_courses_metadata.json`
4. 接着检查用户账户拥有的订阅,筛选获取的课程,并创建另一个名为 `all_courses_with_access.json` 的文件存储数据
**视频下载:**
**幻灯片下载**(格式类似于[此处](https://user-images.githubusercontent.com/18597330/179960035-7a00d727-ebc0-4744-be50-356f53ad03af.png)):
1. 初始请求返回包含指向 `index.html` 文件链接的幻灯片元数据(响应头中带有 cookies)
2. 我们存储 cookies,然后下载 `browsersupport.js` 和 `player.js` 文件(静态文件可与其他幻灯片复用)
3. INE 使用 `css`、`js`、`woff` 和 `png` 的混合,但所有文件名都可递增(文本和二进制文件的格式不同)
4. 编写一个 `while 循环`,直到递增的文件返回 404,然后停止该类别(`CSS/JS/WOFF/PNG`)的下载
5. 它还会下载与幻灯片一起添加的任何附件。
**测验下载**(包含正确答案):
1. 这相当棘手。研究了测验解答的 API 调用。第一个请求返回包含整个测验内容的 `JSON`。
2. 第二个请求是一个 `PUT` 请求,包含用户提交的正确/错误答案。对此请求的响应中,JSON 体现在包含一个新键 `is_correct`,其中包含正确答案。
3. 编写了逻辑来发布从初始请求获取的 JSON 体,并根据需要进行了修改。服务器也不需要预先选择选项。
4. `PUT` 请求随后返回正确答案,*生成两个文件:一个无答案版和一个正确答案版*。
**练习下载**:
1. 这相当简单,一个 API 调用返回包含 `Markdown` 和 `HTML` 两种格式的内容。
2. 为了便于跨平台使用,我仅存储文件名包含 `_exercise_` 的 `HTML` 内容。
**实验下载**:
1. 你在这里会有所缺失,因为在大多数情况下,实验存储在 INE 云上。
2. 脚本仅存储其 `HTML 内容`(如果存在)。
### 功能特性
- 支持课程视频断点续传
- 下载视频的字幕(如果存在)
- 无需提示即可下载所有课程(选项:-a / --all)
- 可下载幻灯片、实验、练习、测验和视频
### 安装模块
```
pip3 install -r requirements.txt
```
### 安装 aria2
```
sudo apt install aria2
```
### 在 Docker 中运行容器
```
docker build -t ine-dl .
docker run -d --name ine-dl -v {HOSTDIRECTORY}:/app/ine-dl/downloads ine-dl
```
请确保将命令中的 {HOSTDIRECTORY} 替换为设备上实际的保存文件夹映射路径。
### 支持系统
- ~Windows 7/8/8.1~(在 WSL 中应能正常工作,但在 cmd/PS 中不行)
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
### 下载 ine-dl
你可以通过克隆 GitHub 仓库来下载最新版本的 ine-dl。
```
git clone https://github.com/Anon-Exploiter/ine-dl --depth 1
```
### 帮助菜单
```
┌──(umar_0x01@b0x)-[~/scripts/ine-dl]
└─$ python3 ine.py
██╗███╗ ██╗███████╗ ██████╗ ██╗
██║████╗ ██║██╔════╝ ██╔══██╗██║
██║██╔██╗ ██║█████╗█████╗██║ ██║██║
██║██║╚██╗██║██╔══╝╚════╝██║ ██║██║
██║██║ ╚████║███████╗ ██████╔╝███████╗
╚═╝╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚══════╝
Usage: python3 ine.py --all
Help:
-h, --help show this help message and exit
Basic arguments (one or more):
-l LOG, --log-output LOG
Logs output of the script (if required later)
-lct, --list-categories
List all categories
-lcc, --list-courses List all courses
-lcct LCCT, --list-categories-courses LCCT
List all courses of a specific category UUID from -lct
Necessary arguments:
-p PROCESSES, --processes PROCESSES
Number of parallel processes to launch (2 if nothing specified)
-c COURSE, --course COURSE
Download course based on provided UUID from -lcc
-ct CATEGORY, --category CATEGORY
Download whole category based on provided UUID from -lct
-a, --all Download all courses of all categories
```
### 参数用法
***运行脚本(无参数时显示帮助菜单)***
```
python ine-dl.py
```
***列出所有课程***
```
python ine-dl.py -lc
```
***列出课程类别***
```
python ine-dl.py -lct
```
***列出特定类别的所有课程***
```
python ine-dl.py -lcct {category_id}
```
***将脚本输出记录到日志文件***
```
python ine-dl.py -l logfile.log
```
***下载所有 INE 课程(你订阅有权访问的,支持/不支持并行处理)***
```
python ine-dl.py --all
python ine-dl.py --all -p 2
```
***下载单个课程***
```
python ine-dl.py -c {course_id}
```
***下载指定类别的所有课程(支持/不支持并行处理)***
```
python ine-dl.py -ct {category_id}
python ine-dl.py -ct {category_id} -p 2
```
### 待办事项
- [x] 获取所有课程并写入文件
- [x] 获取并匹配订阅,然后将内容放入课程文件
- [x] 实现视频文件下载(最高分辨率等)
- [x] 实现测验下载
- [x] 将测验写入文本文件,然后将其正确结果(json:is_correct)写入另一个文件!
- [x] 实现练习下载
- [x] 实现 iframe 下载
- [x] 实现 html、css、js、woff、img 文件下载
- [x] 实现实验下载
- [x] 检查 description_html 是否存在,如果不存在,则为用户满意度写入整个实验的 JSON 对象
- [x] 下载 files_uuids 的 zip/pdf 文件
- [x] 在课程目录中写入包含完整课程数据的 JSON 文件
- [x] 实现所有 argparse 参数
### 它无法做到的事情
- 目前不支持学习路径和训练营的下载
- 但是,你可以通过指定它们的 UUID 手动下载这些路径和训练营内的课程
- 这也可以通过 bash 脚本自动化,使用并行处理逐一下载多个 UUID
- https://github.com/Anon-Exploiter/ine-dl/issues/8
### 截图
### 注意
请根据 INE 的使用指南使用该脚本。不要耗尽他们的后端服务器资源。不要转储并公开分享课程内容。
请自行承担使用风险。如果因使用此脚本导致你的账户被封锁,我概不负责。
### 要求
- Python (3.6.* - 3.8.*)
- Python `pip3`
- Python 模块 `requests_toolbelt`
- Python 模块 `requests`
- Python 模块 `loguru`
- 外部下载工具 `aria2`
### 此脚本如何工作?(如果你想理解代码)
该脚本是基于 **iOS 应用程序**的 API 编写的,以绕过 Google 的隐形验证码实现。因此,你会在脚本中看到一个硬编码的头部 (`X-Ine-Mobile`),其中包含一个用于 iOS API 调用成功的静态 API 密钥(该密钥硬编码在 iOS 应用程序二进制文件中,可以轻松被提取)。
**初始化:**
1. 脚本首先从 `config.json` 文件加载凭据(`用户名/邮箱` 和 `密码`)
2. 然后登录 INE 账户,并将 `JWT` 令牌加载到 Authorization 头中,用于后续 API 调用
3. 脚本随后进行一次 API 调用,下载所有 INE 课程的元数据,并写入 `all_courses_metadata.json`
4. 接着检查用户账户拥有的订阅,筛选获取的课程,并创建另一个名为 `all_courses_with_access.json` 的文件存储数据
**视频下载:**
**幻灯片下载**(格式类似于[此处](https://user-images.githubusercontent.com/18597330/179960035-7a00d727-ebc0-4744-be50-356f53ad03af.png)):
1. 初始请求返回包含指向 `index.html` 文件链接的幻灯片元数据(响应头中带有 cookies)
2. 我们存储 cookies,然后下载 `browsersupport.js` 和 `player.js` 文件(静态文件可与其他幻灯片复用)
3. INE 使用 `css`、`js`、`woff` 和 `png` 的混合,但所有文件名都可递增(文本和二进制文件的格式不同)
4. 编写一个 `while 循环`,直到递增的文件返回 404,然后停止该类别(`CSS/JS/WOFF/PNG`)的下载
5. 它还会下载与幻灯片一起添加的任何附件。
**测验下载**(包含正确答案):
1. 这相当棘手。研究了测验解答的 API 调用。第一个请求返回包含整个测验内容的 `JSON`。
2. 第二个请求是一个 `PUT` 请求,包含用户提交的正确/错误答案。对此请求的响应中,JSON 体现在包含一个新键 `is_correct`,其中包含正确答案。
3. 编写了逻辑来发布从初始请求获取的 JSON 体,并根据需要进行了修改。服务器也不需要预先选择选项。
4. `PUT` 请求随后返回正确答案,*生成两个文件:一个无答案版和一个正确答案版*。
**练习下载**:
1. 这相当简单,一个 API 调用返回包含 `Markdown` 和 `HTML` 两种格式的内容。
2. 为了便于跨平台使用,我仅存储文件名包含 `_exercise_` 的 `HTML` 内容。
**实验下载**:
1. 你在这里会有所缺失,因为在大多数情况下,实验存储在 INE 云上。
2. 脚本仅存储其 `HTML 内容`(如果存在)。
### 功能特性
- 支持课程视频断点续传
- 下载视频的字幕(如果存在)
- 无需提示即可下载所有课程(选项:-a / --all)
- 可下载幻灯片、实验、练习、测验和视频
### 安装模块
```
pip3 install -r requirements.txt
```
### 安装 aria2
```
sudo apt install aria2
```
### 在 Docker 中运行容器
```
docker build -t ine-dl .
docker run -d --name ine-dl -v {HOSTDIRECTORY}:/app/ine-dl/downloads ine-dl
```
请确保将命令中的 {HOSTDIRECTORY} 替换为设备上实际的保存文件夹映射路径。
### 支持系统
- ~Windows 7/8/8.1~(在 WSL 中应能正常工作,但在 cmd/PS 中不行)
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
### 下载 ine-dl
你可以通过克隆 GitHub 仓库来下载最新版本的 ine-dl。
```
git clone https://github.com/Anon-Exploiter/ine-dl --depth 1
```
### 帮助菜单
```
┌──(umar_0x01@b0x)-[~/scripts/ine-dl]
└─$ python3 ine.py
██╗███╗ ██╗███████╗ ██████╗ ██╗
██║████╗ ██║██╔════╝ ██╔══██╗██║
██║██╔██╗ ██║█████╗█████╗██║ ██║██║
██║██║╚██╗██║██╔══╝╚════╝██║ ██║██║
██║██║ ╚████║███████╗ ██████╔╝███████╗
╚═╝╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚══════╝
Usage: python3 ine.py --all
Help:
-h, --help show this help message and exit
Basic arguments (one or more):
-l LOG, --log-output LOG
Logs output of the script (if required later)
-lct, --list-categories
List all categories
-lcc, --list-courses List all courses
-lcct LCCT, --list-categories-courses LCCT
List all courses of a specific category UUID from -lct
Necessary arguments:
-p PROCESSES, --processes PROCESSES
Number of parallel processes to launch (2 if nothing specified)
-c COURSE, --course COURSE
Download course based on provided UUID from -lcc
-ct CATEGORY, --category CATEGORY
Download whole category based on provided UUID from -lct
-a, --all Download all courses of all categories
```
### 参数用法
***运行脚本(无参数时显示帮助菜单)***
```
python ine-dl.py
```
***列出所有课程***
```
python ine-dl.py -lc
```
***列出课程类别***
```
python ine-dl.py -lct
```
***列出特定类别的所有课程***
```
python ine-dl.py -lcct {category_id}
```
***将脚本输出记录到日志文件***
```
python ine-dl.py
### 注意
请根据 INE 的使用指南使用该脚本。不要耗尽他们的后端服务器资源。不要转储并公开分享课程内容。
请自行承担使用风险。如果因使用此脚本导致你的账户被封锁,我概不负责。
标签:API集成, GitHub项目, INE课程, JWT认证, URL抓取, WAF测试, 二进制发布, 可观测性, 在线教育, 培训资源下载, 实验室下载, 幻灯片下载, 开源工具, 开源情报, 数据抓取, 测验下载, 漏洞修复, 网络安全培训, 脚本工具, 自动登录, 视频下载, 认证管理, 请求拦截, 课程下载, 资源获取, 逆向工具