// ==UserScript== // @name 柠檬文才视频学习脚本,可以自动学习,自动连播,自选倍速(但是高倍数不稳定) // @namespace http://tampermonkey.net/ // @version 5.0.2 // @description 支持【柠檬文才】 // @author ao // @match *://*/* // @grant GM_xmlhttpRequest // @grant GM_openInTab // @grant GM_setValue // @grant GM_getValue // @grant window.close // @icon https://www.zhihuishu.com/favicon.ico // @connect www.gaozhiwang.top // @connect localhost // @license MIT // @downloadURL none // ==/UserScript== "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; (function () { let basehost = 'http://www.gaozhiwang.top'; let bserUrl = 'http://www.gaozhiwang.top:7001'; const panelcss = ` .myTool{ background: #fff; width: 234px; font-size: 14px; display: flex; flex-direction: column; align-items: center; position: fixed; z-index: 999; top: 70px; left: 44px; box-sizing: border-box; padding: 15px 9px; border-radius: 5px; box-shadow: 0 0 9px rgba(0,0,0,.5); } .controls{ position: absolute; right: 12px; font-size: 27px; top: 9px; cursor: pointer; transition: all 0.4s; } .controls:hover{ color: #1f74c; transform: rotate(360deg); } .myTool-content{ transition: all 0.4s; overflow: hidden; } .mytoolkeyipt{ width: 130px; height: 22px !important; outline: none; padding: 0px 3px; border: 1px solid #757575FF; border-radius: 3px; font-size: 13px; padding: 0px 3px; margin-right: 5px; margin-top: 2px; } .addkey-btn{ color: #fff; background: #1f74ca; } .removkey-btn{ color: #000; display: none; background: #eee; } .handleKeyBtn{ width: 54px; height: 24px; margin-top: 2px; border: none; font-size: 12px; border-radius: 2px; cursor: pointer; } .handleSpeedUp{ background: orange; font-size: 12px; color: #fff; padding: 4px 15px; border-radius: 5px; margin: 0 auto; max-width: 80px; margin-top: 10px; cursor: pointer; text-align: center; } .ctxTipWrap{ min-width: 200px; min-height: 50px; text-align: center; line-height: 50px; background: #fff; position: fixed; z-index: 999; left: 50%; top: 50%; border-radius: 9px; box-shadow: 0 0 5px rgba(0,0,0,.6); display:none; } .cxtsection{ width: 100%; box-sizing: border-box; padding: 0 5px; margin-bottom: 2px; } .cxtsection .ctx-title{ text-align: left; margin-top: 12px; font-size: 12px; color: #4e5969; border-left: 2px solid #1f74ca; border-radius: 2px; padding-left: 3px; line-height: 16px; } .ctxsection2{ display: flex; justify-content: space-between; } .ctxsection2 .speed-select{ width: 50%; height: 22px !important; outline: none; position: relative; top: 10px; border: 1px solid #757575FF; border-radius: 3px; padding-left: 10px; } .ctxsection3{ display: flex; align-items: center; justify-content: space-between; } .feedbackBtn{ font-size: 13px; position: relative; top: 5px; cursor: pointer; color: #000; } a{ text-decoration: none; } `; const panelhtml = `
×
📺高智Ai自动学习程序
输入Key:
设置倍速:
意见反馈:
点击加速
`; let ElementObj = {}; let Internetcourse = { ningmengwencai: { id: 3, name: '柠檬文才' }, }; let speedArr = [1, 3, 5, 10, 16]; let toolOption = { accelerator: 1, CtxMain: null, SchoolType: -1 }; class Main { constructor() { this.studentType = 1; this.speedStatus = 0; this.listenVidoeStatusTimer = null; this.init(); } init() { setTimeout(() => { let _schoolInfoColletion = localStorage.getItem('schoolInfoColletion'); if (_schoolInfoColletion) { } else { this.colletionSchoolData(); } }, 2500); } updateSpeedElement(num) { if (this.speedStatus == 0) return; ElementObj.$video.playbackRate = num; } handleClickSpeedUp(callback) { return __awaiter(this, void 0, void 0, function* () { let key = localStorage.getItem('mytoolkey'); if (key) { this.speedStatus = 1; let result = yield fetchData({ method: 'GET', url: bserUrl + `/speedup?toolkey=${key}&canuse=${toolOption.SchoolType}`, }); if (result.code == 200) { this.speedStatus = 1; toolOption.CtxMain.play(); } else { showTip(`🔉🔉🔉${result.message}`, 5000, true); return; } this.randomListen(); } else if (!key) { alert('请先购买key'); window.open(basehost); } else { alert('程序错误,请联系客服'); } }); } handleAddKey(callback) { return __awaiter(this, void 0, void 0, function* () { if (!ElementObj.$ipt.value) { window.open(basehost); return; } let result = yield fetchData({ method: 'GET', url: bserUrl + '/vertifykey?toolkey=' + ElementObj.$ipt.value }); if (result.data.count > 0) { localStorage.setItem('mytoolkey', ElementObj.$ipt.value); localStorage.setItem('_localSpeed', toolOption.accelerator.toString()); callback(ElementObj.$ipt.value); } else { alert('输入的key不存在'); } }); } handleRemoveKey() { localStorage.removeItem('mytoolkey'); localStorage.removeItem('_localSpeed'); ElementObj.$title3.innerText = '绑定key:'; ElementObj.$mytoolkey.style.display = 'none'; ElementObj.$ctxsection2.style.display = 'none'; ElementObj.$nokey.style.display = 'block'; ElementObj.$ipt.style.display = 'block'; ElementObj.$addKey.style.display = 'block'; ElementObj.$removeKey.style.display = 'none'; ElementObj.$handleSpeedUp.style.background = 'orange'; ElementObj.$handleSpeedUp.innerText = '点击加速'; this.updateSpeedElement(1); } stopSpeedUp() { this.speedStatus = 0; toolOption.CtxMain.updateSpeedElement(1); ElementObj.$handleSpeedUp.style.background = 'orange'; ElementObj.$handleSpeedUp.innerText = '点击加速'; showTip(`🔉停止加速成功`); } handleChangeCtxSpeed(e) { let key = localStorage.getItem('mytoolkey'); if (key) { let whiteList = speedArr; let s = Number(e); if (e && whiteList.includes(s)) { toolOption.accelerator = s; localStorage.setItem('_localSpeed', s.toString()); if (ElementObj.$video) { ElementObj.$video.playbackRate = s; } } } else if (!key) { alert('请先购买key'); window.open(basehost); } else { alert('程序错误,请联系客服'); } } colletionSchoolData() { return __awaiter(this, void 0, void 0, function* () { let key = `s${toolOption.SchoolType}`; let result = yield fetchData({ method: 'GET', url: bserUrl + '/colletionschool?schoolType=' + key, }); if (result.code == 200) { localStorage.setItem('schoolInfoColletion', `${new Date()}`); } }); } randomListen() { setTimeout(() => { let key = localStorage.getItem('mytoolkey'); if (ElementObj.$video) { if (!ElementObj.$video.paused && !key) { ElementObj.$video.pause(); } } }, 5000); } listenVidoeStatus($video, callback) { if (!$video) return; let count = 0; this.listenVidoeStatusTimer = setInterval(() => { if ($video.readyState < 4) { console.log(`检测到${count}次,视频正在加载`); count += 1; if (count >= 20) { location.reload(); } } let status = $video.paused; if (status) { count += 1; console.log(`检测到视频暂停了${count}次`); if (typeof callback == 'function') { if (count >= 20) { location.reload(); } else { callback(); } } else { console.log('callback不是一个函数'); } } }, 3000); } changeHtml($wrap) { return __awaiter(this, void 0, void 0, function* () { let _style = ` width: 100%; height: 100%; background: #eae9e9; position: absolute; z-index: 999; overflow: scroll; top: 0; padding-left: 10px; `; let dom = document.createElement('div'); dom.setAttribute('class', 'ctxstatsbox'); dom.setAttribute('style', _style); $wrap.appendChild(dom); yield sleep(300); ElementObj.$ctxstatsbox = document.querySelector('.ctxstatsbox'); this.addInfo('🔉初始化已完成,正在播放'); }); } addInfo(str, type) { let $ctxstatsbox_lis = document.querySelectorAll('.ctxstatsbox_li'); if ($ctxstatsbox_lis.length >= 15) { ElementObj.$ctxstatsbox.innerHTML = ''; } let li = `
  • ${str}
  • `; ElementObj.$ctxstatsbox.innerHTML += li; } listenPageHide() { let timer3; document.addEventListener("visibilitychange", () => { if (document.hidden) { console.log("页面被隐藏"); let count = 0; timer3 = setInterval(() => { count += 1; if (count >= 5) { this.addInfo('⚠️⚠️⚠️请勿长时间隐藏该学习页面', 0); } }, 5000); } else { clearInterval(timer3); console.log("页面被显示"); } }); } } class ningmengwencai extends Main { constructor() { super(); this.taskLength = 0; this.currentIndex = 0; this._init(); } _init() { ElementObj.$allTask = document.querySelectorAll('.childSection'); this.taskLength = ElementObj.$allTask.length; this.getCurrentIndex(); } getCurrentIndex() { ElementObj.$allTask.forEach((item, index) => { let hasClass = item.className.includes('active'); if (hasClass) { this.currentIndex = index; } }); } play() { return __awaiter(this, void 0, void 0, function* () { ElementObj.$allTask[this.currentIndex].click(); yield sleep(2000); ElementObj.$video = document.querySelector('video'); this.updateSpeedElement(toolOption.accelerator); let $tip1Btn = document.querySelector('.layui-layer-btn0'); if ($tip1Btn) { $tip1Btn.click(); } ElementObj.$video.play(); ElementObj.$handleSpeedUp.style.background = '#f01414'; ElementObj.$handleSpeedUp.innerText = '加速成功'; ElementObj.$video.addEventListener('ended', () => { this.currentIndex += 1; if (this.currentIndex > ElementObj.$allTask.length) { return; } let $saveBtn = document.querySelector("#saveBtn"); $saveBtn.click(); setTimeout(() => { this.handleClickSpeedUp(); }, 2500); }, false); }); } } class Addpanel { constructor() { this.$panelWrap = document.createElement('div'); this.$panelStyle = document.createElement('style'); this._init(); } _init() { var _a, _b; this.$panelWrap.innerHTML = panelhtml; this.$panelStyle.innerHTML = panelcss; (_a = document.querySelector('head')) === null || _a === void 0 ? void 0 : _a.appendChild(this.$panelStyle); if (toolOption.SchoolType == 3) { (_b = document.querySelector('#bigContainer')) === null || _b === void 0 ? void 0 : _b.appendChild(this.$panelWrap); } ElementObj.$title3 = document.querySelector('.title3'); ElementObj.$mytoolkey = document.querySelector('.mytoolkey'); ElementObj.$nokey = document.querySelector('.nokey'); ElementObj.$addKey = document.getElementById('addKey'); ElementObj.$removeKey = document.getElementById('removeKey'); ElementObj.$ipt = document.querySelector('.mytoolkeyipt'); ElementObj.$handleSpeedUp = document.querySelector('.handleSpeedUp'); ElementObj.$playButton = document.querySelector('#playButton'); ElementObj.$ctxTipWrap = document.querySelector('#ctxTipWrap'); ElementObj.$ctxsection2 = document.querySelector('.ctxsection2'); ElementObj.$ctxcontrols = document.querySelector('.ctxcontrols'); let storageKey = localStorage.getItem('mytoolkey'); if (storageKey) { this.handleSetHtml(storageKey); } this.optimizePannel(); this.setSpeedOption(); this.addEvent(); this.getSlogan(); } optimizePannel() { } setSpeedOption() { ElementObj.$speedSelect = document.querySelector('#ctxspeed'); let html = ``; for (var i = 0; i < speedArr.length; i++) { let str = ` `; html += str; } ElementObj.$speedSelect.innerHTML = html; var _localSpeed = localStorage.getItem('_localSpeed'); if (_localSpeed) { ElementObj.$speedSelect.value = _localSpeed; toolOption.accelerator = Number(_localSpeed); } } handleSetHtml(key) { try { ElementObj.$ipt.style.display = 'none'; ElementObj.$title3.innerText = '当前key:'; ElementObj.$mytoolkey.innerText = key; ElementObj.$mytoolkey.style.display = 'block'; ElementObj.$nokey.style.display = 'none'; ElementObj.$removeKey.style.display = 'block'; ElementObj.$addKey.style.display = 'none'; ElementObj.userKey = key; } catch (e) { } } addEvent() { ElementObj.$addKey.addEventListener('click', () => { toolOption.CtxMain.handleAddKey((key) => { this.handleSetHtml(key); }); }); ElementObj.$removeKey.addEventListener('click', () => { toolOption.CtxMain.handleRemoveKey(); }); ElementObj.$handleSpeedUp.addEventListener('click', () => { toolOption.CtxMain.handleClickSpeedUp(); }); ElementObj.$ctxsection2.addEventListener('change', (e) => { toolOption.CtxMain.handleChangeCtxSpeed(e.target.value); }); ElementObj.$ctxcontrols.addEventListener('click', () => { let $myToolContent = document.querySelector('.myTool-content'); let isHide = GM_getValue("hideCtx", null); if (isHide) { $myToolContent.style.height = 'auto'; ElementObj.$ctxcontrols.innerText = '×'; } else { $myToolContent.style.height = '0px'; ElementObj.$ctxcontrols.innerText = '🔛'; } GM_setValue("hideCtx", !isHide); }); } getSlogan() { fetchData({ url: bserUrl + '/getslogan', method: "GET" }).then((res) => { ElementObj.$slogan = document.querySelector('#slogan'); ElementObj.$slogan.innerHTML = res.result.text1; }); } } function $el(selector, root2 = window.document) { const el2 = root2.querySelector(selector); return el2 === null ? void 0 : el2; } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function fetchData(option) { return new Promise(resolve => { try { GM_xmlhttpRequest(Object.assign(Object.assign({}, option), { onload: function (xhr) { if (xhr.status == 200) { resolve(JSON.parse(xhr.response)); } } })); } catch (e) { fetch(option.url, { method: option.method }).then(res => res.json()).then(res => { resolve(res); }); } }); } function showTip(text, time = 1500, isAlert) { ElementObj.$ctxTipWrap.style.display = 'block'; ElementObj.$ctxTipWrap.innerText = text; let timer = setTimeout(() => { ElementObj.$ctxTipWrap.style.display = 'none'; }, time); if (isAlert) { alert(text); } } function recognitionType() { let current_host = location.host; if (/www.gaozhiwang.top/.test(current_host)) return; if (/www.wencaischool.net/.test(current_host) || /learning.wencaischool.net/.test(current_host)) { toolOption.CtxMain = ningmengwencai; toolOption.SchoolType = Internetcourse.ningmengwencai.id; } if (/study.wencaischool.net/.test(current_host)) { toolOption.SchoolType = 3; toolOption.CtxMain = Internetcourse.ningmengwencai; } } setTimeout(() => { recognitionType(); toolOption.CtxMain = new toolOption.CtxMain(); new Addpanel(); }, 5000); })();