🏠 Home 

驾考宝典,模拟考试自动做题

驾考宝典模拟考试自动做题,现已兼容科目一和科目四模拟考试


安装此脚本?
// ==UserScript==
// @name         驾考宝典,模拟考试自动做题
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  驾考宝典模拟考试自动做题,现已兼容科目一和科目四模拟考试
// @author       ZouYS
// @match        https://www.jiakaobaodian.com/mnks/exam/*.html
// @icon         https://www.jiakaobaodian.com/favicon.ico
// @grant        GM_addStyle
// @run-at       document-start
// @license      MIT
// ==/UserScript==
(function() {
'use strict';
var quesList=[];
//劫持函数
function addXMLRequestCallback(callback) {
// oldSend 旧函数 i 循环
var oldSend, i;
//判断是否有callbacks变量
if (XMLHttpRequest.callbacks) {
//判断XMLHttpRequest对象下是否存在回调列表,存在就push一个回调的函数
XMLHttpRequest.callbacks.push(callback);
} else {
//如果不存在则在xmlhttprequest函数下创建一个回调列表/callback数组
XMLHttpRequest.callbacks = [callback];
// 保存 XMLHttpRequest 的send函数
oldSend = XMLHttpRequest.prototype.send;
//获取旧xml的send函数,并对其进行劫持(替换)  function()则为替换的函数
//以下function函数是一个替换的例子
XMLHttpRequest.prototype.send = function () {
// 把callback列表上的所有函数取出来
for (i = 0; i < XMLHttpRequest.callbacks.length; i++) {
// 把this传入进去
XMLHttpRequest.callbacks[i](this);
}
//循环回调xml内的回调函数
// 调用旧的send函数 并传入this 和 参数
oldSend.apply(this, arguments);
//由于我们获取了send函数的引用,并且复写了send函数,这样我们在调用原send的函数的时候,需要对其传入引用,而arguments是传入的参数
};
}
}
//传入回调 接收xhr变量
addXMLRequestCallback(function (xhr) {
//调用劫持函数,填入一个function的回调函数
//回调函数监听了对xhr调用了监听load状态,并且在触发的时候再次调用一个function,进行一些数据的劫持以及修改
xhr.addEventListener("load", function () {
// 输入xhr所有相关信息
//console.log(xhr);
if (xhr.readyState == 4 && xhr.status == 200) {
//  如果xhr请求成功 则返回请求路径
//console.log("函数1", xhr.responseURL);
//console.log(xhr.response)
if(xhr.responseURL.includes('https://api2.jiakaobaodian.com/api/open/question/question-list.htm')){
//console.log(JSON.parse(xhr.response))
let list=JSON.parse(xhr.response);
quesList=[...quesList,...(list.data)]
console.log(quesList)
}
}
});
});
async function domain(){
let index=0;
for(index;index<quesList.length;index++)
{
await sleep(200);
//点击并查询正确答案
let questionId=document.querySelector('[data-questionid]').getAttribute('data-questionid')
let r###lt=quesList.filter(item => item.questionId==questionId)
r###lt=r###lt[0]
let answer=r###lt.answer.toString()
//optionType 0   判断
//optionType 1   单选
//optionType 2   多选
console.log(`第${index+1}题:`)
let answers=new Map();
answer=parseInt(answer);
let bitPos=4;
for(let i=0;i<4;i++){
let mask=1 << (bitPos+i);
if(answer & mask){
// answers+=r###lt['option' +String.fromCharCode('A'.charCodeAt(0) + i)]
answers.set(r###lt['option' +String.fromCharCode('A'.charCodeAt(0) + i)],true)
}
}
/*else{
switch(answer)
{
case '16':
answer=r###lt.optionA
break;
case '32':
answer=r###lt.optionB
break;
case '64':
answer=r###lt.optionC
break;
case '128':
answer=r###lt.optionD
break;
default:
answer='error get answer'
}
}*/
console.log(answers)
let letter='A'
var container = await document.querySelector('.answer-w');
if (container) {
var paragraphs =await container.querySelectorAll('p'); // 获取父元素内部的所有 <p> 元素
await paragraphs.forEach( function(paragraph) {
if(answers.has(paragraph.textContent.slice(paragraph.textContent.indexOf('、')+1))){
letter=paragraph.textContent.split('、')[0]
let selector = '.select-w.right .select-lable[data-key="' + letter + '"]';
// 使用构建好的选择器字符串来获取相应的按钮元素
let button =  document.querySelector(selector);
button.click();
if(r###lt.optionType.toString()!=='2'){
return true;
}
}
});
//多选确定
let btnOk=document.querySelector('.btn-answer-ok')
if(btnOk){
btnOk.click();
}
}
}
}
function fuc_show() {
// let is_show=document.querySelector('#myWindow')
if (quesList.length===100 || quesList.length===50) {
domain().then(r =>{} );
}
else {
alert('wrong init!Please refresh again!')
}
}
async function sleep(time) {
console.log('睡眠' + time / 1000 + 's')
//if(time < 1000)time=1000
return await new Promise((resolve) => setTimeout(resolve, time));
}
window.onload=()=>{
let css = `
.mybtn2 {
z-index: 9999999999;
position: absolute;
top: 300px;
font-size: inherit;
font-family: inherit;
color: white;
width: 100px;
height: 50px;
padding: 0.5em 1em;
outline: none;
border: none;
background-color: hsl(236, 32%, 26%);
overflow: hidden;
transition: color 0.4s ease-in-out;
}
.mybtn2::before,.mybtn1::before {
content: '';
z-index: -1;
position: absolute;
top: 100%;
right: 100%;
width: 1em;
height: 1em;
border-radius: 50%;
background-color: #3cefff;
transform-origin: center;
transform: translate3d(50%, -50%, 0) scale3d(0, 0, 0);
transition: transform 0.45s ease-in-out;
}
.mybtn2:hover,.mybtn1:hover {
cursor: pointer;
color: #161616;
}
.mybtn2:hover::before,.mybtn1:hover::before {
transform: translate3d(50%, -50%, 0) scale3d(15, 15, 15);
}`;
GM_addStyle(css);
let showWindow = document.createElement('button')
showWindow.classList.add('mybtn2')
showWindow.innerText='点击自动开始答题';
document.body.appendChild(showWindow)
showWindow.addEventListener('click', fuc_show)
}
})();