// ==UserScript==
// @icon http://www.tsinghua.edu.cn/publish/newthu/images/favicon.ico
// @name 网络学堂2018助手
// @namespace exhen32@live.com
// @version 2019年03月23日01版
// @description 微调排版,提醒更醒目; 支持导出日历,课程一目了然;课件批量下载,公告一键标记,拯救强迫症。
// @require http://cdn.bootcss.com/jquery/3.2.1/jquery.min.js
// @require https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.js
// @author Exhen
// @match http*://learn.tsinghua.edu.cn/f/wlxt/index/course/student/
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @connect learn.tsinghua.edu.cn
// @run-at document-idle
// ==/UserScript==
var blocker = $('<div class="blocker" id="manualAlert" style="position: fixed;width: 100%;height: 100%;background: #4646466b;z-index: 999;"></div>')
$('head').append('<style type="text/css">.fixedCenter {left: 50%;position: absolute;right: 50%;top: 50%;bottom: 50%;}')
$('head').append('<style type="text/css">.myToobar {margin: 5px;display: inline-block;background: white;border: 1px solid gray;padding: 5px;border-radius: 5px; color:black} .myToobar a {color: black}')
var saveAs = saveAs || (function (view) {
"use strict";
// IE <10 is explicitly unsupported
if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
return;
}
var
doc = view.document
// only get URL when necessary in case Blob.js hasn't overridden it yet
,
get_URL = function () {
return view.URL || view.webkitURL || view;
},
save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"),
can_use_save_link = "download" in save_link,
click = function (node) {
var event = new MouseEvent("click");
node.dispatchEvent(event);
},
is_safari = /constructor/i.test(view.HTMLElement) || view.safari,
is_chrome_ios = /CriOS\/[\d]+/.test(navigator.userAgent),
throw_outside = function (ex) {
(view.setImmediate || view.setTimeout)(function () {
throw ex;
}, 0);
},
force_saveable_type = "application/octet-stream"
// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
,
arbitrary_revoke_timeout = 1000 * 40 // in ms
,
revoke = function (file) {
var revoker = function () {
if (typeof file === "string") { // file is an object URL
get_URL().revokeObjectURL(file);
} else { // file is a File
file.remove();
}
};
setTimeout(revoker, arbitrary_revoke_timeout);
},
dispatch = function (filesaver, event_types, event) {
event_types = [].concat(event_types);
var i = event_types.length;
while (i--) {
var listener = filesaver["on" + event_types[i]];
if (typeof listener === "function") {
try {
listener.call(filesaver, event || filesaver);
} catch (ex) {
throw_outside(ex);
}
}
}
},
auto_bom = function (blob) {
// prepend BOM for UTF-8 XML and text/* types (including HTML)
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
return new Blob([String.fromCharCode(0xFEFF), blob], {
type: blob.type
});
}
return blob;
},
FileSaver = function (blob, name, no_auto_bom) {
if (!no_auto_bom) {
blob = auto_bom(blob);
}
// First try a.download, then web filesystem, then object URLs
var
filesaver = this,
type = blob.type,
force = type === force_saveable_type,
object_url, dispatch_all = function () {
dispatch(filesaver, "writestart progress write writeend".split(" "));
}
// on any filesys errors revert to saving with object URLs
,
fs_error = function () {
if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
// Safari doesn't allow downloading of blob urls
var reader = new FileReader();
reader.onloadend = function () {
var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
var popup = view.open(url, '_blank');
if (!popup) view.location.href = url;
url = undefined; // release reference before dispatching
filesaver.readyState = filesaver.DONE;
dispatch_all();
};
reader.readAsDataURL(blob);
filesaver.readyState = filesaver.INIT;
return;
}
// don't create more object URLs than needed
if (!object_url) {
object_url = get_URL().createObjectURL(blob);
}
if (force) {
view.location.href = object_url;
} else {
var opened = view.open(object_url, "_blank");
if (!opened) {
// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
view.location.href = object_url;
}
}
filesaver.readyState = filesaver.DONE;
dispatch_all();
revoke(object_url);
};
filesaver.readyState = filesaver.INIT;
if (can_use_save_link) {
object_url = get_URL().createObjectURL(blob);
setTimeout(function () {
save_link.href = object_url;
save_link.download = name;
click(save_link);
dispatch_all();
revoke(object_url);
filesaver.readyState = filesaver.DONE;
});
return;
}
fs_error();
},
FS_proto = FileSaver.prototype,
saveAs = function (blob, name, no_auto_bom) {
return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
};
// IE 10+ (native saveAs)
if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
return function (blob, name, no_auto_bom) {
name = name || blob.name || "download";
if (!no_auto_bom) {
blob = auto_bom(blob);
}
return navigator.msSaveOrOpenBlob(blob, name);
};
}
FS_proto.abort = function () {};
FS_proto.readyState = FS_proto.INIT = 0;
FS_proto.WRITING = 1;
FS_proto.DONE = 2;
FS_proto.error =
FS_proto.onwritestart =
FS_proto.onprogress =
FS_proto.onwrite =
FS_proto.onabort =
FS_proto.onerror =
FS_proto.onwriteend =
null;
return saveAs;
}(
typeof self !== "undefined" && self ||
typeof window !== "undefined" && window ||
this.content
));
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the window
if (typeof module !== "undefined" && module.exports) {
module.exports.saveAs = saveAs;
} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) {
define("FileSaver.js", function () {
return saveAs;
});
}
var getJSON = function (url, meta, callback) {
GM_xmlhttpRequest({
method: 'GET',
url: url,
headers: {
'Accept': 'application/json'
},
onload: function (response) {
if (response.status >= 200 && response.status < 400) {
callback(JSON.parse(response.responseText), meta, url);
} else {
callback(false, meta, url);
}
}
});
};
function waitForKeyElements(
selectorTxt,
/* Required: The jQuery selector string that
specifies the desired element(s).
*/
actionFunction,
/* Required: The code to run when elements are
found. It is passed a jNode to the matched
element.
*/
bWaitOnce,
/* Optional: If false, will continue to scan for
new elements even after the first match is
found.
*/
iframeSelector
/* Optional: If set, identifies the iframe to
search.
*/
) {
var targetNodes, btargetsFound;
if (typeof iframeSelector == "undefined")
targetNodes = jQuery(selectorTxt);
else
targetNodes = jQuery(iframeSelector).contents()
.find(selectorTxt);
if (targetNodes && targetNodes.length > 0) {
btargetsFound = true;
/*--- Found target node(s). Go through each and act if they
are new.
*/
targetNodes.each(function () {
var jThis = jQuery(this);
var alreadyFound = jThis.data('alreadyFound') || false;
if (!alreadyFound) {
//--- Call the payload function.
var cancelFound = actionFunction(jThis);
if (cancelFound)
btargetsFound = false;
else
jThis.data('alreadyFound', true);
}
});
} else {
btargetsFound = false;
}
//--- Get the timer-control variable for this selector.
var controlObj = waitForKeyElements.controlObj || {};
var controlKey = selectorTxt.replace(/[^\w]/g, "_");
var timeControl = controlObj[controlKey];
//--- Now set or clear the timer as appropriate.
if (btargetsFound && bWaitOnce && timeControl) {
//--- The only condition where we need to clear the timer.
clearInterval(timeControl);
delete controlObj[controlKey]
} else {
//--- Set a timer, if needed.
if (!timeControl) {
timeControl = setInterval(function () {
waitForKeyElements(selectorTxt,
actionFunction,
bWaitOnce,
iframeSelector
);
},
300
);
controlObj[controlKey] = timeControl;
}
}
waitForKeyElements.controlObj = controlObj;
}
function PrefixInteger(num, length) {
return (Array(length).join(0) + num).slice(-length);
}
function init() {
if (!document.getElementById("dUietC") && $('ul.stu').length) {
var dUietC = document.createElement("a");
dUietC.id = "dUietC";
document.getElementsByTagName("html")[0].appendChild(dUietC);
console.log('网络学堂2018助手 is running!')
// 新通知数量重新排版
$('.unsee').remove();
$('li.clearfix').each(function () {
$(this).css('height', '90px')
$(this).css('padding', '8px 8px')
if (parseInt($(this).find('span.stud').text()) > 0) {
$(this).find('span.stud').css('font-size', '50px');
$(this).find('span.stud').css('display', 'block');
$(this).find('span.stud').css('padding-left', 'none');
$(this).find('span.stud').css('text-align', 'center');
//$(this).find('span.name').text($(this).find('span.liulan').text());
$(this).find('span.liulan').remove();
} else {
$(this).find('span.stud').remove();
}
})
$('ul.stu').each(function () {
$(this).find('li').first().css('padding', '0px');
})
$('dd.stu').each(function () {
// 图片提醒
//var wlkcid = $(this).find('.hdtitle a').attr('href').match(/(?<=wlkcid=).*/);
var wlkcid = $(this).find('.hdtitle a').attr('href').slice(43);
$(this).attr('id', wlkcid)
if (parseInt($(this).find('span.green').text()) > 0) {
getJSON(`http://learn.tsinghua.edu.cn/b/wlxt/kczy/zy/student/index/zyListWj?wlkcid=${wlkcid}&size=999`, null, function (doc, meta, url) {
if (doc) {
var ddl = 0;
var now = new Date();
for (var i = 0; i < doc.object.iTotalRecords; i++) {
if (ddl <= 0 || (ddl > doc.object.aaData[i].jzsj && doc.object.aaData[i].jzsj > now.getTime())) {
ddl = doc.object.aaData[i].jzsj
}
}
console.log(ddl)
var now = new Date();
var time = ddl - now.getTime();
console.log(time)
var days = Math.ceil(time / 86400000);
if (time <= 0) {
$(`#${wlkcid}`).find('li.clearfix').first().css('background', 'url(https://raw.githubusercontent.com/Exhen/learn2018helper/master/liangle.jpg)');
$(`#${wlkcid}`).find('li.clearfix').first().append(`<span style="color: red;font-size: 16px;padding: 10px 18px;line-height: 18px;width: 18px;text-align: center;display: block;float: right;">已经截止</span>`)
} else if (time <= 86400000) { //多于7天
$(`#${wlkcid}`).find('li.clearfix').first().css('background', 'url(https://raw.githubusercontent.com/Exhen/learn2018helper/master/ddl.jpg)');
$(`#${wlkcid}`).find('li.clearfix').first().append(`<span style="color: red;font-size: 16px;padding: 10px 18px;line-height: 18px;width: 18px;text-align: center;display: block;float: right;">最后一天</span>`)
} else {
$(`#${wlkcid}`).find('li.clearfix').first().css('background', 'url(https://raw.githubusercontent.com/Exhen/learn2018helper/master/ddl.jpg)');
$(`#${wlkcid}`).find('li.clearfix').first().append(`<span style="color: red;font-size: 16px;padding: 10px 18px;line-height: 18px;width: 18px;text-align: center;display: block;float: right;">还剩<span style="text-align: center;">${days}</span>天</span>`)
}
$(`#${wlkcid}`).find('p.p_img').remove();
}
})
} else {
$(this).find('li.clearfix').first().css('background', 'url(https://raw.githubusercontent.com/Exhen/learn2018helper/master/good.jpg)');
$(this).find('li.clearfix').first().append(`<span style="color: black;font-size: 16px;padding: 10px 18px;line-height: 18px;width: 18px;text-align: center;display: block;float: right;">没有作业</span>`)
$(this).find('p.p_img').remove();
}
// 导出日历
var calendarBtn = $('<p class="calendar_btn myToobar"><a href="javascript:void(0)">导出上课时间到日历文件</a></p>');
calendarBtn.click(function () {
console.log($(this).attr('class'))
var classTitle = $(this).parent().parent().find('a.stu').text().replace(/\(.*-.*\)/, '').trim();
var classDesc = $(this).parent().parent().find('.stu_btn_pai span').last().attr('title');
var classTeacher = $(this).parent().parent().find('.stu_btn span').text();
var thisSems = $('#profile0-tab').attr('onClick').match(/\(.*-.*\)/)
var classUntil = thisSems[0].split('-')[1] + (thisSems[0].split('-')[2] > 1 ? '0101' : '0701') + 'T000000Z';
console.log(classDesc);
if (classDesc && !classDesc.match('星期第0节')) {
for (var i = 0; i < classDesc.split(',').length; i++) {
var eachClass = classDesc.split(',')[i];
console.log(eachClass)
var classLocation = eachClass.split(',')[1];
var classTimeBegin = '',
classTimeEnd = $(),
classWeek = '';
switch (eachClass.match(/星期(.)/)[1]) {
case '日':
classWeek = 'SU';
break;
case '一':
classWeek = 'MO';
break;
case '二':
classWeek = 'TU';
break;
case '三':
classWeek = 'WE';
break;
case '四':
classWeek = 'TH';
break;
case '五':
classWeek = 'FR';
break;
case '六':
classWeek = 'SA';
break;
}
var now = new Date();
var today = PrefixInteger(now.getUTCFullYear(), 4) + PrefixInteger(now.getUTCMonth() + 1, 2) + PrefixInteger(now.getUTCDate(), 2);
switch (eachClass.match(/第(.)节/)[1]) {
case '1':
var classTimeBegin = today + 'T000000Z';
var classTimeEnd = today + 'T013500Z';
break;
case '2':
var classTimeBegin = today + 'T015000Z';
var classTimeEnd = today + 'T041500Z';
break;
case '3':
var classTimeBegin = today + 'T053000Z';
var classTimeEnd = today + 'T070500Z';
break;
case '4':
var classTimeBegin = today + 'T072000Z';
var classTimeEnd = today + 'T085500Z';
break;
case '5':
var classTimeBegin = today + 'T090500Z';
var classTimeEnd = today + 'T104000Z';
break;
case '6':
var classTimeBegin = today + 'T112000Z';
var classTimeEnd = today + 'T134500Z';
break;
}
var calendarData = `BEGIN:VCALENDAR\nVERSION:2.0\nMETHOD:PUBLISH\nBEGIN:VEVENT\nORGANIZER:${classTeacher}\nDTSTART;TZID=Asia/Shanghai:${classTimeBegin}\nDTEND;TZID=Asia/Shanghai:${classTimeEnd}\nRRULE:FREQ=WEEKLY;BYDAY=${classWeek};UNTIL=${classUntil};WKST=MO\nLOCATION:${classLocation}\nSUMMARY:${classTitle}(${classTeacher})\nDESCRIPTION:${classDesc}\nPRIORITY:5\nCLASS:PUBLIC\nBEGIN:VALARM\nTRIGGER:-PT15M\nACTION:DISPLAY\nDESCRIPTION:Reminder\nEND:VALARM\nEND:VEVENT\nEND:VCALENDAR`;
var file = new File([calendarData], (classTitle + '-' + i + '.ics'), {
type: "text/plain;charset=utf-8"
});
saveAs(file)
}
alert('日历文件下载成功,使用Outlook等邮件客户端打开即可将日历同步至邮件账户。')
} else {
alert('课程时间错误,无法导出。')
}
})
$(this).find('div.state.stu').append(calendarBtn);
// 作业日历
var ddlBtn = $('<p class="calendar_btn myToobar"><a href="javascript:void(0)">导出作业DDL到日历文件</a></p>');
ddlBtn.click(function () {
blockerTemp = blocker;
blockerTemp.addClass('ddlBtn')
$('body').prepend(blockerTemp);
$('.blocker.ddlBtn').empty();
$('.blocker.ddlBtn').append('<span class="fixedCenter" style="font-size:30px;color:white">Loading...</span>')
if (parseInt($(this).parent().parent().parent().find('span.green').text()) > 0) {
var classTitle = $(this).parent().parent().find('a.stu').text().replace(/\(.*-.*\)/, '').trim();
var classTeacher = $(this).parent().parent().find('.stu_btn span').text();
getJSON(`http://learn.tsinghua.edu.cn/b/wlxt/kczy/zy/student/index/zyListWj?wlkcid=${wlkcid}&size=999`, null, function (doc, meta, url) {
$('.blocker.ddlBtn').remove();
if (doc) {
var ddl = 0;
for (var i = 0; i < doc.object.iTotalRecords; i++) {
var current = doc.object.aaData[i];
var tempDate = new Date();
tempDate.setTime(current.jzsj - 3600000);
console.log(current.jzsj)
var tempDateBefore = new Date();
tempDateBefore.setTime(current.jzsj - 86400000 - 3600000);
var currDDL = PrefixInteger(tempDate.getUTCFullYear(), 4) + PrefixInteger(tempDate.getUTCMonth() + 1, 2) + PrefixInteger(tempDate.getUTCDate(), 2) + 'T' + PrefixInteger(tempDate.getUTCHours(), 2) + PrefixInteger(tempDate.getUTCMinutes(), 2) + PrefixInteger(tempDate.getUTCSeconds(), 2) + 'Z';
var currDDLBefore = PrefixInteger(tempDateBefore.getUTCFullYear(), 4) + PrefixInteger(tempDateBefore.getUTCMonth() + 1, 2) + PrefixInteger(tempDateBefore.getUTCDate(), 2) + 'T' + PrefixInteger(tempDateBefore.getUTCHours(), 2) + PrefixInteger(tempDateBefore.getUTCMinutes(), 2) + PrefixInteger(tempDateBefore.getUTCSeconds(), 2) + 'Z';
var currTitle = current.bt;
var calendarData = `BEGIN:VCALENDAR\nVERSION:2.0\nMETHOD:PUBLISH\nBEGIN:VEVENT\nORGANIZER:${classTeacher}\nDTSTART;TZID=Asia/Shanghai:${currDDLBefore}\nDTEND;TZID=Asia/Shanghai:${currDDL}\nSUMMARY:${currTitle}(${classTitle})\nDESCRIPTION:${classTitle}(${classTeacher}),截止时间:${current.jzsjStr}\nPRIORITY:5\nCLASS:PUBLIC\nBEGIN:VALARM\nTRIGGER:-PT1440M\nACTION:DISPLAY\nDESCRIPTION:Reminder\nEND:VALARM\nEND:VEVENT\nEND:VCALENDAR`;
var file = new File([calendarData], (classTitle + '-' + PrefixInteger(i, 2) + '-' + currTitle + '.ics'), {
type: "text/plain;charset=utf-8"
});
saveAs(file)
}
alert('日历文件下载成功,使用Outlook等邮件客户端打开即可将日历同步至邮件账户。')
} else {
alert('获取列表失败!请检查网络。')
}
})
} else {
$('.blocker.ddlBtn').remove();
alert('暂时没有可以导出的DDL')
}
delete blockerTemp;
})
$(this).find('div.state.stu').append(ddlBtn);
// 一键已读
var notificationBtn = $('<p class="calendar_btn myToobar"><a href="javascript:void(0)">新公告一键标记已读</a></p>');
notificationBtn.click(function () {
blockerTemp = blocker;
blockerTemp.addClass('notificationBtn');
$('body').prepend(blockerTemp);
$('.blocker.ddlBtn').empty();
$('.notificationBtn.blocker').append('<span style="background: #fffffff5;border-radius: 3px;left: 30%;right: 30%;position: fixed;text-align: center;padding: 3%;line-height: 40px;font-size: 30px;">一键已读功能不稳定,容易引起BUG,调试ing!</br>扫码催更<img style="width:400px" src="https://exhen.github.io//assets/img/qrcode.png"></span>').click(function () {
$(this).fadeOut().remove()
})
$('#manualAlert').fadeIn();
setTimeout(function () {
$('.blocker.notificationBtn').fadeOut();
$('.blocker.notificationBtn').remove();
}, 10000)
delete blockerTemp;
})
// notificationBtn.click(function () {
// var unreadNum = parseInt($(this).parent().parent().parent().find('span.orange.stud').text());
// if (unreadNum > 0) {
// blockerTemp = blocker;
// blockerTemp.attr('class', 'blocker notificationBtn')
// $('body').prepend(blockerTemp);$('.blocker.ddlBtn').empty();
// $('.blocker.notificationBtn').append('<span class="fixedCenter" style="font-size:30px;color:white">Loading...</span>')
// getJSON(`http://learn.tsinghua.edu.cn/b/wlxt/kcgg/wlkc_ggb/student/kcggListXs?size=999&wlkcid=${wlkcid}`, null, function (doc, meta, url) {
// $('.blocker.notificationBtn').remove();
// if (doc) {
// console.log(doc)
// var sucessNum = 0,
// arrivedNum = 0,
// sentNum = 0;
// for (var i = 0; i < doc.object.iTotalRecords; i++) {
// if (doc.object.aaData[i].sfyd == '否') {
// sentNum++;
// GM_xmlhttpRequest({
// method: 'GET',
// url: `http://learn.tsinghua.edu.cn/f/wlxt/kcgg/wlkc_ggb/student/beforeViewXs?wlkcid=${wlkcid}&id=${doc.object.aaData[i].ggid}`,
// headers: {
// 'Accept': 'application/json'
// },
// onload: function (response) {
// arrivedNum++;
// if (response.status >= 200 && response.status < 400) {
// console.log('gg has been read');
// sucessNum++
// } else {
// console.log(doc.object.aaData[i].ggid + ' error!')
// }
// if (arrivedNum == unreadNum) {
// if (sucessNum == unreadNum) {
// alert('一键已读成功!');
// location.reload();
// } else {
// alert(`${unreadNum-sucessNum}/${unreadNum}条公告标记已读失败!`);
// location.reload();
// }
// }
// }
// });
// }
// }
// if (sentNum !== unreadNum) {
// alert('学堂系统BUG,未读数量显示不对,建议反馈给ITS!')
// }
// } else {
// alert('获取列表失败!请检查网络。')
// }
// })
// } else {
// alert('没有未读公告。')
// }
// })
$(this).find('div.state.stu').append(notificationBtn);
// 批量下载
function downloadFromJson(doc, flagForOld, downloadList) {
var totalSize = 0;
for (var i = 0; i < doc.object.length; i++) {
if (!flagForOld && !doc.object[i].isNew) {
continue;
}
totalSize = totalSize + doc.object[i].wjdx;
downloadList.push(doc.object[i].wjid);
}
return totalSize
}
function getFileSize(fileByte) {
var fileSizeByte = fileByte;
var fileSizeMsg = "";
if (fileSizeByte < 1048576) fileSizeMsg = (fileSizeByte / 1024).toFixed(2) + "KB";
else if (fileSizeByte == 1048576) fileSizeMsg = "1MB";
else if (fileSizeByte > 1048576 && fileSizeByte < 1073741824) fileSizeMsg = (fileSizeByte / (1024 * 1024)).toFixed(2) + "MB";
else if (fileSizeByte > 1048576 && fileSizeByte == 1073741824) fileSizeMsg = "1GB";
else if (fileSizeByte > 1073741824 && fileSizeByte < 1099511627776) fileSizeMsg = (fileSizeByte / (1024 * 1024 * 1024)).toFixed(2) + "GB";
else fileSizeMsg = "超过1TB";
return fileSizeMsg;
}
var attachmentAllBtn = $('<p class="calendar_btn myToobar"><a href="javascript:void(0)">全部课件批量下载</a></p>');
attachmentAllBtn.click(function () {
blockerTemp = blocker;
blockerTemp.attr('class', 'blocker attachmentAllBtn')
$('body').prepend(blockerTemp);
$('.blocker.ddlBtn').empty();
$('.blocker.attachmentAllBtn').append('<span class="fixedCenter" style="font-size:30px;color:white">Loading...</span>')
getJSON(`http://learn.tsinghua.edu.cn/b/wlxt/kj/wlkc_kjxxb/student/kjxxbByWlkcidAndSizeForStudent?size=999&wlkcid=${wlkcid}`, null, function (doc, meta, url) {
$('.blocker.attachmentAllBtn').remove();
if (doc) {
// console.log(doc)
var downloadList = new Array();
var totalSize = downloadFromJson(doc, true, downloadList);
// console.log(downloadList, totalSize)
if (downloadList.length) {
if (confirm(`按确认键开始下载全部${downloadList.length}个文件(共计${getFileSize(totalSize)})。\n如果下载未开始,请检查浏览器是否拦截了本网页的弹出窗口(例如Chrome地址栏最右侧出现带小红叉的图标)`)) {
for (var i = 0; i < downloadList.length; i++) {
window.open('http://learn.tsinghua.edu.cn/b/wlxt/kj/wlkc_kjxxb/student/downloadFile?sfgk=0&wjid=' + downloadList[i])
}
}
} else {
alert('暂时无文件供下载。')
}
} else {
alert('获取列表失败!请检查网络。')
}
})
delete blockerTemp;
})
$(this).find('div.state.stu').append(attachmentAllBtn);
var attachmentNewBtn = $('<p class="calendar_btn myToobar"><a href="javascript:void(0)">新课件批量下载</a></p>');
attachmentNewBtn.click(function () {
blockerTemp = blocker;
blockerTemp.attr('class', 'blocker attachmentNewBtn')
$('body').prepend(blockerTemp);
$('.blocker.ddlBtn').empty();
$('.blocker.attachmentNewBtn').append('<span class="fixedCenter" style="font-size:30px;color:white">Loading...</span>')
getJSON(`http://learn.tsinghua.edu.cn/b/wlxt/kj/wlkc_kjxxb/student/kjxxbByWlkcidAndSizeForStudent?size=999&wlkcid=${wlkcid}`, null, function (doc, meta, url) {
$('.blocker.attachmentNewBtn').remove();
if (doc) {
console.log(doc)
var downloadList = new Array();
var totalSize = downloadFromJson(doc, false, downloadList);
console.log(downloadList, totalSize)
if (downloadList.length) {
if (confirm(`按确认键开始下载全部${downloadList.length}个文件(共计${getFileSize(totalSize)})。\n如果下载未开始,请检查浏览器是否拦截了本网页的弹出窗口(例如Chrome地址栏最右侧出现带小红叉的图标)`)) {
for (var i = 0; i < downloadList.length; i++) {
window.open('http://learn.tsinghua.edu.cn/b/wlxt/kj/wlkc_kjxxb/student/downloadFile?sfgk=0&wjid=' + downloadList[i])
}
}
} else {
alert('暂时无文件供下载。')
}
} else {
alert('获取列表失败!请检查网络。')
}
})
delete blockerTemp;
})
$(this).find('div.state.stu').append(attachmentNewBtn);
})
return true
} else {
console.log('nothing happened!')
return false
}
}
window.addEventListener('load', function () {
var icon = $('<div id="manualScript"><a ref="javascript:void(0);"><i class="webicon-recycle"></i>手动加载</a></div>');
icon.find('a').click(function () {
init();
});
$('div.header div.w div.right').append(icon)
waitForKeyElements('dd.stu', init, true)
// if (!init()) {
// console.log('appending suggestion')
// $('body').prepend('<div onClick="$(this).hide()" id="manualAlert" style="display: none;position: absolute;width: 100%;height: 100%;background: #4646466b;z-index: 999;"><span style="background: #fffffff5;border-radius: 3px;left: 30%;right: 30%;top: 25%;bottom: 25%;position: fixed;text-align: center;padding: 3%;line-height: 40px;font-size: 30px;">当前网速缓慢,脚本可能加载不畅,可以尝试右上角“手动加载”。</span></div>')
// $('#manualAlert').fadeIn();
// setTimeout(function () {
// $('#manualAlert').fadeOut();
// }, 2000)
// };
// $('body').prepend('<div onClick="$(this).hide()" id="manualAlert" style="display: none;position: absolute;width: 100%;height: 100%;background: #4646466b;z-index: 999;"><span style="background: #fffffff5;border-radius: 3px;left: 30%;right: 30%;position: fixed;text-align: center;padding: 3%;line-height: 40px;font-size: 30px;">作者偷懒,代码还没敲完!扫码催活<img src="https://exhen.github.io//assets/img/qrcode.png"></span></div>')
// $('#manualAlert').fadeIn();
// setTimeout(function () {
// $('#manualAlert').fadeOut();
// }, 10000)
})