0%

对于目前在某MOOC网站实现半自动互评的探讨

前言

每完成一次互评任务,就要牺牲掉鼠标左键的部分寿命

懒是推动科技进步的重要原因 ✅

其实有前辈已经做出了大胆的实践,但是最终还是被BAN

MoocChecker

mooc-assistant

年少时只知道用,现在也可以对前辈的源代码稍做分析了。但是由于mooc-assistant这个脚本是浏览器插件,所以还没太看懂,不过通过分析MoocChecker这个脚本可知,其实对于单个互评页面来说,就干三件事:

  1. 完成对评语的填充

    1
    2
    3
    document.querySelectorAll('.j-textarea').forEach(e => {
    e.value = judge
    });
  2. 完成对分数的选择

    1
    2
    3
    document.querySelectorAll('.s').forEach(e => {
    e.children[e.children.length - 1].children[0].checked = true
    });
  3. 最后模拟点击“提交”按钮

    1
    document.querySelector('.j-submitbtn').click();

这些操作放在一个循环里面,就实现了重复操作,自动互评

但是,这些都已成为历史了😪

当下的情况

1.F12的不顺利

首先,网站加入了debugger pause机制

image-20201205133500272.png

image-20201205133441242.png

这就是开F12之后,遇到的第一个障碍

解决倒也是可以解决,只不过就需要多点两下鼠标了

(或者用Ctrl+F8、F8这两个快捷键也行)

image-20201205133343350.png

2.脚本被检测

如果直接把曾经的MoocChecker复制进去,网站会直接报警

image-20201205133250729.png

做出的尝试

2020-12-5测试如下

在取消了此网站的debugger pause机制之后

  1. 完成对评语的填充 - 🆗 有效

    1
    2
    3
    document.querySelectorAll('.j-textarea').forEach(e => {
    e.value = '这是评语'
    });

    GIF如下:

    GIF2.gif

  2. 完成对分数的选择 - 🆗 有效

    1
    2
    3
    document.querySelectorAll('.s').forEach(e => {
    e.children[e.children.length - 1].children[0].checked = true
    });

    GIF如下:

    GIF3.gif

  3. 模拟点击“提交”按钮 - ❎😭 无效了

    1
    document.querySelector('.j-submitbtn').click();

    GIF如下:

    GIF.gif

综上,目前只有一键满分和填充评语可以使用,而且前提是取消了断点(Deactivate Breakpoints)

最终方案?

这会是目前的终极解决方案吗?

1.打开F12调试界面

这……没啥可说的吧

2.取消断点并继续

切换到 Source 标签页,依次点击以下两个按钮

image-20201205133343350.png

或者先按 Ctrl+F8 ,再按 F8

反正让这个image-20201205133441242.png消失即可继续

3.控制台注入代码

切换到 Console 标签页,然后把这段继承自 unbyte 前辈又被我魔改后的代码粘贴进去,敲个回车

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let suckIt = `<div style="position: fixed;top: 50%;z-index: 999;right: 10%;padding: 1em;background: rgba(233,233,233,.6);border: 1px solid #aaa;">
<textarea placeholder="评价内容" id="fuckMe" style="padding: 10px;height: 60px;width: 200px;margin: 10px;">Good Job Bro.</textarea>
<p style="text-align: center;">
<input type="text" disabled id="times" placeholder="份数,1 ~ 20" style="width: 100px;padding: .4em;margin: 0 1em;background: #fff;border: 1px solid #999;float: left;" value="1">
<input type="submit" value="Fuck It Now" onclick="fuckIt();" style="border: 1px solid #aaa;padding: 5px;color: #999;cursor: pointer;">
</p>
</div>`;
document.body.insertAdjacentHTML("afterbegin", suckIt);

function fuckIt(){
let judge = document.getElementById('fuckMe').value || 'Good Job';
document.querySelectorAll('.s').forEach(e => {
e.children[e.children.length - 1].children[0].checked = true
});
document.querySelectorAll('.j-textarea').forEach(e => {
e.value = judge
});
window.scrollTo(0,document.querySelector('.j-submitbtn').offsetTop)
}

image-20201205155026340.png

4.FuckIt & Submit

填写评语,不用管那个输入框里面的1,然后按下 “Fuck It Now”按钮,网页会自动跳转到底部,之后点击网页上的“提交”按钮即可

image-20201205155250575.png

之后对于每一份作业重复进行:

填写评语 -> Fuck It Now -> 提交

的操作即可

不足

所以,如何实现提交按钮的自动点击呢?

另外,如何抓到我呢?

【推荐】油猴版本的

2020-12-6更新

使用油猴插件的话,就不需要每次都开F12还要取消断点了

如何使用油猴插件……emm……网上已经有很多教程了,不再赘述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// ==UserScript==
// @name MOOCAutoChecker
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 一键自动互评一项作业
// @author halozhy
// @match *://www.icourse163.org/learn/*
// @match *://www.icourse163.org/spoc/learn/*
// @grant none
// ==/UserScript==

(function () {
'use strict';

let fuckItBtn = null;
let suckIt = `<div style="position: fixed;top: 50%;z-index: 999;right: 10%;padding: 1em;background: rgba(233,233,233,.6);border: 1px solid #aaa;">
<textarea placeholder="评价内容" id="fuckMe" style="padding: 10px;height: 60px;width: 200px;margin: 10px;">Good Job Bro.</textarea>
<p style="text-align: center;">
<input type="text" disabled id="times" placeholder="份数,1 ~ 20" style="width: 100px;padding: .4em;margin: 0 1em;background: #fff;border: 1px solid #999;float: left;" value="1">
<input type="submit" value="Fuck It Now" id="${fuckItBtn}" style="border: 1px solid #aaa;padding: 5px;color: #999;cursor: pointer;">
</p>
</div>`;
document.body.insertAdjacentHTML("afterbegin", suckIt);
document.getElementById(fuckItBtn).onclick = function () {
let judge = document.getElementById('fuckMe').value || 'Good Job';
document.querySelectorAll('.s').forEach(e => {
e.children[e.children.length - 1].children[0].checked = true
});
document.querySelectorAll('.j-textarea').forEach(e => {
if (e.name !== "search") {
e.value = judge
}
});
if (document.querySelector('.j-submitbtn') === null) {
//alert("这个页面似乎不是互评页面哦");
}
else {
window.scrollTo(0, document.querySelector('.j-submitbtn').offsetTop)
}

}

})();