// ==UserScript==
// @name Elearning Downloader
// @namespace http://tampermonkey.net/
// @version 0.2
// @description download elearning files easier
// @author Char不多得了
// @match https://elearning.fudan.edu.cn/courses/*/files/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=fudan.edu.cn
// @grant GM_registerMenuCommand
// @grant GM.registerMenuCommand
// @require https://code.jquery.com/jquery-3.6.1.slim.min.js
// @license MIT License
// ==/UserScript==
(function() {
'use strict';
var course_id = /\d+/.exec(window.location.href)[0];
// 适配不同版本的GM函数
var _GM_registerMenuCommand;
if(typeof GM_registerMenuCommand!='undefined'){
_GM_registerMenuCommand=GM_registerMenuCommand;
}else if(typeof GM!='undefined' && typeof GM.registerMenuCommand!='undefined'){
_GM_registerMenuCommand=GM.registerMenuCommand;
}
if(typeof _GM_registerMenuCommand=='undefined')_GM_registerMenuCommand=(s,f)=>{};
function getXHR(method,url,respType){
let xhr = new XMLHttpRequest();
xhr.setRequestHeader('Accept', 'application/json, text/javascript, application/json+canvas-string-ids, */*; q=0.01');
xhr.setRequestHeader('Accept-Encoding','gzip, deflate, br');
xhr.setRequestHeader('Accept-Language','zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2');
xhr.setRequestHeader('Connection','keep-alive');
xhr.setRequestHeader('DNT','1');
xhr.setRequestHeader('Sec-Fetch-Dest','empty');
xhr.setRequestHeader('Sec-Fetch-Mode','cors');
xhr.setRequestHeader('Sec-Fetch-Site','same-origin');
xhr.setRequestHeader('TE','trailers');
xhr.withCredentials = true;
xhr.responseType = respType;
xhr.open(method,url)
return xhr;
}
function getFolderid(course_id,callback){
//此处回调为获得了root文件夹之后的处理函数
//获得folderid后自动下载
console.log("getFolderid")
if(course_id == null){
console.log("course_id 为null")
return;
}
let folderidXHR = getXHR("get","https://elearning.fudan.edu.cn/api/v1/courses/"+course_id+"/folders/by_path/","json");
folderidXHR.send()
folderidXHR.onload = function() {
if(folderidXHR.status=="304"||folderidXHR.status=="200"){
let folderid = folderidXHR.response[0].id;
// console.log(folderid);//debug
if(callback) callback(folderid)
}
};
}
function getSubfolderidList(folderid,callback){
// 获得subfolderList之后自动对每个folder发请求
console.log("getSubfolderList")
if(folderid == null){
console.log("folderid 为null")
return;
}
let subFolderidXHR = getXHR("GET","https://elearning.fudan.edu.cn/api/v1/folders/"+folderid+"/folders","json")
let params = { // 此处的参数并没有真的传过去,但是居然也拿到数据了,离谱 todo
"include[]": [
"user",
"usage_rights",
"enhanced_preview_url",
"context_asset_string"
],
"per_page": "20",
"sort": "",
"order": ""
}
subFolderidXHR.send(JSON.stringify(params))
subFolderidXHR.onload = function() {
if(subFolderidXHR.status=="304"||subFolderidXHR.status=="200"){
let subFolderList = subFolderidXHR.response;
for(let i in subFolderList){
if(callback) callback(subFolderList[i].id)
}
}
};
}
function getFileidList(folderid,callback){
// 获得fileList自动下载
console.log("getFileList")
if(folderid == null){
console.log("folderid 为null")
return;
}
let fileidXHR = getXHR("GET","https://elearning.fudan.edu.cn/api/v1/folders/"+folderid+"/files","json")
let params = {
"include[]": [
"user",
"usage_rights",
"enhanced_preview_url",
"context_asset_string"
],
"per_page": "20",
"sort": "",
"order": ""
}
fileidXHR.send(JSON.stringify(params))
let fileidList = [];
fileidXHR.onload = function() {
if(fileidXHR.status=="304"||fileidXHR.status=="200"){
let fileList = fileidXHR.response;
for(let i in fileList){
fileidList.push(fileList[i].id)
}
// console.log(fileidList)//debug
if(callback) callback(fileidList)
}
};
}
function getFilesOnPage(){
let file_elem = document.getElementsByClassName("ef-name-col__link");
if(file_elem==null||file_elem.length===0){
console.log("当前页面未找到文件")
return;
}
let fileidList = []
for(let i=0;i<file_elem.length;i++){
fileidList.push(/\d+/.exec(file_elem.item(i).href)[0])
}
return fileidList;
}
function downloadList(fileidList){
let file_url_list = []
for(let i=0;i<fileidList.length;i++){
file_url_list.push("https://elearning.fudan.edu.cn/courses/"+course_id+"/files/"+ fileidList[i]+ "/download?download_frd=1")
}
for(let url in file_url_list){
// 根据链接下载
const a = document.createElement('a');
a.setAttribute('href', file_url_list[url]);
a.setAttribute('download', "");
a.click();
}
}
function downloadFolder(folderid){
getFileidList(folderid,downloadList)
getSubfolderidList(folderid,downloadFolder)
}
function downloadPage(){
downloadList(getFilesOnPage())
}
function downloadAll(){
getFolderid(course_id,downloadFolder)
}
_GM_registerMenuCommand("download the page",downloadPage);
_GM_registerMenuCommand("download All",downloadAll);
})();