// ==UserScript== // @name 课程网站下载小助手 // @namespace http://tampermonkey.net/ // @version 0.2 // @description 此脚本用于ucas课程网站资料批量下载。 // @author Little_bad // @match https://course.ucas.ac.cn/portal/site/*/tool/* // @grant download.js // @downloadURL https://update.greasyfork.icu/scripts/397639/%E8%AF%BE%E7%A8%8B%E7%BD%91%E7%AB%99%E4%B8%8B%E8%BD%BD%E5%B0%8F%E5%8A%A9%E6%89%8B.user.js // @updateURL https://update.greasyfork.icu/scripts/397639/%E8%AF%BE%E7%A8%8B%E7%BD%91%E7%AB%99%E4%B8%8B%E8%BD%BD%E5%B0%8F%E5%8A%A9%E6%89%8B.meta.js // ==/UserScript== (function (root, factory) { if(document.getElementsByClassName('hidden-sm hidden-xs pull-right').length==0){ return true; alert('you are not expecting to be here'); } if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } else { // Browser globals (root is window) root.download = factory(); } function addButton(text){         var nu = document.createElement('input');         nu.type = 'submit';         nu.value = text;         nu.className = 'download-helper';         nu.style.marginLeft = '8px'; var su = document.getElementsByClassName('hidden-sm hidden-xs pull-right')[0];         su.appendChild(nu);         nu.onclick = function(){             var i; var name; var uuuu; var entity = document.getElementsByClassName('specialLink title'); for(i=1; i< entity.length; i=i+1) { name = entity[i].children[1].children[1].textContent; uuuu = entity[i].children[1].href; download(uuuu,name); }         }     } addButton('点击下载全部文件'); }(this, function () { return function download(data, strFileName, strMimeType) { var self = window, // this script is only for browsers anyway... defaultMime = "application/octet-stream", // this default mime also triggers iframe downloads mimeType = strMimeType || defaultMime, payload = data, url = !strFileName && !strMimeType && payload, anchor = document.createElement("a"), toString = function(a){return String(a);}, myBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString), fileName = strFileName || "download", blob, reader; myBlob= myBlob.call ? myBlob.bind(self) : Blob ; if(String(this)==="true"){ //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback payload=[payload, mimeType]; mimeType=payload[0]; payload=payload[1]; } if(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument fileName = url.split("/").pop().split("?")[0]; anchor.href = url; // assign href prop to temp anchor if(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path: var ajax=new XMLHttpRequest(); ajax.open( "GET", url, true); ajax.responseType = 'blob'; ajax.onload= function(e){ download(e.target.response, fileName, defaultMime); }; setTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return: return ajax; } // end if valid url? } // end if url? //go ahead and download dataURLs right away if(/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)){ if(payload.length > (1024*1024*1.999) && myBlob !== toString ){ payload=dataUrlToBlob(payload); mimeType=payload.type || defaultMime; }else{ return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs: navigator.msSaveBlob(dataUrlToBlob(payload), fileName) : saver(payload) ; // everyone else can save dataURLs un-processed } }//end if dataURL passed? blob = payload instanceof myBlob ? payload : new myBlob([payload], {type: mimeType}) ; function dataUrlToBlob(strUrl) { var parts= strUrl.split(/[:;,]/), type= parts[1], decoder= parts[2] == "base64" ? atob : decodeURIComponent, binData= decoder( parts.pop() ), mx= binData.length, i= 0, uiArr= new Uint8Array(mx); for(i;i