使用AI生成代码实现继续教育网站的在线课程后台持续播放(刷课)

CSDN 2024-07-18 17:01:10 阅读 68

目录

1.起因

2.思路

3.分析

3.1iframe嵌入及跨站注入

3.2随机元素名称或ID的捕获

3.3连续播放

4.训练AI生成代码

4.1跨iframe及点击canvas的代码生成

4.2定时器的代码生成

5.最终生成的代码

6.部署


1.起因

原始需求:最近因某些原因,需要登录某继续教育网站,通过在线学习网课获得认证。然而,该网站的课程播放页面做了诸多限制,比如浏览器切换到后台时,课程自动停止播放本节课播放完毕后,没法继续自动播放下一节课等。这对于忙于工作的我来说很不方便,毕竟还有许多工作需要在电脑上完成,实在是不能保证浏览器始终在前台工作,而公司又不可能为此专配一台电脑用于刷课。况且即便有专用电脑刷课,还得等课程播放完毕后,时不时用鼠标点击下一节课的播放按钮,以便继续刷课。

2.思路

解决思路:由于网页源码不受控,拟采用JS注入方法实现需求。后考虑到要及时跟踪网站的防刷等变化,必须考虑低成本解决,于是想到使用浏览器的开发工具和AI相结合,解决课程播放的限制。

注:实现上述需求的过程中,我计划使用AI以低成本方式解决,并不打算亲自编写。个人观点:这也算一种使用AI提高工作效率的有益的尝试。

3.分析

打开继续教育平台,登录后打开课程播放页面,并打开开发工具,查看源码。

3.1iframe嵌入及跨站注入

如上图所示,课程播放页面内嵌了iframe,由另一个站点播放视频。因此,直接采用document捕获网页元素是不行的,必须首先获得iframe才可以。另外,还要考虑控制台操作iframe中的元素时,由于访问的是另一个站点,需要解决跨域访问的安全性问题。

3.2随机元素名称或ID的捕获

如上图所示,播放按钮的class采用了随机命名,比如图种canvas的class以play字符串开头,以-canvas字符串结尾。这在使用querySelectorAll时,是不能直接写死的。必须采用正则表达式进行匹配。

3.3连续播放

众所周知,新版本Chrome内核的浏览器在播放视频时,如果没有开启静音模式,一般在网页加载后没法自动播放的。在本次JavaScript注入时,我也遇到了这个问题,必须点击播放器的静音按钮后,视频才可以自动连续播放。因此,要对静音按钮也进行注入操作。

4.训练AI生成代码

借助AI生成代码时,要注意向AI给出清晰的提示词:清楚的描述代码编写需求,并注意将复杂的需求,转化为“少量多次”的子需求进行提出。

4.1跨iframe及点击canvas的代码生成

4.2定时器的代码生成

5.最终生成的代码

注:下面代码是AI自动生成的,本人并未参与编写,若有不足之处与我无关-_-||b

<code>// 函数:点击符合特定class模式的canvas元素

function clickCanvasWithSpecificClass() {

// 获取iframe的文档对象 浏览器需要加上参数启动以便解决跨域访问的问题

var iframe = document.getElementById('iframe'); // 假设iframe的id是'iframe'

var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;

// 查找class以'play'开头且以'-canvas'结尾的canvas元素

var canvases = iframeDoc.querySelectorAll('canvas');

var targetCanvas = null;

for (var i = 0; i < canvases.length; i++) {

var className = canvases[i].className;

if (/^play.*-canvas$/.test(className)) {

targetCanvas = canvases[i];

break;

}

}

// 如果找到了匹配的canvas,则触发点击事件

if (targetCanvas) {

var clickEvent = new MouseEvent('click', {

bubbles: true,

cancelable: true,

view: iframe.contentWindow // 使用iframe的window对象

});

targetCanvas.dispatchEvent(clickEvent);

console.log('Canvas clicked!');

} else {

console.log('No matching canvas found.');

}

}

// 设置定时器,每隔5秒钟执行一次clickCanvasWithSpecificClass函数

setInterval(clickCanvasWithSpecificClass, 5000); // 5000毫秒 = 5秒

// 初始化一个状态变量来确定当前需要点击哪种canvas

var currentClickType = 'mute';

// 定义一个函数来交替点击两种类型的canvas

function alternateClickCanvases() {

// 获取iframe的文档对象

var iframe = document.getElementById('iframe'); // 假设iframe的id是'iframe'

var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;

var canvases;

if (currentClickType === 'mute') {

// 选择所有class以'mute'开头并以'-canvas'结尾的canvas元素

canvases = iframeDoc.querySelectorAll('canvas[class^="mute"][class$="-canvas"]');

}

// 如果没有找到任何canvas,则不执行点击

if (canvases.length === 0) return;

// 点击找到的第一个canvas元素

var canvasToClick = canvases[0];

var clickEvent = new MouseEvent('click', {

bubbles: true,

cancelable: true,

view: window

});

canvasToClick.dispatchEvent(clickEvent);

console.log('Clicked canvas with class:', canvasToClick.className);

}

// 设置定时器,每隔1秒钟执行一次alternateClickCanvases函数

setInterval(alternateClickCanvases, 6000);

6.部署

1.浏览器启动时,要以--disable-web-security命令行参数启动

2.将上述代码保存在浏览器控制台的代码片段中,每次刷课时,打开开发工具选择此片段运行即可。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。