您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
广东省干部培训网络学院99
// ==UserScript== // @name 广东省干部培训网络学院 // @namespace cosil_gbpx.gd.gov.cn // @version 1.2 // @description 广东省干部培训网络学院99 // @author 科西尔· // @match http*://gbpx.gd.gov.cn/gdceportal/Study/StudyCenter.aspx* // @icon https://gbpx.gd.gov.cn/gdceportal/favicon.ico // @require https://cdn.bootcdn.net/ajax/libs/js-sha1/0.6.0/sha1.min.js // @grant 不安全窗口 // @grant GM_xmlhttpRequest // @license GPLv3 // ==/UserScript== const { Builder, By, Key, until } = require('selenium-webdriver'); const chrome = require('selenium-webdriver/chrome'); // 指定Chrome WebDriver的路径 const chromeDriverPath = 'C:/Program Files/Google/Chrome/Application/chromedriver.exe'; const service = new chrome.ServiceBuilder(chromeDriverPath).build(); const driver = new Builder().forBrowser('chrome').setChromeService(service).build(); console.log("已加载"); if (unsafeWindow.location.pathname == '/gdceportal/Study/StudyCenter.aspx') { // 监测iframe加载 new Promise((resolve, reject) => { let retry = 10; let dataMainLoadWatcher = setInterval(() => { console.log('等待#dataMainIframe加载', retry); let targetEle = document.querySelector('#secondIframe')?.contentDocument.querySelector('#thirdIframe')?.contentDocument.querySelector('#dataMainIframe')?.contentDocument.querySelector('a.courseware-list-reed'); if (targetEle) { clearInterval(dataMainLoadWatcher); console.log('#dataMainIframe加载成功'); resolve(targetEle); return; } else if (--retry < 0) { reject(); return; } }, 1000); }).then(targetEle => { // 在iframe加载成功后执行自动化操作 handleLearningCourse(targetEle); }).catch(err => { console.log(err); unsafeWindow.location.reload(); }); } function handleLearningCourse(targetEle) { const math = require('math'); async function switchToFrame(driver) { await driver.switchTo().frame('secondIframe'); await driver.switchTo().frame('thirdIframe'); await driver.switchTo().frame('dataMainIframe'); } async function runMain(videoUnstudyNum, driver) { if (parseInt(videoUnstudyNum) > 0) { console.log(`nonlocal--该目录下还有 ${videoUnstudyNum} 个视频未学习……`); await driver.executeScript("document.getElementsByClassName('courseware-list-reed')[0].click()"); await driver.sleep(3000); // 获取所有窗口句柄 const allHandles = await driver.getAllWindowHandles(); const preWindowHandle = await driver.getWindowHandle(); // 遍历窗口句柄,切换到新窗口 for (const handle of allHandles) { if (handle !== preWindowHandle) { await driver.switchTo().window(handle); await driver.manage().setTimeouts({ implicit: 10000 }); await driver.sleep(2000); // 切换到嵌套的iframe await switchToFrame(driver); await driver.sleep(10000); // 检查视频是否暂停 const jsPaused = 'return document.getElementById("my-video_html5_api").paused;'; const viewPausedStatus = await driver.executeScript(jsPaused); console.log('viewPaused:' + viewPausedStatus); if (viewPausedStatus) { const elem = await driver.findElement(By.className('vjs-play-control')); await elem.click(); } await driver.sleep(5000); // 获取视频总时长 const jsDurationStr = 'return document.getElementById("my-video_html5_api").duration;'; const viewTime = await driver.executeScript(jsDurationStr); console.log('viewTime:' + viewTime); await driver.sleep(5000); // 获取当前播放时间 const jsCurrentTimeStr = 'return document.getElementById("my-video_html5_api").currentTime;'; const viewCurrentTime = await driver.executeScript(jsCurrentTimeStr); console.log('viewCurrentTime:' + viewCurrentTime); if (Math.ceil(viewCurrentTime) >= Math.ceil(viewTime)) { console.log('视频播放完毕'); await driver.switchTo().defaultContent(); const exitElem = await driver.findElement(By.id('btnexit')); await exitElem.click(); await driver.switchTo().window(preWindowHandle); await driver.navigate().refresh(); await driver.manage().setTimeouts({ implicit: 10000 }); await switchToFrame(driver); const jsList = 'return document.getElementsByClassName("courseware-list-reed").length;'; videoUnstudyNum = await driver.executeScript(jsList); await driver.sleep(3000); // 递归调用runMain,处理下一个视频 await runMain(videoUnstudyNum, driver); } else { console.log('继续观看视频'); await driver.sleep(Math.ceil(viewTime) - Math.ceil(viewCurrentTime)); await driver.switchTo().defaultContent(); const exitElem = await driver.findElement(By.id('btnexit')); await exitElem.click(); await driver.switchTo().window(preWindowHandle); await driver.navigate().refresh(); await driver.manage().setTimeouts({ implicit: 10000 }); await switchToFrame(driver); const jsList = 'return document.getElementsByClassName("courseware-list-reed").length;'; videoUnstudyNum = await driver.executeScript(jsList); await driver.sleep(3000); // 递归调用runMain,处理下一个视频 await runMain(videoUnstudyNum, driver); } } } } else { console.log("该目录下还有视频已学习完毕……"); } } async function main() { try { const studyUrl = "https://gbpx.gd.gov.cn/gdceportal/Study/StudyCenter.aspx"; await driver.get(studyUrl); await driver.sleep(3000); await switchToFrame(driver); const jsList = 'return document.getElementsByClassName("courseware-list-reed").length;'; let videoUnstudyNum = await driver.executeScript(jsList); await driver.sleep(3000); await runMain(videoUnstudyNum, driver); } catch (error) { console.error("An error occurred:", error); } finally { await driver.quit(); console.log("end......"); } } // 在这里调用main函数以开始自动化操作 main(); }