煤炭行业现代远程教育培训网挂课

好兄弟,我知道你很累,下班后好好休息。

// ==UserScript==
// @name         煤炭行业现代远程教育培训网挂课
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  好兄弟,我知道你很累,下班后好好休息。
// @author       You
// @match        https://www.coaledu.net/html/courseDetails.html*
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_openInTab
// @grant        GM_notification
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==
// 界面载入URL
//https://www.coaledu.net/html/courseDetails.html?courseID=2135
// 查询课程章节详情
//https://www.coaledu.net/course/front/permit/course/2628/directory?courseid=2628&deviceinfo={"TerminalModel":"iPhone12,1","IMEI":"3E3A8900-F3C3-4DEC-855F-6DDCE79EBB5B","AppCode":"12","AppVersion":"2.2.2","TerminalType":"ios","NetworkType":"wifi","Resolution":"414.000000*896.000000","SysVersion":"15.4"}
// 上传学习进度
//https://www.coaledu.net/course/front/course/2628/batchuploadvideoschedule?courseid=2628&datas=[{"upType":"normal","position":925,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:06:35","watchTime":"2022-07-31 01:06:35","videoID":"15930","courseID":"2628"},{"upType":"normal","position":955,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:07:05","watchTime":"2022-07-31 01:07:05","videoID":"15930","courseID":"2628"},{"upType":"normal","position":985,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:07:35","watchTime":"2022-07-31 01:07:35","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1015,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:08:05","watchTime":"2022-07-31 01:08:05","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1045,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:08:35","watchTime":"2022-07-31 01:08:35","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1075,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:09:05","watchTime":"2022-07-31 01:09:05","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1105,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:09:35","watchTime":"2022-07-31 01:09:35","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1135,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:10:05","watchTime":"2022-07-31 01:10:05","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1165,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:10:35","watchTime":"2022-07-31 01:10:35","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1195,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:11:05","watchTime":"2022-07-31 01:11:05","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1225,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:11:35","watchTime":"2022-07-31 01:11:35","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1255,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:12:05","watchTime":"2022-07-31 01:12:05","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1285,"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:12:35","watchTime":"2022-07-31 01:12:35","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1288,"isDrag":0,"spaceTime":3,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:12:38","watchTime":"2022-07-31 01:12:38","videoID":"15930","courseID":"2628"},{"upType":"normal","position":1288,"isDrag":0,"spaceTime":3,"platform":"ios","videoType":"1","lastTime":"2022-07-31 01:12:38","watchTime":"2022-07-31 01:12:38","videoID":"15930","courseID":"2628"}]&deviceinfo={"TerminalModel":"iPhone12,1","IMEI":"3E3A8900-F3C3-4DEC-855F-6DDCE79EBB5B","AppCode":"12","AppVersion":"2.2.2","TerminalType":"ios","NetworkType":"wifi","Resolution":"414.000000*896.000000","SysVersion":"15.4"}&studyType=0


(function() {
//创建函数
//获取用户authorization
setTimeout(function() {
var iframe = document.createElement('iframe');
var auth;
iframe.onload = function()
{
    //Iframes must be appended to the DOM in order to be loaded
    //Iframes do not load immediately nor synchronously
    //now (after load) we can use iframe.contentWindow:
    //window.localStorage = iframe.contentWindow.localStorage; //you can use it, but better is like:
    var ifrLocalStorage = iframe.contentWindow.localStorage;
    //But DO NOT: "document.body.removeChild(iframe);" because after it access on 'Storage' will be denied
    auth = ifrLocalStorage.getItem('coaledu-front-token');
    console.log("#0 获取到用户登录(不可用)凭证: ",auth);
};
iframe.src = 'about:blank';
document.body.appendChild(iframe);

//根据身份证计算唯一IMEI
function jCode(value) {
    var keys = "A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z";
    var kleng = keys.length;
    var kstr = keys.split("");
    var v = "",cat, cat1, cat2, cat3;
    for (var i = 0; i <value.length; i ++) {
        cat = value.charCodeAt(i);
        cat1 = cat % kleng;
        cat = (cat - cat1) / kleng;
        cat2 = cat % kleng;
        cat = (cat - cat2) / kleng;
        cat3 = cat % kleng;
        v += kstr[cat3] + kstr[cat2] + kstr[cat1];
    }
    return v;
    console.log(v);
}
//分割函数
function getStr(string,str,where){
  var str_before = string.split(str)[0];
  var str_after = string.split(str)[1];
  if (where == "before"){
    return str_before;
  }else if(where =="after"){
    return str_after;
  }
}
//格式化时间
function format(dat){
    //获取年月日,时间
    var year = dat.getFullYear();
    var mon = (dat.getMonth()+1) < 10 ? "0"+(dat.getMonth()+1) : dat.getMonth()+1;
    var data = dat.getDate()  < 10 ? "0"+(dat.getDate()) : dat.getDate();
    var hour = dat.getHours()  < 10 ? "0"+(dat.getHours()) : dat.getHours();
    var min =  dat.getMinutes()  < 10 ? "0"+(dat.getMinutes()) : dat.getMinutes();
    var seon = dat.getSeconds() < 10 ? "0"+(dat.getSeconds()) : dat.getSeconds();

    var newDate = year +"-"+ mon +"-"+ data +" "+ hour +":"+ min +":"+ seon;
    return newDate;
}
//获取时间
var dat = new Date();
//格式化时间
var newDate = format(dat);

//主程序启动
var userid = document.getElementsByClassName('person-name')[0].innerText;
if(userid=="登录(不可用)"){
  alert("未登录(不可用),请进行登录(不可用)");
} else if(userid.indexOf('1')>=0) {

//获取课程ID
function getcourseID(){
  //并入主程序中
}
//获取章节ID
getvideoID = function (checklink){
    var lis = document.getElementsByClassName('hd')[0].getElementsByTagName('li');
    lis[1].click();
    GM_xmlhttpRequest({
        method: "GET",
        url: encodeURI(checklink),
        responseType: "json",
        timeout:15000,
        onload: function(res){
            if (res.responseText!=="") {
                var d = JSON.parse(res.responseText);
                if (d.status=="1" && d.message=="success") {
                    console.log("#5 尝试获取当前课程video信息");

                    // 处理 directorys
                    if (d.data.directorys && d.data.directorys.length !== 0) {
                        d.data.directorys.forEach(directory => {
                            // 处理直接挂在 directory 下的 videos
                            if (directory.videos && directory.videos.length) {
                                directory.videos.forEach(video => {
                                    console.log("#5 获取视频信息成功:", directory.ID, video.ID, video.length);
                                    getuploadurl(courseID, video.ID, video.length);
                                });
                            }
                            // 处理 children 中的 videos
                            if (directory.children && directory.children.length) {
                                directory.children.forEach(child => {
                                    if (child.videos && child.videos.length) {
                                        child.videos.forEach(video => {
                                            console.log("#5 获取子目录视频信息成功:", child.ID, video.ID, video.length);
                                            getuploadurl(courseID, video.ID, video.length);
                                        });
                                    }
                                });
                            }
                        });
                    }

                    // 处理独立的 videos
                    if (d.data.videos && d.data.videos.length !== 0) {
                        d.data.videos.forEach(video => {
                            console.log("#5 获取视频信息成功:", video.ID, video.length);
                            getuploadurl(courseID, video.ID, video.length);
                        });
                    }
                } else {
                    document.getElementsByClassName('con-carousel')[1].innerHTML += '<h1>This is bug2</h1>';
                    console.log("@@ this is bug2");
                }
            } else {
                document.getElementsByClassName('con-carousel')[1].innerHTML += '<h1>This is bug1</h1>';
                console.log("@@ this is bug1");
            }
        }
    });
}
getuploadurl = function(courseID,videosID,videostime){
  var videosdatas = '[{"upType":"normal","position":'+videostime+',"isDrag":0,"spaceTime":30,"platform":"ios","videoType":"1","lastTime":"'+newDate+'","watchTime":"'+newDate+'","videoID":"'+videosID+'","courseID":"'+courseID+'"}]';
  //var uploadlink = 'https://www.coaledu.net/course/front/course/'+courseID+'/batchuploadvideoschedule?courseid='+courseID+'&datas='+encodeURIComponent(videosdatas)+'&deviceinfo='+encodeURIComponent(deviceinfo)+'&studyType=0';
  //这里删除了deviceid因为Authorization加密是根据imei计算的,随机生成的imei和浏览器登录(不可用)所对应的Authorization不匹配
  //如果post包含了deviceid信息,则会提示别处登录(不可用)
  //如果用浏览器登陆所获的Authorization,在post的时候不提交deviceid也可以成功,所以删掉了
  var uploadlink = 'https://www.coaledu.net/course/front/course/'+courseID+'/batchuploadvideoschedule?courseid='+courseID+'&datas='+encodeURIComponent(videosdatas)+'&studyType=0';
  console.log(uploadlink);
  GM_xmlhttpRequest({
    method:"POST",
    url:uploadlink,
    responseType:"json",
    timeout:15000,
    headers: {
      "Authorization": auth,
      "User-Agent": "zhong guo mei tan jiao yu pei xun/2.2.2 (iPhone; iOS 15.4; Scale/2.00)"
    },
    onload:function(res){
      if (res.responseText!=="") {
		var d =  JSON.parse(res.responseText);
        if (d.status=="1"&&d.message=="上传视频进度成功") {
        	console.log("#6 上传当前课程video信息成功",uploadlink)
			document.getElementsByClassName('detailDet')[0].innerHTML +="学习成功<br>";
        }
      }
    }
  })
}
  url = window.location.href;
  courseID = getStr(url,'=','after');
  imei = "3E3A8900-F3C3-4DEC-855F-"+jCode(userid.substring(userid.length-4,userid.length));
  //imei ="3E3A8900-F3C3-4DEC-855F-6DDCE79EBB5B";
  deviceinfo = '{"TerminalModel":"iPhone12,1","IMEI":"'+imei+'","AppCode":"12","AppVersion":"2.2.2","TerminalType":"ios","NetworkType":"wifi","Resolution":"414.000000*896.000000","SysVersion":"15.4"}';
  console.log("#1 获取到用户账户信息:",userid);
  console.log("#2 计算出用户唯一IMEI:",imei);
  console.log("#3 计算出用户唯一DeviceInfo:",deviceinfo);
  checklink = 'https://www.coaledu.net/course/front/permit/course/'+courseID+'/directory?courseid='+courseID;
  console.log("#4 计算出当前课程章节URL:",checklink);
  document.getElementsByClassName('detailDet')[0].innerHTML +='<button onclick="getvideoID(checklink)" style="display: inline-block;border-radius: 3px;font-size: 16px;background: rgb(72,127,222);color: #fff;width: 140px;text-align: center;margin:15px;padding: 10px 20px;font-weight:bold;">加载外挂</button>';
}
}, 3000); // 延迟5000毫秒(5秒)
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址