本文只做学习用途,且功能不完整
我也不知道为什么,考研这么紧张的时候还要写个这个脚本,而且功能没有完全实现,现在前段写的越来越好了,写个好的脚本还是有点困难。
这里只算学习了吧,记录一下js的学习进步过程
一、脚本目的
为了实现智慧树回答的自动评论。(左为原界面,右为代码运行后的界面)
最终实现到这一步:
二、演示
1.打开评论
在左上角加入功能键按钮。
1. 其中“打开评论”针对 https://qah5.zhihuishu.com/qa.html#/web/home/** 父页面,可以实现打开多个评论页面,对应函数为以下的 opencomment():
// 打开评论函数
// i在setting中设置,是打开评论的条数
function opencomment(i){
// 获取评论
_self.comment = $('.question-content span:eq('+i+')').text();
console.log(_self.comment);
// 点击进入评论
$('.question-content span:eq('+i+')').click();
}
2.一键评论
针对 https://qah5.zhihuishu.com/qa.html#/web/questionDetail/** 子页面,读取第一个人的评论,并实现评论。(评论div点击未完成,智慧树的“发布”不是button,用的div-class)
// 评论函数
function comment(){
// 获取评论
_self.comment = $('.answer-content span:eq(0)').text();
console.log(_self.comment);
_self.document.getElementsByClassName("my-answer-btn tool-show")[0].click();// 点击进入评论
// 延时评论 等对话框出来
sleep(500).then(() => {
_self.$('.el-textarea__inner').click();
_self.$('.el-textarea__inner').val(_self.comment);// 写入评论
_self.document.getElementsByClassName("up-btn")[0].className = "up-btn set-btn"; // 修改提交按钮,使其可以正常工作
_self.document.getElementsByClassName("up-btn set-btn")[0].click();
});
}
3.完整代码
// ==UserScript==
// @name Automatic comments
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Automatic comments
// @author Ws3
// @match https://qah5.zhihuishu.com/qa.html
// @icon https://www.google.com/s2/favicons?domain=zhihuishu.com
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
// 设置修改后,需要刷新或重新打开网课页面才会生效
var setting = {
time: 8E3 // 默认响应速度为5秒,不建议小于3秒
,length: 3 // 评论条数
, script: 'automatic_comment_WS3'
, version: '1.0.0'
};
var _self = unsafeWindow,
url = location.pathname,
$ = _self.jQuery,
xhr = _self.XMLHttpRequest;
const sleep = (time) => {
return new Promise(resolve => setTimeout(resolve, time));
}
// 打开评论函数
function opencomment(i){
// 获取评论
_self.comment = $('.question-content span:eq('+i+')').text();
console.log(_self.comment);
// 点击进入评论
$('.question-content span:eq('+i+')').click();
}
// 评论函数
function comment(){
// 获取评论
_self.comment = $('.answer-content span:eq(0)').text();
console.log(_self.comment);
_self.document.getElementsByClassName("my-answer-btn tool-show")[0].click();// 点击进入评论
// 延时评论 等对话框出来
sleep(500).then(() => {
_self.$('.el-textarea__inner').click();
_self.$('.el-textarea__inner').val(_self.comment);// 写入评论
_self.document.getElementsByClassName("up-btn")[0].className = "up-btn set-btn"; // 修改提交按钮,使其可以正常工作
_self.document.getElementsByClassName("up-btn set-btn")[0].click();
});
}
setting.div = $(
'<div style="border: 2px dashed #377DFF; width: 100px; position: fixed; top: 0; left: 0; z-index: 99999; background-color: #EBF2FF; overflow-x: auto;">' +
'<span style="font-size: medium;"></span>' +
'<button style="margin-right: 20px;">打开评论</button>'+
'<button style="margin-right: 20px;">一键评论</button>'
).appendTo('body').on('click','button,td',function(){
var len = $(this).prevAll('button').length;
console.log("一键评论");
if (len === 0) {
console.log("打开评论");
for (var i=0;i<setting.length;i++){
opencomment(i);
}}
else {
console.log("实现评论");
comment(); // 获取并打开评论窗口
}
})
三、总结与心得
1. bug
1. 同时打开多个界面的时候,评论子界面会丢失评论按钮,无法评论;
2. 评论界面应该是有js禁止了模拟输入,测试的的时候发现,直接给textarea赋值的时候“发布”按钮变灰无法工作,直接修改其class属性无法使其正常工作,但是接着手动输入字符的时候就可以发布,应该是模拟点击输入没有写好,无法绕过(这也是最主要的bug***)
2. 心得
相比第一次写的脚本,第一个脚本实在看不过去,这次发现了unsafeWindow、jQuery、setTimeout等函数,使得可以实现更多功能。脚本要是写得好,真的方便很多,但是写脚本的资料感觉好少,智慧树的保护还不错(吧),至少把现在的我拦住了。
或许可以试试selenium?只是学习而已,不会再往下做了,但是要是有同学有意愿或者会一些有想法解决这些问题,欢迎和我沟通,大家一起学习进步。
(写一个脚本真的好好玩哈哈哈哈)