文章目录
鹏作业(考试)获取正确答案获取正确答案 第二弹
在第一篇帖子中我们找到了 获取单个问题答案的接口,
我好多人都想要成品,当天学习了一下油猴脚本,我加班加点快速的写了一个脚本。
脚本源码在最下方:
理论与在正式也还是存在一些问题的:
1.页面中只有 问题id 找不到itemBankId
解决办法,找到了论坛中(论坛的搜索最近突然变成百度搜索了好难用。。。):
https://www.52pojie.cn/thread-1093932-1-1.html
这个帖子,通过 HOOK WebRequest 来拦截访问页面的请求,这个给了我思路(给了我copy)的能力。
通过拦截请求问题列表的的方式来获取我们在获取正确答案时需要的一些信息。
2.判断正确答案
在上个帖子中是I7这个选项是正确答案的下标,后来发现通过返回的正确答案接口中 Choices选项详情中IsCorrect这个字段可以直接用来判断这个选项是否正确。通过I7有些麻烦(写脚本时才发现所以脚本有些变量定义有些混乱)。
3.有些问题的答案是图片<img>标签
这个比较好解决 :之前使用的是,dom.innerText+=iteam; 改成dom.innerHTML+=iteam;即可解决;
结果
在奥鹏没有改版之前是可以通过问题列表获取全部的答案的,现在只能单个获取所以网页加载速度会有影响。
我也是测试了10多次的答题(测试了2小时)获取的答案是没什么问题的
获取到答案后会在当前的问题下方列出正确答案
总之写脚本的过程还算顺利。
方便大家也已经上传到greasyfork中一键下载更方便
https://greasyfork.org/zh-CN/scripts/408018-%E5%A5%A5%E9%B9%8F%E7%AD%94%E6%A1%88%E8%8E%B7%E5%8F%96
tampermonkey脚本源码如下
// ==UserScript==// home.php?mod=space&uid=170990 奥鹏答案获取// home.php?mod=space&uid=467642 http://tampermonkey.net/// home.php?mod=space&uid=1248337 1.1// @description 实现在问题上显示答案!// home.php?mod=space&uid=686208 SQ// home.php?mod=space&uid=195849 https://learn.open.com.cn/StudentCenter/OnLineJob/TestPaper*// home.php?mod=space&uid=609072 GM_getResourceURL// @run-at document-idle// home.php?mod=space&uid=1385425 html https://homeworkapi.open.com.cn/getHomework// ==/UserScript==//全局问题var question;//请求的问题封装(方便根据id查找对应的对象)var map={};//根据问题的id来获取答案封装var answer={};function addXMLRequestCallback(callback){ var oldSend, i; if( XMLHttpRequest.callbacks ) { // we've already overridden send() so just add the callback XMLHttpRequest.callbacks.push( callback ); } else { // create a callback queue XMLHttpRequest.callbacks = [callback]; // store the native send() oldSend = XMLHttpRequest.prototype.send; // override the native send() XMLHttpRequest.prototype.send = function(){ // process the callback queue // the xhr instance is passed into each callback but seems pretty useless // you can't tell what its destination is or call abort() without an error // so only really good for logging that a request has happened // I could be wrong, I hope so... // EDIT: I suppose you could override the onreadystatechange handler though for( i = 0; i < XMLHttpRequest.callbacks.length; i++ ) { XMLHttpRequest.callbacks[i]( this ); } // call the native send() oldSend.apply(this, arguments); } }}//根据问题找出具体的idfunction initquestion(question){ //找出的问题数组 let list= question.data.paperInfo.Items; list.forEach((item,index,array)=>{ map[item.I1]=item //封装请求 let basturl = 'https://learn.open.com.cn/StudentCenter/OnlineJob/GetQuestionDetail?bust=${bust}&itemBankId=${itemBankId}&questionId=${questionId}&_=1596253257714' let bust=(new Date()).getTime() ; let itemBankId=item.I4; let questionId =item.I1; let rquurl = basturl.replace('${bust}',bust).replace('${itemBankId}',itemBankId).replace('${questionId}',questionId); map[item.I1]=rquurl fetch(rquurl,{ method: 'GET', headers:{ 'cookie':document.cookie } }).then(response =>response.json()).then(data =>{ console.log('=======data==================') console.log(data); let choiceslist= data.data.Choices let questionlist = new Array(); choiceslist.forEach((iteam,index,array)=>{ if(iteam.IsCorrect){ questionlist.push(iteam.I1 +" "+iteam.I2); } }) //根据名称直接赋值 let dom= document.querySelector("div[itemid='"+item.I1+"']") //创建元素开始赋值 //获取标题 let title=dom.getElementsByClassName('Subject-Title') let div= document.createElement("div"); let div_p= document.createElement("p"); div_p.innerText+="答案:"; div.appendChild(div_p) questionlist.forEach((iteam,index,array)=>{ let div_p_p= document.createElement("p"); div_p_p.innerHTML+=iteam; div.appendChild(div_p_p) div.className ='Student-Answer'; }) title[0].appendChild(div) console.log('=======questionlist==================') console.log(questionlist) questionlist answer[item.I1]=questionlist; return data; } )})}(function() { 'use strict';// Your code here...addXMLRequestCallback( function( xhr ) { xhr.addEventListener("load", function(){ if ( xhr.readyState == 4 && xhr.status == 200 ) { console.log(xhr.responseURL); if ( xhr.responseURL.includes("homeworkapi.open.com.cn/getHomework") ) { console.log(xhr.responseURL); question=JSON.parse(xhr.responseText); console.log(question); initquestion(question); } } });});})();
一下是一些截图信息:
有什么问题或者BUG私信我我来改一下。
最后 希望大家给个免费的点赞我等级太低了。。想使用论坛搜索
声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。