有一些网课需要刷,然后发现一个app(火星搜题)挺准的用它接口实现此脚本。不发gf了(因为涉及api需要抓包),在这里给需要的人使用吧。(我自己刷完了,便测试边做题,写完了不能浪费就发出来了,gf上也没找到火星搜题下载能用的,多是接口失效)。
脚本内configs添加选择规则可实现其它网课答案搜索。
目前已实现 长江雨课堂 学堂在线
长江雨课堂示意
学堂在线示意
功能:
自定火星搜题答案脚本义父级节点安置查询到的答案,自动过滤不可靠的答案,自动帮你选火星搜题择,用户要做的只有提交。
理论上加上一些语句可以全程自动化做题提交,但我不信没有bug。
// ==UserScript==
// @name AnswerTip
// @namespace http://tampermonkey.net/
// @version 0.1
// @author polygon
// @match https://changjiang.yuketang.cn/*/exercise/*
// @match https://www.xuetangx.com/*/exercise/*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @runat document-end
// ==/UserScript==
(function() {
const order = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
const n = 10
let currentQuestion = ''
const configs = {
'changjiang.yuketang.cn': {
question: '.problem-body', // 问题,题目所在位置,其innerText属性是问题(不含选项)
answer: '.item-body', // 答案要展示的父级元素节点,会append到该Node下
options: '.item-body ul li label', // 每个选项的位置,会根据它匹配多个Node
select: 'is-checked', // 点击后,相应属性增加值,因为有的选项需要多次点击,所以增加此用于判断是否点击上
// 一些自定义添加的答案区域style
style: `
background-color: #f5f5f5;
`
},
'www.xuetangx.com': {
question: '.leftQuestion',
answer: '.courseActionLesson',
options: '.leftradio',
select: 'active',
style: `
background-color: #fcfcfc;
border: 1px solid hsla(0,0%,81.2%,.31);
width: 500px;
height: 200px;
overflow-y: scroll;
`
}
}
let url = window.location.href
let host = Object.keys(configs).filter((host) => {
if (url.includes(host)) {
return true
}
return false
})
if (host.length == 0) return
const config = configs[host[0]]
GM_addStyle(`
.answer-polygon {
${config.style};
font-size: 14px;
border-radius: 4px;
padding: 10px 15px;
margin-bottom: 20px;
text-align: left;
font-family: -apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,"sans-serif";
}
`)
let id = setInterval(() => {
let questionNode = document.querySelector(config.question)
if (questionNode == null) return
let text = questionNode.innerText.slice(0, 233)
if (text == currentQuestion) return
currentQuestion = text
let answerNode = document.querySelector(config.answer + ' .answer-polygon')
if (answerNode == null) {
answerNode = document.createElement('div')
answerNode.setAttribute('class', 'answer-polygon')
document.querySelector(config.answer).append(answerNode)
}
try {
answerNode.innerHTML = 'searching...'
} catch {
return
}
let optionNodes = document.querySelectorAll(config.options)
searchAnswer(text, answerNode, optionNodes)
// clearInterval(id)
}, 1000);
let clickOption = (optionNodes, text) => {
optionNodes.forEach((optionNode) => {
if (optionNode.innerText.replaceAll('[p]', '').replaceAll('[/p]', '').split('\n').slice(-1) == text) {
let id = setInterval(() => {
if (!optionNode.innerHTML.includes(config.select)) {
optionNode.click()
} else {
clearInterval(id)
}
}, 100)
}
})
}
let searchAnswer = (text, answerNode, optionNodes) => {
GM_xmlhttpRequest({
method: 'POST',
url: 'https://schoolapi.fenbi.com/college/android/search-item/search?format=ubb&searchType=2&text=' + encodeURIComponent(text),
headers: {
'cookie': 'tourist=; userid=; sid=' // 抓包获取
},
onload: function (xhr) {
console.log(xhr)
const data = JSON.parse(xhr.responseText)['data']
if (data == null) {
answerNode.innerHTML = 'retry...'
setTimeout(() => {
currentQuestion = ''
}, 1000);
return
}
let s = ''
let answer_groups = []
for (let i=0;i<n;i++) {
let item = data['questionList'][i]
console.log(item)
// 1 题目
s += item['content'].replaceAll('[', '<').replaceAll(']', '>') + '<br/>'
const re = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?%+_]", 'g');
let same = item['content'].replaceAll(re, '').includes(currentQuestion.replaceAll(re, '').split('\n')[0])
if (same) {
answer_groups.push([])
}
// 2 正确答案
// 2.1 选项形式 ABCD
if (item['correctAnswer'].hasOwnProperty('choice')) {
let choice_indexes = item['correctAnswer']['choice'].split(',')
if (choice_indexes.length > 0) {
let choice_orders = []
for (let j=0;j<choice_indexes.length;j++) {
let choice_order = order[parseInt(choice_indexes[j])]
if (!choice_orders.includes(choice_order)) {
choice_orders.push(choice_order)
}
}
s += '<p>' + choice_orders.join('') + '</p><br/>'
// choice_orders = ['A', 'B', 'C']
// 选项
if (item['accessories'].length > 0){
item['accessories'] = item['accessories'].filter((item) => {
return (item.hasOwnProperty('options'))
})
let options = item['accessories'][0]['options']
if (options.length > 0) {
for (let j=0;j<options.length;j++) {
if (choice_orders.includes(order[j])) {
if (same) {
answer_groups[answer_groups.length-1].push(options[j])
}
// if (same) clickOption(optionNodes, options[j])
s += `<b>[${order[j]}] ` + options[j] + '</b><br/>'
} else {
s += `[${order[j]}] ` + options[j] + '<br/>'
}
}
}
}
}
// 2.2 文字描述形式
} else if (item['correctAnswer'].hasOwnProperty('answer')) {
console.log(item['correctAnswer']['answer'])
text = item['correctAnswer']['answer']
.replace('', '<br/>')
.replace('\u0001', '<br/>')
.replace('\x01', '<br/>')
.replace(/-+/g, '<br/>')
.replaceAll('[', '<')
.replaceAll(']', '>')
.replace(';;', ';')
if (same) {
text.replace('<p>', '')
.replace('</p>', '')
.split('<br/>')
.forEach((option_text) => {
answer_groups[answer_groups.length-1].push(option_text)
// clickOption(optionNodes, option_text)
})
}
s += '<b>' + text + '</b>'
}
if (i < n-1) {
s += '<br/><hr/><br/>'
}
}
console.log(answer_groups)
// 判断是否为多选
let multi = false
answer_groups.forEach((group) => {
if (group.length > 1) {
multi = true
}
})
if (multi) {
answer_groups = answer_groups.filter((group) => {
return group.length > 1
})
}
console.log(answer_groups)
let answers = []
if (answer_groups.length == 1) {
answers = answer_groups[0]
} else {
// 取交集
// 得到所有答案元素
let answer_items = []
answer_groups.forEach((group) => {
group.forEach((item) => {
if (!answer_items.includes(item)) {
answer_items.push(item)
}
})
})
answers = answer_items.filter((item) => {
let b = true
answer_groups.forEach((group) => {
if (!group.includes(item)) {
b = false
}
})
return b
})
}
console.log(answers)
answers.forEach((answer) => {
clickOption(optionNodes, answer)
})
answerNode.innerHTML = s
},
ontimeout: function () {
answer.innerHTML = "No Sugesstion"
}
})
}
})();
脚本内cookie需要在火星搜题app上抓包获取,每天有调用次数限制,所以每个人自己用自己抓
[wm_error]关于抓取Cooke加密请移步这篇文章[/wm_error]
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们第一时间更新。
什么时候修复修复,一直无法显示隐藏内容
可能你浏览器缓存
出bug了?显示不了隐藏啊
评论之后没用啊,怎么刷新也不显示
评论后还是看不了隐藏内容,坏了吗??
评论后还是看不了隐藏内容,坏了吗?
学习一下学习一下?
学习一下学习一下
。。。。。。。之后
抓包后返回的数据是加密数据,求楼主告诉怎么解密:”code”:1,”errMessage”:null,”msg”:null,”data”:”msE8iHD7vy/X+Dk1GuSRP5CC7PZ3mdjVgUS2W+SdTpHGYieKyj5zjL3IFpEi/018Mu7nXN/Wbv6vx5h8tsLOl1d34xLGKb9HtCPCAbRUiJwwn4M1MNln2d6bpYH6f7Vjt9nbkfZvDFpRYfp1AFoLN+1e9x61Meyu7O2YJ6MNq91oVPQoPpPNfMy5ydilkznADEAbg73pYAQJ0CFrgij1xvSxEisOuljv+G/
骚年看看这篇文章:https://momeis.net/post-64539.html
抓包后返回的数据是加密数据,求楼主告诉怎么解密:”code”:1,”errMessage”:null,”msg”:null,”data”:”msE8iHD7vy/X+Dk1GuSRP5CC7PZ3mdjVgUS2W+SdTpHGYieKyj5zjL3IFpEi/018Mu7nXN/Wbv6vx5h8tsLOl1d34xLGKb9HtCPCAbRUiJwwn4M1MNln2d6bpYH6f7Vjt9nbkfZvDFpRYfp1AFoLN+1e9x61Meyu7O2YJ6MNq91oVPQoPpPNfMy5ydilkznADEAbg73pYAQJ0CFrgij1xvSxEisOuljv+G/
0
0
抓包后返回的数据是加密数据,求楼主告诉怎么解密:”code”:1,”errMessage”:null,”msg”:null,”data”:”msE8iHD7vy/X+Dk1GuSRP5CC7PZ3mdjVgUS2W+SdTpHGYieKyj5zjL3IFpEi/018Mu7nXN/Wbv6vx5h8tsLOl1d34xLGKb9HtCPCAbRUiJwwn4M1MNln2d6bpYH6f7Vjt9nbkfZvDFpRYfp1AFoLN+1e9x61Meyu7O2YJ6MNq91oVPQoPpPNfMy5ydilkznADEAbg73pYAQJ0CFrgij1xvSxEisOuljv+G/
xuexiyi
学习一下
妙啊