半自动学习脚本

在学习过程中,我们经常会遇到大量的在线课程需要完成。这些课程有些需要手动点击才能完成,而有些则需要等待视频播放完毕后才能自动跳转到下一节课程。因此,我决定编写一个半自动化的学习脚本来提高学习效率。

思路:

  1. 首先,在用户脚本元数据部分,我定义了脚本的名称、版本号、描述等信息。
  2. 接着,在页面加载完成后的回调函数中,我创建了一个日志面板,并将其添加到页面上。这个日志面板用于输出日志信息。
  3. 然后,我使用querySelector查找了页面上的”.stu_intro”元素,如果找到了这个元素,就获取其中的所有<li>元素。
  4. 对于每个<li>元素,我通过querySelector获取其中的<a>元素和<li>元素,并分别获取课程名称和状态信息。然后,我将课程名称和状态信息输出到日志面板中。
  5. 如果状态为未完成,我就通过click()方法点击<a>元素,并将点击的链接地址输出到日志面板中。
  6. 接着,我使用querySelectorAll获取页面上所有以”javascript:ShowCourseware”开头的<a>元素。
  7. 对于每个<a>元素,我通过getAttribute方法获取其href属性值,然后判断状态是否为”已完成”。如果不是,则通过click()方法点击<a>元素,并将点击的链接地址输出到日志面板中。
  8. 然后,我使用querySelectorAll获取页面上所有带有”bg1″或”bg2″类名的元素,并通过filter方法筛选出状态为”未开始”或”未学完”的项目。
  9. 对于筛选出的每个项目,我通过querySelector获取其中的<a>元素,并通过click()方法点击<a>元素,并将点击的链接地址输出到日志面板中。
  10. 接着,我使用setInterval定时检查页面上是否有弹窗,并自动点击弹窗中的”是”按钮。每隔10秒钟检查一次,如果有弹窗,则通过querySelector和click()方法进行处理,并将点击的时间和信息输出到日志面板中。
  11. 最后,我定义了一个名为checkVideoStatus的函数,用于检查视频播放状态。在函数中,我通过querySelector获取视频播放时间的显示区域,并判断当前时间是否等于总时间。如果相等,表示视频已经播放完毕,将页面重定向到指定链接;否则,表示视频还未播放完毕,输出相应的日志信息。
  12. 最后,我使用setInterval设置定时器,每隔10秒钟调用一次checkVideoStatus函数,用于循环检查视频播放状态。

总结: 通过编写这个半自动化的学习脚本,可以更加高效地完成在线课程的学习。在这个过程中,我主要使用了JavaScript和DOM操作,通过不同的条件来点击页面上的链接,并输出相应的日志信息。同时,我也加入了定时器,实现了一些自动化的操作,例如检查弹窗、检查视频播放状态等。这样不仅可以提高学习效率,同时也是我对JavaScript和DOM操作的一个练习和探索。

// ==UserScript==
// @name         学习
// @namespace    https://rensr.site
// @version      2024-01-22
// @description  半自动学习
// @author       任尚仁
// @match        https://学习地址
// @icon         https://web.rensr.site/assets/img/web-logo.png
// @grant        none
// ==/UserScript==

(function() {
	'use strict';

	// 创建日志面板
	const logPanel = document.createElement('div');
	logPanel.style.position = 'fixed';
	logPanel.style.top = '0';
	logPanel.style.right = '0';
	logPanel.style.width = '300px';
	logPanel.style.height = '50%';
	logPanel.style.backgroundColor = 'white';
	logPanel.style.overflow = 'auto';
	document.body.appendChild(logPanel);

	// 日志输出函数
	function log(message) {
		const logMessage = document.createElement('p');
		logMessage.textContent = message;
		logPanel.appendChild(logMessage);

		// 滑动滚动条,显示最新消息
		logPanel.scrollTop = logPanel.scrollHeight;
	}

	// 等待页面加载完成
	window.addEventListener('load', () => {
		// 查找 stu_intro div
		var stuIntroDiv = document.querySelector('.stu_intro');

		if (stuIntroDiv) {
			// 在 stu_intro div 获取全部的<li>元素
			var liElements = stuIntroDiv.getElementsByTagName('li');

			// 点击状态为未完成的<li>元素
			for (var i = 0; i < liElements.length; i++) {
				var linkElement = liElements[i].querySelector('a');
				var statusElement = liElements[i].querySelector('i');
                var courseName = linkElement.textContent;
                var courseStatus = statusElement.innerText;
                // 输出课程和状态
                log('课程:' + courseName);
                log('状态:' + courseStatus);
				if (linkElement && statusElement && statusElement.innerText === '[未完成]') {
					linkElement.click();
					log('点击了链接:' + href);
				}
			}
		}

		// 获取所有的<a>元素
		const linkElements = document.querySelectorAll('a[href^="javascript:ShowCourseware"]');
		// 遍历每个<a>元素
		linkElements.forEach((linkElement) => {
			const statusText = linkElement.getAttribute('href')
				.match(/'([^']+)'/)[1];
			if (statusText !== '已完成') {
				// 点击链接
				linkElement.click();
				log('点击了链接:' + linkElement.getAttribute('href'));
			}
		});

		// 获取所有未开始的项目
		const rows = document.querySelectorAll('tr.bg1, tr.bg2');
		const unfinishedItems = Array.from(rows)
			.filter(row => {
				const status = row.querySelector('td:nth-child(3) span')
					.textContent.trim();
				return status === '未开始' || status === '未学完';
			});

		// 点击未开始的项目
		unfinishedItems.forEach(item => {
			const link = item.querySelector('a');
			if (link) {
				link.click();
				log('点击了链接:' + link.getAttribute('href'));
			}
		});

		// 检查弹窗并自动点击“是”
		setInterval(function() {
			const popup = document.querySelector('.school-sate');
			if (popup) {
				const yesButton = popup.querySelector('button:nth-of-type(1)');
				if (yesButton) {
					yesButton.click();
					log('[' + new Date()
						.toLocaleString() + '] ' + '点击了‘是’按钮');
				}
			}
			log('[' + new Date()
				.toLocaleString() + '] ' + '正在检查在线弹窗...');
		}, 10000);

		// 检查视频播放状态
		function checkVideoStatus() {
			const timeDisplay = document.querySelector('.prism-time-display');
			if (timeDisplay) {
				const currentTime = timeDisplay.querySelector('.current-time')
					.textContent;
				const duration = timeDisplay.querySelector('.duration')
					.textContent;

				log(`当前时间: ${currentTime} / 总时间: ${duration}`);

				if (currentTime === duration) {
					log('视频已经播放完毕');
					window.location.href = '跳转到学习首页';
				} else {
					log('视频还未播放完毕');
				}
			}
		}

		setInterval(checkVideoStatus, 10000); // 每10秒钟执行一次判断
	});
})();
本文作者:任尚仁
版权声明:本文为原创内容,转载请注明出处。如需获取更多相关资讯,可访问官网:https://blog.rensr.site/。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇