您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动进行签到, 记录签到数据, 去除XXX正在观看的弹幕, 解除必须登录的限制, 直播课自动5分钟刷新一次防止断流
// ==UserScript== // @name 腾讯课堂助手 // @name:zh-CN 腾讯课堂助手 // @namespace http://blog.z31.xyz/ // @version 2.1 // @description 自动进行签到, 记录签到数据, 去除XXX正在观看的弹幕, 解除必须登录的限制, 直播课自动5分钟刷新一次防止断流 // @description:zh-cn 自动进行签到, 记录签到数据, 去除XXX正在观看的弹幕, 解除必须登录的限制, 直播课自动5分钟刷新一次防止断流 // @author simonkimi // @match https://ke.qq.com/webcourse/* // @grant none // ==/UserScript== (function () { 'use strict'; setTimeout(() => { gui(); insertCSS(); sign(); }, 3000); if (window.location.href.indexOf("vid") === -1) { setTimeout(() => { location.reload() }, 1000 * 60 * 5) } function insertCSS() { const styleNode = document.createElement("style"); styleNode.innerHTML = ` [class*="player-marquee"]{display: none!important;} .ptlogin-mask{display: none!important;} .ptlogin-wrap{display: none!important;} .pause-ctn{display: none!important;} .sk-sign-log { height: 400px; overflow-y: scroll; } .sk-sign-item { font-family: "Microsoft YaHei",serif } .sk-sign-table { width: 100%; } .sk-sign-table td { padding: 6px 24px 6px 16px; border-bottom: 1px solid rgba(224, 224, 224, 1); font-size: 14px; } `; document.head.appendChild(styleNode); } function storeSign() { const storage = window.localStorage; let signData = JSON.parse(storage.getItem(`sk-sign`) || "[]"); signData = signData.filter(value => new Date().getTime() - value.time < 7 * 24 * 60 * 60 * 1000); const className = document.getElementsByClassName('current-task-name')[0].innerHTML; signData.push({ className, time: new Date().getTime() }); storage.setItem('sk-sign', JSON.stringify(signData)) } function setSignNum(num) { document.getElementsByClassName('applied-text')[0].innerHTML = `本课程今日已签到${num}次` } function sign() { const storage = window.localStorage; const termId = /term_id=([0-9]+?)&/.exec(window.location.href)[1] || "0"; const signData = JSON.parse(storage.getItem(`sk-sign-${termId}`) || "{}"); const date = new Date(); const dateTime = `${date.getFullYear()}${date.getMonth()}${date.getDate()}`; let {signNum = 0, signDate = "0"} = signData; if (signDate !== dateTime) { signNum = 0 } setSignNum(signNum); setInterval(() => { const signElements = document.getElementsByClassName("s-btn s-btn--primary s-btn--m"); for (let e of signElements) { if (e.innerHTML === '签到') { e.click(); signNum += 1; storage.setItem(`sk-sign-${termId}`, JSON.stringify({ signDate: dateTime, signNum })); setSignNum(signNum); storeSign(); setTimeout(() => { for (let e of document.getElementsByClassName("s-btn s-btn--primary s-btn--m")) { if (e.innerHTML === '确定') { e.click(); } } }, 2000) } } }, 5000); } function gui() { const headers = document.getElementsByClassName('operations')[0]; // 签到助手按钮 const signButton = document.createElement("div"); signButton.className = "header-item sign"; signButton.innerText = "签到记录"; // 历史展示页面 const signPopup = document.createElement('div'); signPopup.style.cssText = 'display:none; position:absolute; top:52px; left:50%; transform:translate(-50%);box-sizing: border-box; color:#000'; signButton.onmouseenter = () => { signPopup.style.display = 'block'; signData(); }; signButton.onmouseleave = () => { signPopup.style.display = 'none' }; // code const codePopup = document.createElement('div'); codePopup.className = 'code-popup sk-sign-log'; codePopup.style.height = '400px'; // table const table = document.createElement('table'); table.className = 'sk-sign-table'; const tbody = document.createElement('tbody'); // 填充数据 function signData() { console.log("加载签到记录"); // 清除原来的数据 tbody.innerHTML = ""; const storage = window.localStorage; let signData = JSON.parse(storage.getItem(`sk-sign`) || "[]"); console.log(signData); for (let e of signData) { const tr = document.createElement("tr"); tr.className = 'sk-sign-item'; const td1 = document.createElement('td'); td1.innerText = formatDate(e.time); const td2 = document.createElement('td'); td2.innerText = e.className; tr.appendChild(td1); tr.appendChild(td2); tbody.appendChild(tr); } } signData(); table.appendChild(tbody); codePopup.appendChild(table); signButton.appendChild(signPopup); signPopup.appendChild(codePopup); headers.insertBefore(signButton, headers.childNodes[0]) } function formatDate(d) { const date = new Date(d); const YY = date.getFullYear() + '-'; const MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; const DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()); const hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'; const mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'; const ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()); return YY + MM + DD +" "+hh + mm + ss; } })();