当前位置: 首页 > 工具软件 > Temper > 使用案例 >

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

桓兴腾
2023-12-01

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

 类似资料: