// ==UserScript==
// @name 问卷星3.0
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author YYdny
// @match https://www.wjx.cn/vm/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=csdn.net
// @grant none
// ==/UserScript==
(function () {
'use strict';
//默认存储22个题
var arr = ["div1", "div2", "div3", "div4", "div5", "div6", "div7", "div8", "div9", "div10", "div11"
, "div12", "div13", "div14", "div15", "div16", "div17", "div18", "div19", "div20", "div21", "div22"];
//二维数组存储填空题答案
var date = [["华为", "vivo", "OPPO", "苹果", "三星", "荣耀", "iQOO", "小米", "一加", "努比亚", "红米", "Moto", "诺基亚"],
["外观", "功能", "配置", "厂商"],
["手机卡", "系统不稳定", "信号差", "系统bug多", "拍照不好看", "像素太低", "容易摔坏"],
["用电快", "价格太贵", "越用越卡", "更新太快", "配置太低"],
["延长保修", "推出以旧换新", "增加线下店面"]];
// 存储填空题中的题干的 唯一 关键字 !!!一定要和二维数组date里的答案相对应
// 例如:
// 品牌———————["华为", "vivo", "OPPO", "苹果", "三星", "荣耀", "iQOO", "小米", "一加", "努比亚", "红米", "Moto", "诺基亚"]
// 因素——————["外观", "功能", "配置", "厂商"]
var mathStr = ["品牌", "因素", "提快", "国际", "售后"];
var mathFail = [];
var answNumTem;
var exQues;
var quesNum;
var ansNum;
window.onload = function () {
//获取题的个数
quesNum = document.querySelector('fieldset').children.length;
//当大于22道题时先向数组里添加新的题号然后再填写题目
while (quesNum > 22) {
for (var x = 22; x <= quesNum; x++) {
exQues = "div" + x;
arr.push(exQues);
}
break;
}
try {
//填写问卷
FillQues();
//提交
Submit();
//当填空题填写 "无" 时输出题号
} catch (err) {
console.log(err)
}
finally {
Submit();
}
while (mathFail.length != 0) {
//输出没有值的填空题
ReadFailText();
break;
}
}
//填写问卷的函数
function FillQues() {
for (var i = 0; i < arr.length; i++) {
var multpText = document.getElementById(arr[i]).children[0].innerText.indexOf("多选题")
//多选题
if (multpText >= 0) {
//去掉其他选项
lostOther(i);
//多选题 选择三项
for (var j = 0; j < 3; j++) {
SelectOp(i);
}
}//非多选题
else {
var InpuText = document.getElementById(arr[i]).children[1].children[0].tagName;
//填空题
if (InpuText == 'INPUT') {
//当填空题文本框为空时设置textNull的值为真
var textNull = true;
//判断题干是否包含mathStr数组里的关键字,如果包含关键字找出是在数组第几位
for (var n = 0; n <= mathStr.length; n++) {
//避免填空题没找到匹配导致程序错误
var indexInput = document.getElementById(arr[i]).children[0].innerText.indexOf(mathStr[n]);
//如果包含关键字 在准备好的date数组中拿到数据填写
if (indexInput >= 0) {
//生成随机数为从date数组拿答案做准备
var x = Math.floor((Math.random() * date[n].length));
//填写答案
document.getElementById(arr[i]).children[1].children[0].value = date[n][x];
//填入内容后切换textNull状态为假
textNull = false;
break;
}
else {
document.getElementById(arr[i]).children[1].children[0].value = "无";
}
}
while (textNull) {
//打印出没有填写的填空题
var quesLen = document.getElementById(arr[i]).children[0].innerText;
mathFail.push(quesLen.slice(0, quesLen.length - 2) + "___未匹配到关键字");
break;
}
}//单选
else {
lostOther(i);
SelectOp(i);
}
}
}
}
//提交方法
function Submit() {
var isClickVerfy = true;
var interval = setInterval(function () {
//是否出现对话框
while (document.getElementsByClassName('layui-layer-content')[0] ? true : false) {
// 关闭对话框
document.getElementsByClassName("layui-layer-btn1")[0].click();
break;
}//是否第一次点击验证按钮
while (document.getElementById("SM_TXT_1") ? true : false && isClickVerfy) {
//点击验证按钮
document.getElementById("SM_TXT_1").click();
//关闭点击验证按钮
isClickVerfy = false;
break;
}//第二重验证是否出现
while (document.getElementsByClassName('nc-lang-cnt') ? true : false) {
//两秒后取消计时器
setTimeout(function () {
//清除计时器
clearInterval(interval);
VerifyCheck();
}, 2000)
break;
}
}, 500)
//提交按钮
document.getElementById('ctlNext').click();
}
//输出没有成功填入值的填空题号
function ReadFailText() {
var totalText = mathFail[0];
//循环读出mathFail里的值
for (var i = 1; i < mathFail.length; i++) {
totalText += mathFail[i] + "\n";
}
//输入totalText数组里的值
alert(totalText);
console.log(totalText);
}
//去掉其他
function lostOther(i) {
//获取答案个数
answNumTem = document.getElementById(arr[i]).children[1].children.length;
//存储答案个数
ansNum = answNumTem;
//循环答案选项判断是否有 “其他” 选项
for (var m = 0; m < answNumTem; m++) {
while (document.getElementById(arr[i]).children[1].children[m].innerText.indexOf("其他") >= 0) {
//去掉最后一项 “其他” 一般都是最后一项
--ansNum;
break;
}
}
}
//勾选答案
function SelectOp(n) {
//生成选择项
var index = Math.floor((Math.random() * ansNum));
//勾选选项
document.getElementById(arr[n]).children[1].children[index].click();
}
// 滑块验证
function VerifyCheck() {
// 获得滑块
var btn = document.querySelector(".nc_iconfont.btn_slide");
//创建鼠标事件
var mousedown = document.createEvent('MouseEvents');
// 获取滑块的的大小和相对于视口的位置
var rect = btn.getBoundingClientRect();
// 存储滑块相对视口边缘的x值
var x = rect.x;
// 存储滑块相对视口边缘的Y值
var y = rect.y;
// 初始化mouse down
mousedown.initMouseEvent('mousedown', true, true, window, 0,
x, y, x, y, false, false, false, false, 0, null);
// 触发mouse down事件
btn.dispatchEvent(mousedown);
var offsetX = 0;
// 定时触发器
var interval = setInterval(function () {
// 创建鼠标事件
var mousemove = document.createEvent('MouseEvents');
// X轴 移动距离
var currentX = x + offsetX;
//初始化鼠标移动
mousemove.initMouseEvent('mousemove', true, true, window, 0,
currentX, y, currentX, y, false, false, false, false, 0, null);
// 触发鼠标移动事件
btn.dispatchEvent(mousemove);
// 判断滑块位移距离
if (currentX - x >= 260) {
//清除计时器
clearInterval(interval);
//定义鼠标事件
var mouseup = document.createEvent('MouseEvents');
//初始化鼠标抬起
mouseup.initMouseEvent('mouseup', true, true, window, 0,
currentX, y, currentX, y, false, false, false, false, 0, null);
// 触发鼠标抬起
btn.dispatchEvent(mouseup);
}
else {
// 增加偏移量
offsetX += Math.ceil(Math.random() * 50);
}
}, 60);
}
})();
为毛概的社会实践调查问卷写的脚本,js不是我的主语言所以功能不完善,目前支持单选、多选、填空,可以实现智能验证以及通过第二重验证,有兴趣大佬可以再完善一下,二重验证参考:js 模拟鼠标拖动 - rubekid - 博客园 (cnblogs.com)
测试地址:关于大学生手机品牌选择的调查问卷[复制] (wjx.cn)
油猴安装地址:Tampermonkey • 首页
脚本使用方法:
1.安装油猴脚本
2.打开油猴新建脚本
3.将脚本内容全部删掉然后放入上方代码