0


Temper monkey(油猴)实现问卷星填写

// ==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.将脚本内容全部删掉然后放入上方代码

标签: javascript html 前端

本文转载自: https://blog.csdn.net/yydny/article/details/127786383
版权归原作者 yydny 所有, 如有侵权,请联系我们删除。

“Temper monkey(油猴)实现问卷星填写”的评论:

还没有评论