Greasy Fork is available in English.

腾讯课堂助手

自动进行签到, 记录签到数据, 去除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;
    }
})();