您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
主要功能:在core.mokahr.com/m/attendance?activeIndex=0 页面统计自己本周的加班时间;次要功能:mokahr全局去水印,在attendance页面增加会mokahr首页的链接。
// ==UserScript== // @name mokahr work time total // @namespace http://tampermonkey.net/ // @version 2024-04-99 // @description 主要功能:在core.mokahr.com/m/attendance?activeIndex=0 页面统计自己本周的加班时间;次要功能:mokahr全局去水印,在attendance页面增加会mokahr首页的链接。 // @author Yearly // @match https://core.mokahr.com/* // @match https://core.mokahr.com/m/attendance* // @icon https://www.google.com/s2/favicons?sz=64&domain=mokahr.com // @license AGPL-v3.0 // @grant GM_addStyle // ==/UserScript== GM_addStyle( '#watermarkContainer { display: none; }' ); function timeDifference(startStr, endStr) { let [startHour, startMinute] = startStr.split(':').map(Number); let [endHour, endMinute] = endStr.split(':').map(Number); let startTotalMinutes = startHour * 60 + startMinute; let endTotalMinutes = endHour * 60 + endMinute; return endTotalMinutes - startTotalMinutes; } function timeTotal(){ let todayDiv = document.querySelector('[class*="sd-Calendar-calendar-is-today"]').parentElement; let todayDivs = Array.from(document.querySelectorAll('[class*="sd-Calendar-calendar-is-today"]')); for (let div of todayDivs) { if ( div.getBoundingClientRect().x > 0) { todayDiv = div.parentElement; break; } } if(document.getElementById('myModal') !== null) { document.getElementById('myModal').style.display = 'null' } var overhoursTotal = 0; let i = 1; let TotalInfo=""; let curDayDiv = todayDiv; //.previousSibling; //curDayDiv.click(); let checkInterval = setInterval(function() { let selenode = document.querySelector('[class*="sd-Calendar-calendar-selected-day"]'); let loadnode = document.querySelector('[class*="sd-Loading-loading-"]'); console.log("load" + selenode + loadnode); if (selenode != null && loadnode == null) { console.log("load done"); curDayDiv = selenode.parentElement; if (curDayDiv.querySelector('[class*="restDayColor_"]') == null) { let curMon = document.querySelector('div[class^="sd-Spacing-spacing-inline"] div[class^="sd-Spacing-spacing-inline"]').textContent; let curDay = document.querySelector('[class*="sd-Calendar-calendar-selected-day"]').textContent; // 获取打卡时间 let checkTimes = document.querySelectorAll('[class^="itemTimeBox"] [class^="sd-Spacing-spacing"] > [class^="timeLineTitleBold"]:first-child'); let checkIn = checkTimes[0].textContent; let checkOut = checkTimes[checkTimes.length - 1].textContent; let overhours = (timeDifference(checkIn, checkOut)/60 - 9); let curInfo = curMon + curDay.padStart(2,'0') + "日, " + checkIn + "~" + checkOut+ "; " if (overhours < 0) { overhours = 0; curInfo += "暂无加时"; } else { curInfo += "加时: " + overhours.toFixed(3) + " h" } overhoursTotal += overhours; console.log(curInfo); TotalInfo = "<p style='margin-left:20px;'>" + curInfo + "</p>" + TotalInfo; } else { i = 8; } // click next curDayDiv = curDayDiv.previousSibling; if(curDayDiv) { curDayDiv.click(); } else { i = 8; } if (++i > 7) { console.log("done-"+i); clearInterval(checkInterval); TotalInfo += "<p style='font-size:18px; font-weight:bold;'> 累计: " + overhoursTotal.toFixed(3) + "h </p>"; let modalHtml = `<span class="close">✕</span> <p style="font-size:18px; font-weight:bold;" >本周统计:</p> ${TotalInfo}`; let modalCss = ` <style> #myModal { display: none; position: fixed; z-index: 999; top: 50%; width: 400px; padding: 15px; overflow: auto; background-color: #FFF; border-radius: 8px; box-shadow: 0 0 3px #1115; font-size: 15px; line-height:1.8; font-family: Courier New", Courier, monospace; } .close { float: right; font-weight: bold; text-decoration: none; cursor:pointer; line-height:0.7; } </style>`; let modal = document.getElementById('myModal'); if (modal == null) { modal = document.createElement("div"); modal.id = 'myModal'; } document.body.append(modal); modal.innerHTML = modalHtml + modalCss; modal.style.display = 'block'; modal.style.left = (1-400/window.innerWidth)*50 + "%"; let closeButton = document.querySelector('.close'); closeButton.addEventListener('click', function() { document.getElementById('myModal').style.display = 'none'; }); } } }, 500); } var addBtnTimer = setInterval(function(){ let homelink = document.querySelector('a[href="/dashboard/home"]') if(!homelink) { const newHTML = `<span style="height:25px; display: inline-block;">🔹</span><a href="/dashboard/home" style="top:5px; font-weight:bold; font-size:16px; color:#06f; position:fixed; z-index:999;">首页</a>` let rootElement = document.querySelector("#root") rootElement.insertAdjacentHTML('afterbegin', newHTML); } else { clearInterval(addBtnTimer); } var targetDiv = document.querySelector('div[class^="sd-Spacing-spacing-inline"] div[class*="sd-Spacing-align-center"]'); if (targetDiv && document.querySelector('div[class*="sd-Tabs-capsuleContainer"] > div[class*="sd-Tabs-capsuleActiveItem-"]').textContent=="日") { var mybutton = document.createElement('button'); mybutton.textContent = '统计'; mybutton.style="font-size:14px; margin:0px 10px 0px 15px; padding:5px; background-color:#FFF; cursor:pointer; border-radius:5px; box-shadow:0 0 2px #1115;"; mybutton.onclick=timeTotal; targetDiv.appendChild(mybutton); clearInterval(addBtnTimer); } else { console.log('match div fail'); } }, 1000);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址