数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3140|回复: 2

[软件] JavaScript JS脚本问题求助,关于自动答题脚本数组的提取和处理(Auto.JS安卓)

[复制链接]
发表于 2020-9-1 09:54:09 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
代码见下。现在问题是,填空题部分,根据题库作答时,只能填入第一个字;根据提示作答时,提示提取的只有最后一个字,填入也是最后一个字。
编程小白,只能处理下逻辑判断,数组这种处理不了

/**
* @description: 答题循环
* @param: null
* @return: null
*/
function dailyQuestionLoop() {
    if (textStartsWith("填空题").exists()) {
        var questionArray = getFitbQuestion();
    }
    else if (textStartsWith("多选题").exists() || textStartsWith("单选题").exists()) {
        var questionArray = getChoiceQuestion();
    }

    var blankArray = [];
    var question = "";
    var answer = "";
    questionArray.forEach(item => {
        if (item != null && item.charAt(0) == "|") { //是空格数
            blankArray.push(item.substring(1));
        } else { //是题目段
            question += item;
        }
    });
    question = question.replace(/\s/g, "");
    console.log("题目:" + question);  

   var ansTiku = getAnswer(question, 'tiku');
    if (ansTiku.length == 0) {//tiku表中没有则到tikuNet表中搜索答案
        ansTiku = getAnswer(question, 'tikuNet');
    }
   answer = ansTiku.replace(/(^\s*)|(\s*$)/g, "");

    if (text("填空题").exists()) {
        if (answer == "") { //答案空,前面题库未找到答案,找提示
            var tipsStr = getTipsStr();
            answer = getAnswerFromTips(questionArray, tipsStr);
            console.info("提示中的答案:" + answer);
           if (blankArray.length > 1) {
                for (var i = 1; i < blankArray.length; i++) {
                    setText(i, answer.substr(blankArray[i - 1], blankArray[i]));
                }
            }else{
                    setText(0, answer.substr(0, blankArray[0]));
            }
        } else { //答案非空,题库中已找到答案
            console.info("答案:" + answer);
            if (blankArray.length > 1) {
                for (var i = 1; i < blankArray.length; i++) {
                    setText(i, answer.substr(blankArray[i - 1], blankArray[i]));
                }
            }else{
                    setText(0, answer.substr(0, blankArray[0]));
            }
        }
    }

    else if (text("多选题").exists() || text("单选题").exists()) {
        if (answer == "") {
            var tipsStr = getTipsStr();
            answer = clickByTips(tipsStr);
            console.info("提示中的答案:" + answer);
           checkAndUpdate(question, ansTiku, answer);
        } else {
            console.info("答案:" + ansTiku);
            clickByAnswer(answer);
        }
    }
    delay(0.5);
    if (text("确定").exists()) {
        text("确定").click();
        delay(0.5);
    }
    else {
        console.warn("未找到右上角确定按钮控件,根据坐标点击");
        click(device.width * 0.85, device.height * 0.06);//右上角确定按钮,根据自己手机实际修改
        console.warn("请手动处理");
        delay(5);
    }
    if (text("下一题").exists()) {
        if (text("下一题").exists()) {
            text("下一题").click();
            delay(0.5);
        }
        else {
        console.warn("请手动处理");
        delay(5);
        }
    }
    if (text("完成").exists()) {
        if (text("完成").exists()) {
            text("完成").click();
            delay(0.5);
        }
        else {
           console.warn("请手动处理");
           delay(5);
        }
    }
    console.log("-----------------------------------------------------------");
    delay(2);
}


/**
* @description: 获取填空题题目数组
* @param: null
* @return: questionArray
*/
function getFitbQuestion() {
    var questionCollections = className("EditText").findOnce().parent().parent();
    var questionArray = [];
    var findBlank = false;
    var blankCount = 0;
    var blankNumStr = "";
    questionCollections.children().forEach(item => {
        if (item.className() != "android.widget.EditText") {
            if (item.text() != "") {//题目段
                if (findBlank) {
                    blankNumStr = "|" + blankCount.toString();
                    questionArray.push(blankNumStr);
                    findBlank = false;
                }
                questionArray.push(item.text());
            }
            else {
                findBlank = true;
                blankCount += 1;
            }
        }
    });
    return questionArray;
}


/**
* @description: 获取选择题题目数组
* @param: null
* @return: questionArray
*/
function getChoiceQuestion() {
    var questionCollections = className("ListView").findOnce().parent().child(1);
    var questionArray = [];
    questionArray.push(questionCollections.text());
    return questionArray;
}


/**
* @description: 获取提示字符串
* @param: null
* @return: tipsStr
*/
function getTipsStr() {
    var tipsStr = "";
    while (tipsStr == "") {
        if (text("查看提示").exists()) {
            var seeTips = text("查看提示").findOnce();
            seeTips.click();
            delay(1);
            click(device.width * 0.5, device.height * 0.41);
            delay(1);
            click(device.width * 0.5, device.height * 0.35);
        } else {
            console.error("未找到查看提示");
        }
        if (text("提示").exists()) {
            var tipsLine = text("提示").findOnce().parent();
            //获取提示内容
            var tipsView = tipsLine.parent().child(1).child(0);
            tipsStr = tipsView.text();
            //关闭提示
            tipsLine.child(1).click();
            break;
        }
        delay(1);
    }
    return tipsStr;
}


/**
* @description: 从提示中获取填空题答案
* @param: questionArray, tipsStr
* @return: ansTips
*/
function getAnswerFromTips(questionArray, tipsStr) {
    var ansTips = "";
    for (var i = 1; i < questionArray.length - 1; i++) {
        if (questionArray[i].charAt(0) == "|") {
            var blankLen = questionArray[i].substring(1);
            var indexKey = tipsStr.indexOf(questionArray[i + 1]);
            var ansFind = tipsStr.substr(indexKey - blankLen, blankLen);
            ansTips += ansFind;
        }
    }
    return ansTips;
}

/**
* @description: 根据提示点击选择题选项
* @param: tipsStr
* @return: clickStr
*/
function clickByTips(tipsStr) {
    var clickStr = "";
    var isFind = false;
    if (className("ListView").exists()) {
        var listArray = className("ListView").findOne().children();
        listArray.forEach(item => {
            var ansStr = item.child(0).child(2).text();
            if (tipsStr.indexOf(ansStr) >= 0) {
                item.child(0).click();
                clickStr += item.child(0).child(1).text().charAt(0);
                isFind = true;
            }
        });
        if (!isFind) { //没有找到 点击第一个
            listArray[0].child(0).click();
            clickStr += listArray[0].child(0).child(1).text().charAt(0);
        }
    }
    return clickStr;
}


/**
* @description: 根据答案点击选择题选项
* @param: answer
* @return: null
*/
function clickByAnswer(answer) {
    if (className("ListView").exists()) {
        var listArray = className("ListView").findOnce().children();
        listArray.forEach(item => {
            var listIndexStr = item.child(0).child(1).text().charAt(0);
            //单选答案为非ABCD
            var listDescStr = item.child(0).child(2).text();
            if (answer.indexOf(listIndexStr) >= 0 || answer == listDescStr) {
                item.child(0).click();
            }
        });
    }
}


 楼主| 发表于 2020-9-1 09:57:14 | 显示全部楼层
代码来源GitHub _LazyStudy 和XXQG项目。基于其代码修改出来的XueXiQiangGuo脚本,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-6-25 03:10 , Processed in 0.343200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表