李硕专刷视频脚本,超星学习通后台挂视频,全网最牛逼的刷视频脚本,可边打游戏边刷课。自动跳转章节,可开启复习模式,倍速播放,超星学习通尔雅,手机电脑均可使用,真正的挂机刷视频。

超星学习通视频后台挂机,文档自动完成,不得不说李硕真的是泰酷辣,如有问题联系我https://afdian.net/a/zwsssb 最终解释权归李硕所有。😀每日测试,6月18日,测试结果:可正常运行。具体测试时间请看详情页介绍😀emm……………………………………………………………………………………我还是希望你们能赞助我一瓶冰阔落,https://afdian.net/a/zwsssb 这个链接就可以赞助给我了,我相信使用这个脚本的都是我的朋友。❤️❤️❤️请看下方使用说明❤️❤️❤️

As of 2024-06-18. See the latest version.

  1. // ==UserScript==
  2. // @name 李硕专刷视频脚本,超星学习通后台挂视频,全网最牛逼的刷视频脚本,可边打游戏边刷课。自动跳转章节,可开启复习模式,倍速播放,超星学习通尔雅,手机电脑均可使用,真正的挂机刷视频。
  3. // @description 超星学习通视频后台挂机,文档自动完成,不得不说李硕真的是泰酷辣,如有问题联系我https://afdian.net/a/zwsssb 最终解释权归李硕所有。😀每日测试,6月18日,测试结果:可正常运行。具体测试时间请看详情页介绍😀emm……………………………………………………………………………………我还是希望你们能赞助我一瓶冰阔落,https://afdian.net/a/zwsssb 这个链接就可以赞助给我了,我相信使用这个脚本的都是我的朋友。❤️❤️❤️请看下方使用说明❤️❤️❤️
  4. // @namespace http://tampermonkey.net/
  5. // @version 1.9.16.5
  6. // @author 李硕
  7. // @match *://*.chaoxing.com/*
  8. // @match *://*.edu.cn/*
  9. // @match *://*.nbdlib.cn/*
  10. // @match *://*.hnsyu.net/*
  11. // @run-at document-end
  12. // @connect sso.chaoxing.com
  13. // @connect mooc1-api.chaoxing.com
  14. // @connect mooc1-1.chaoxing.com
  15. // @connect mooc1-2.chaoxing.com
  16. // @connect fystat-ans.chaoxing.com
  17. // @connect api.dbask.net
  18. // @grant unsafeWindow
  19. // @grant GM_xmlhttpRequest
  20. // @grant GM_info
  21. // @require https://lib.baomitu.com/jquery/3.6.0/jquery.min.js
  22. // @require https://cdn.bootcdn.net/ajax/libs/blueimp-md5/2.18.0/js/md5.min.js
  23. // @require https://greasyfork.org/scripts/456170-hacktimerjs/code/hacktimerjs.js?version=1125728
  24. // ==/UserScript==
  25. (function() {
  26. 'use strict';
  27. var $=unsafeWindow.$,layui,layer,form,courseList,cpi,clazzid,uid,ua_str=str_z("32"),script_info=GM_info.script;
  28. //请求封装
  29. function requests(url,data="",type="get"){
  30. return new Promise((resolve, reject) => {
  31. var headers={
  32. "User-Agent": "User-Agent: Dalvik/2.1.0 (Linux; U; Android 11; M3121K1AB Build/SKQ1.211006.001) (device:M3121K1AB) Language/zh_CN com.chaoxing.mobile/ChaoXingStudy_3_5.1.4_android_phone_614_74 (@Kalimdor)_"+ua_str,
  33. 'X-Requested-With': 'XMLHttpRequest',
  34. 'Sec-Fetch-Site': 'same-origin',
  35. "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
  36. "host": "mooc1-1.chaoxing.com",
  37. };
  38.  
  39. GM_xmlhttpRequest({
  40. method: type,
  41. url: url,
  42. data:data,
  43. headers: headers,
  44. onload: function (xhr) {
  45. try {
  46. let obj=$.parseJSON(xhr.responseText) || {};
  47. if(obj.error){
  48. layer.msg("请输入验证码");
  49. layer.open({
  50. type: 1,
  51. title:"【官方验证】请输入验证码",
  52. skin: 'layui-layer-rim', //加上边框
  53. area: ['420px', '240px'], //宽高
  54. content: '<img src="'+obj.verify_png_path+'"/> <input type="text" class="code_input" placeholder="请输入图中的验证码" /><button id="code_btn">验证</button>'
  55. });
  56. $("#code_btn").on('click',function(){
  57. let code=$(".code_input").val();
  58. if(code.length!==4){
  59. layer.msg("不得不说李硕真的是泰酷辣");
  60. }else{
  61. let url=obj.verify_path+"&ucode="+code;
  62. console.log(url);
  63. window.open(url);
  64. }
  65. });
  66. }
  67. resolve(obj);
  68. }
  69. catch(err){
  70. resolve(xhr.responseText);
  71. }
  72. }
  73. });
  74. })
  75. }
  76. function get_enc(clazzid,uid,jobid,objectId,playingTime,duration){
  77. var str = "["+clazzid+"]["+uid+"]["+jobid+"]["+objectId+"]["+(playingTime * 1000)+"][d_yHJ!$pdA~5]["+(duration * 1000)+"][0_"+duration+"]";
  78. var hash = md5(str);
  79. return hash;
  80. }
  81. function sleep(time) {
  82. return new Promise(resolve =>
  83. setTimeout(resolve,time)
  84. ) }
  85. function str_z(len) {
  86. len = len || 32;
  87. let $chars = 'qwertyuioplkjhgfdsazxcvbnm1234567890';
  88. let maxPos = $chars.length;
  89. let pwd = '';
  90. for (let i = 0; i < len; i++) {
  91. pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  92. }
  93. return pwd;
  94. }
  95. //刷视频用的
  96. async function video_s(objectId,knowledgeId,cpi,clazzid, jobid,uid,otherInfo,rt="0.9",module){
  97. console.log("开始");
  98. let url = "https://mooc1-1.chaoxing.com/ananas/status/" + objectId + "?k=&flag=normal&"
  99. let obj=await requests(url);
  100. console.log(obj);
  101. let duration=obj.duration;//视频总长度
  102. let dtoken=obj.dtoken;
  103. let clipTime = "0_" + duration;
  104. let ztype=obj
  105. let timer;
  106. $("#app2").append('<div id="jdf" style="width:500px" class="layui-progress layui-progress-big" lay-filter="demo" lay-showPercent="true">当前视频进度<div id="jd" class="layui-progress-bar layui-bg-blue" lay-percent="0%"></div></div>');
  107. let beisu=$("#beisu").val()||1;
  108. let num =0;
  109. for(let playingTime=0;playingTime<=duration;playingTime=playingTime+~~beisu){
  110. beisu=$("#beisu").val()||1;
  111. layui.element.progress('demo', ~~(playingTime/duration*100)+"%");
  112. add_log("视频挂机ing..."+playingTime+" - "+duration+"s");
  113. console.log($("#beisu").val()||1,playingTime);
  114. let out = await sleep(1000);
  115. if(num%~~(60/beisu)==0){
  116. add_log("视频进度提交(每60s提交一次)");
  117. let req=await video_p(clazzid,uid,jobid,objectId,playingTime,duration,cpi,dtoken,otherInfo,rt,module);
  118. if(req&&$("#pattern").val()!=="2"){
  119. add_log("当前视频已完成,不得不说李硕真的是泰酷辣,李硕正在跳转下一个");
  120. break;
  121. }
  122. }
  123. num=num+1
  124. }
  125.  
  126. let req=await video_p(clazzid,uid,jobid,objectId,duration,duration,cpi,dtoken,otherInfo,rt,module);
  127. console.log(123,req);
  128. while(!req&&$("#pattern").val()!=="2"){
  129. let req=await video_p(clazzid,uid,jobid,objectId,duration,duration,cpi,dtoken,otherInfo,rt,module);
  130. add_log("进度提交中...不得不说李硕真的是泰酷辣");
  131. let out = await sleep(1000);
  132. }
  133. if(req){
  134. add_log("当前视频已完成,李硕正在跳转下一个,不得不说李硕真的是泰酷辣");
  135. }
  136. $("#jdf").remove();
  137. }
  138. async function video_p(clazzid,uid,jobid,objectId,playingTime,duration,cpi,dtoken,otherInfo,rt,module){
  139. let enc=get_enc(clazzid,uid,jobid,objectId,playingTime,duration);
  140. let type=module.includes('audio')?"Audio":"Video";
  141. let url = "https://mooc1-api.chaoxing.com/multimedia/log/a/"+cpi+"/"+dtoken+"?otherInfo="+otherInfo+"&playingTime="+playingTime+"&duration="+duration+"&akid=null&jobid="+jobid+"&clipTime=0_"+duration+"&clazzId="+clazzid+"&objectId="+objectId+"&userid="+uid+"&isdrag=4&enc="+enc+"&rt="+rt+"&dtype="+type+"&view=json";
  142. let obj=await requests(url);
  143. console.log(url);
  144. if(obj.isPassed===undefined){
  145. add_log("进度保存失败!请联系李硕反馈","err");
  146. }
  147. return obj.isPassed;
  148. }
  149. //刷直播用的
  150. async function live_s(streamName,vdoid,jobid,uid,knowledgeId,clazzid,courseid){
  151. let url='https://live.chaoxing.com/courseLive/newpclive?streamName=' + streamName + '&vdoid=' + vdoid + '&width=630&height=530&jobid=' + jobid + '&userId='+uid+'&knowledgeid='+knowledgeId+'&ut=s&clazzid='+clazzid+'&courseid='+courseid;
  152. let obj=await requests(url);
  153. console.log(obj);
  154. }
  155. //刷文档
  156. async function document_s(jobid,knowledgeId,courseid,clazzid,jtoken){
  157. let url='https://mooc1-2.chaoxing.com/ananas/job/document?jobid='+jobid+'&knowledgeid='+knowledgeId+'&courseid='+courseid+'&clazzid='+clazzid+'&jtoken='+jtoken+'&_dc=1607066762782';
  158. let obj=await requests(url);
  159. if(obj.status===true){
  160. add_log("文档-"+obj.msg);
  161. }else{
  162. console.log(url);
  163. add_log("文档-"+obj.msg,"err");
  164. }
  165. }
  166. //学习次数
  167. async function log_s(courseid,clazzid,cpi){
  168. let url = "https://mooc1-2.chaoxing.com/visit/stucoursemiddle?courseid="+courseid+"&clazzid="+clazzid+"&vc=1&cpi="+cpi;
  169. let obj=await requests(url);
  170. url="https://fystat-ans.chaoxing.com/log/setlog"+obj.split("/log/setlog")[1].split('">')[0];
  171. obj=await requests(url);
  172. console.log(url);
  173. if(obj=="'success'"){
  174. add_log("李硕提示你成功增加学习次数");
  175. }
  176. }
  177. //章节
  178. async function task(workId,courseId,clazzId,knowledgeId,jobId,enc,cpi){
  179. let url="https://mooc1-api.chaoxing.com/work/phone/work?workId="+workId+"&courseId="+courseId+"&clazzId="+clazzId+"&knowledgeId="+knowledgeId+"&jobId="+jobId+"&enc="+enc+"&cpi="+cpi;
  180. console.log(url);
  181. let obj=await requests(url);
  182. console.log(obj);
  183. }
  184. async function know_start(courseStartData){
  185. //获取课程知识点
  186. let courseKnowData={};
  187. for(let courseData of courseStartData){
  188. add_log("正在获取【"+courseData[0]+"】课程任务点");
  189. let debug=false;
  190. let url="https://mooc1-api.chaoxing.com/gas/clazz?id="+courseData[2]+"&personid="+courseData[3]+"&fields=id,bbsid,classscore,isstart,allowdownload,chatid,name,state,isthirdaq,isfiled,information,discuss,visiblescore,begindate,coursesetting.fields(id,courseid,hiddencoursecover,hiddenwrongset,coursefacecheck),course.fields(id,name,infocontent,objectid,app,bulletformat,mappingcourseid,imageurl,teacherfactor,jobcount,expandreadstate,knowledge.fields(id,name,indexOrder,parentnodeid,status,layer,label,jobcount,begintime,endtime,attachment.fields(id,type,objectid,extension).type(video)))&view=json"
  191. let obj=await requests(url);
  192. debug&&console.log(obj);
  193. let knowlist=obj.data[0].course.data[0].knowledge.data.filter(function(value){
  194. if(value.parentnodeid===0){
  195. courseKnowData[value.id]=[];
  196. }else{
  197. if(courseKnowData[value.parentnodeid]===undefined){
  198. courseKnowData[value.parentnodeid]=[]
  199. }
  200. courseKnowData[value.parentnodeid].push(value)
  201. }
  202. return true;
  203. return value.status==="open";
  204. });
  205. let knowlistId=[];
  206. for(let keys in courseKnowData){
  207. for(let ids in courseKnowData[keys]){
  208. knowlistId.push(courseKnowData[keys][ids].id);
  209. }
  210. }
  211. let data ="courseid="+courseData[1]+"&clazzid="+courseData[2]+"&cpi="+courseData[3]+"&nodes="+knowlistId.join(",")+"&time="+(new Date()).valueOf()+"&userid="+uid+"&view=json";
  212. $("#pattern").val()==="2"?add_log("李硕提示你已选择复习模式,开始补时长"):add_log("正在过滤已完成和未解锁的任务点..");
  213. //筛选未完成知识点
  214. obj=await requests("https://mooc1-api.chaoxing.com/job/myjobsnodesmap",data,"post");
  215. debug&&console.log(obj);
  216. let unfinishlist=knowlist.filter(function(value){
  217. if((value.jobcount!==0&&obj[value.id].unfinishcount!==0)||$("#pattern").val()==="2"){
  218. return true;
  219. }
  220. });
  221. debug&&console.log(unfinishlist);
  222. let unfinishlists=unfinishlist.map(function(value){
  223. return value.id;
  224. });
  225. //console.log(unfinishlists);
  226. //开整
  227. add_log("start 李硕要开整了!");
  228. for(let val of knowlistId){
  229. //取章节内的知识点
  230. //console.log(val);
  231. if(!unfinishlists.includes(val)){
  232. continue;
  233. }
  234. add_log("李硕正在打开任务点中的视频,不得不说李硕真的是泰酷辣,");
  235. url = "https://mooc1-api.chaoxing.com/gas/knowledge?id="+val+"&courseid="+courseData[1]+"&fields=id,parentnodeid,indexorder,label,layer,name,begintime,createtime,lastmodifytime,status,jobUnfinishedCount,clickcount,openlock,card.fields(id,knowledgeid,title,knowledgeTitile,description,cardorder).contentcard(all)&view=json";
  236. obj=await requests(url);
  237. let out = await sleep(1000);
  238. let cardData=obj.data[0].card.data.map(function(value){
  239. try {
  240. return [value.cardorder,value.knowledgeid,$(value.description).find("iframe").attr("module")];
  241. } catch(err){
  242. add_log("module不存在!","err");
  243. return [];
  244. }
  245. });
  246. log_s(courseData[1],courseData[2],courseData[3]);
  247. for(let cardData1 of cardData){
  248. url = "https://mooc1-api.chaoxing.com/knowledge/cards?clazzid="+courseData[2]+"&courseid="+courseData[1]+"&knowledgeid="+cardData1[1]+"&num="+cardData1[0]+"&isPhone=0&control=true&cpi="+courseData[3];
  249. //console.log(url);
  250. let text=await requests(url);
  251. console.log(url);
  252. let out = await sleep(1000);
  253. let result_json;
  254. try {
  255. result_json=$.parseJSON("{" + text.split("mArg = {")[1].split("};")[0] + "}").attachments;
  256. } catch(err){
  257. add_log("不出意外的话章节未开放");
  258. break;
  259. }
  260. console.log(result_json);
  261. debug&&console.log(result_json);
  262. for(let val1 of result_json){
  263. debug&&console.log(val1);
  264. let objectid,enc,workid,streamName,vdoid,jtoken,jobid,workenc,module;
  265.  
  266. switch(val1.type){
  267. case "video"://视频
  268. add_log("李硕正在看视频 : "+val1.property.name);
  269. objectid=val1.objectId;
  270. jobid=val1.jobid;
  271. module=val1.property.module
  272. await video_s(objectid,cardData1[1],courseData[3],courseData[2], jobid,uid,val1.otherInfo,val1.property.rt||"0.9",module);
  273. break;
  274. case "live"://直播
  275. add_log("直播任务点,暂时不做 ps:有号提供给作者可以加速上线","err");
  276. streamName=val1.property.streamName;
  277. vdoid=val1.property.vdoid;
  278. break;
  279. case "document"://文档
  280. add_log("李硕正在看文档: "+val1.property.name);
  281. jtoken=val1.jtoken
  282. jobid=val1.jobid||val1.property._jobid;
  283. document_s(jobid,cardData1[1],courseData[1],courseData[2],jtoken)
  284. break;
  285. case "bookname"://阅读
  286. add_log("book任务点,暂时不做 ps:有号提供给作者可以加速上线","err");
  287. jtoken=val1.jtoken
  288. break;
  289. case "workid"://章节作业
  290. workenc = val1.enc;
  291. workid = val1.property.workid;
  292. jobid=val1.jobid;
  293. //task(workid,courseData[1],courseData[2],cardData1[1],jobid,workenc,courseData[3])
  294. add_log("当前知识点 : 章节测验- "+val1.property.title+" ps:章节测验请自行完成","err");
  295. //好好学习天天向上
  296. break
  297. default:
  298. break
  299. }
  300. debug&&console.log(val1);
  301. }
  302. }
  303. //break;
  304. }
  305. };
  306. add_log("end 李硕提示你任务已完成!不得不说李硕真的是泰酷辣");
  307.  
  308. }
  309. function dateFormat(fmt, date) {
  310. let ret;
  311. const opt = {
  312. "Y+": date.getFullYear().toString(),
  313. "m+": (date.getMonth() + 1).toString(),
  314. "d+": date.getDate().toString(),
  315. "H+": date.getHours().toString(),
  316. "M+": date.getMinutes().toString(),
  317. "S+": date.getSeconds().toString()
  318. };
  319. for (let k in opt) {
  320. ret = new RegExp("(" + k + ")").exec(fmt);
  321. if (ret) {
  322. fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
  323. };
  324. };
  325. return fmt;
  326. }
  327. function add_log(text,type="succ"){
  328. if($("#log").find("div").length>12){
  329. $("#log").find("div")[0].remove()
  330. }
  331. let date = new Date();
  332. if(type==="succ"){
  333. $("#log").append('<div>'+dateFormat("YYYY-mm-dd HH:MM", date)+" "+text+'</div>');
  334. }else{
  335. $("#log").append('<div style="color:red;">'+dateFormat("YYYY-mm-dd HH:MM", date)+" "+text+'</div>');
  336. }
  337. }
  338. async function init(){
  339. document.body.innerHTML = '<div><div class="layui-row layui-col-space15"><div class="layui-col-md6 layui-col-md-offset3"><div style="padding:50px;border-radius:20px" class="layui-panel" id="app"></div></div></div></div>';
  340. $("#app").append('<h1>李硕视频专版 v'+script_info.version+'</h1>');
  341. $("#app").append("<div>近期遭到频繁屌丝(DOSS)攻击,Wish Today,若出现不能使用,请耐心等待。\n相信大家也发现现在好用的脚本很少了,有的用着用着就不能用了,这是因为需要服务器费用和人工进行维护,我希望大家每个人都能出一份力,使这个脚本一直维护下去,感谢每一个好心的人,点击这个链接即可赞助我一瓶冰阔落👿https://afdian.net/a/zwsssb👿<br />详询爱发电,本次版本彩蛋多巴胺配色,张纹硕与猪不得使用。</div>");
  342. //获取用户个人信息
  343. $("#app").append("<div>不得不说李硕真的是泰酷辣</div><form class='layui-form' id='app2'></form>");
  344. $("#app2").append('<div><label class="layui-form-label">学习模式</label><div class="layui-input-block"><select id="pattern""><option value="1">正常模式</option><option value="2">补时长模式</option></select></div></div>');
  345. $("#app2").append('<div><label class="layui-form-label">你的速度</label><div class="layui-input-block"><select id="beisu"><option value="99999">默认速度</option><option value="1">1倍速</option><option value="2">2倍速</option><option value="4">4倍速</option><option value="520">520倍速</option><option value="9999">秒刷</option><option value="6666">张纹硕与猪不得使用</option></select><span style="color:lime">推荐使用默认速度,如弹验证码,或无法提交进度,进入此网页获取解决方法https://afdian.net/item/3a3565f08f5611ee93c352540025c377 </span></div></div>');
  346. $("#app2").append('<label class="layui-form-label">学习科目</label><div class="layui-input-block"><select id="course_choose"><option value="0">全刷</option></select><button class="layui-btn layui-btn-primary layui-border-red" type="button" id="start_btn">开始</button>');
  347. $("#app2").append('<div id="log" style="color: violet;"></div>');
  348. let debug=true;
  349. add_log("不得不说李硕真的是泰酷辣...(长时间无动静为加载失败,)");
  350. // 从cookie获取uid
  351. try{
  352. uid = document.cookie.match(/UID=([^;]+)/)[1];
  353. }
  354. catch(e){
  355. add_log("获取UID失败,请退出超星后重新登录","err");
  356. return;
  357. }
  358. //获取课程列表
  359. let obj=await requests('https://mooc1-api.chaoxing.com/mycourse/backclazzdata?view=json&mcode=');
  360. console.log(obj);
  361. courseList=obj.channelList.map( function(value,index){
  362. if(value.content.course){
  363. $("#course_choose").append('<option value="'+value.content.course.data[0].id+'">'+value.content.course.data[0].name+'</option>');
  364. form.render('select');
  365. return [value.content.course.data[0].name,value.content.course.data[0].id,value.key,value.cpi];
  366. }else{
  367. return [0,0,0,0];
  368. }
  369. });
  370. debug&&console.log(courseList);
  371. add_log("共获取"+courseList.length+"门课程");
  372. $("body").append("<h3 id='msg'></h3>");
  373. $("#start_btn").on('click',function(){
  374. let courseStartData=courseList.filter(function (value){
  375. if(value[0]===0){
  376. return false;
  377. }
  378. if(value[1].toString()===$("#course_choose").val()||$("#course_choose").val()==="0"){
  379. return true;
  380. }
  381. return false;
  382. })
  383.  
  384. know_start(courseStartData);
  385. });
  386.  
  387. }
  388. $('head').append('<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"><link href="https://lib.baomitu.com/layui/2.6.8/css/layui.css" rel="stylesheet" type="text/css" />');
  389. $.getScript("https://lib.baomitu.com/layui/2.6.8/layui.js", function(data, status, jqxhr) {
  390. layui=unsafeWindow.layui;
  391. layer=unsafeWindow.layer;
  392. form = layui.form;
  393. $(".root").remove();
  394. if(location.href.indexOf("base/settings")!=-1){
  395. init();
  396. }else if(location.href.indexOf("visit/interaction")!=-1){
  397. $(".btn_group").append('<a id="addCourse" class="jb_btn jb_btn_104 fs14" href="https://i.chaoxing.com/base/settings" target="_top">打开挂机页面</a>');
  398. }
  399. });
  400. })();