赛事星答题

搜题脚本,需要你的试题可以反复训练来爬取题库

// ==UserScript==
// @name         赛事星答题
// @namespace    http://tampermonkey.net/
// @version      3.3
// @description  搜题脚本,需要你的试题可以反复训练来爬取题库
// @author       define9
// @match        *://saishi.cnki.net/exam/ExamRd/Answer/*
// @match        *://saishi.cnki.net/m/exam/ExamRd/Answer/*
// @match        *://saishi.cnki.net/exam/ExamRd/Start/*
// @match        *://saishi.cnki.net/exam/PapersRd/Analysis/*
// @grant        nones
// @license      Apache
// ==/UserScript==

server = 'https://qdu-soft.syhu.com.cn/api'
identifyCode = '84e7b9680924b6151dafe1d845b6c1d6_8fa38d687a9043e184d9398bfff1a757'

function init() {
	$('body').append(
		`<div id="showArea">
			<div class="title" id="tampmonkeyTitle"></div>
			<div id="tampmonkeyBoard">hello world</div>
		</div>`)

	let showArea = $('#showArea')
	let showAreaOrg = showArea[0]

	// 渲染CSS
	{
		showAreaOrg.style.background = '#808080';
		showAreaOrg.style.color = '#ffffff';
		showAreaOrg.style.overflow = 'hidden';
		showAreaOrg.style.zIndex = 999;
		showAreaOrg.style.position = 'fixed';
		showAreaOrg.style.padding = '5px';
		showAreaOrg.style.textAlign = 'center';
		showAreaOrg.style.borderRadius = '4px';
		showAreaOrg.style.maxWidth = '400px'
		// showAreaOrg.style.fontSize = '2em';

		showAreaOrg.style.left = '20px';
		showAreaOrg.style.top = '20px'
	}

	// 渲染拖动
	{
		showAreaOrg.addEventListener("mousedown", function (e) {
			//设置事件对象
			let event1 = e || window.event;

			//鼠标移动事件调用函数
			let yidong = function (e) {
				//设置时间对象
				let event = e || window.event;

				showAreaOrg.style.left = event.clientX - event1.offsetX + `px`
				showAreaOrg.style.top = event.clientY - event1.offsetY + `px`
			}

			//鼠标按下时div自身添加边框
			this.style.border = `2px solid red`;

			//解决拖动会选中文字的问题
			document.onselectstart = () => false

			//当按下时  对document设置鼠标移动事件
			document.addEventListener("mousemove", yidong);

			//鼠标抬起事件
			document.addEventListener("mouseup", function (e) {
				//删除鼠标移动事件
				document.removeEventListener("mousemove", yidong);
				//取消边框
				showAreaOrg.style.border = `none`;

				//解决拖动会选中文字的问题
				document.onselectstart = () => true
			})
		})

	}

	// 判断是否为手机
	{
		phone = false
	}
}

function show(origin, isAdd = true) {
	let tampmonkeyBoard = $('#tampmonkeyBoard')
	if (isAdd) {
		tampmonkeyBoard[0].innerHTML += origin
	} else {
		tampmonkeyBoard[0].innerHTML = origin
	}
}

function parseQuestion() {
	var jiexiTags = document.querySelectorAll('.jiexi-question-block')
	let count = parseInt($('.tihao')[$('.tihao').length - 1].innerText)

	for (let i = 0; i < count; i++) {
		const jiexiTag = jiexiTags[i];
		var title = jiexiTag.querySelector('.tigan').innerHTML.split('\n')[2].trim().replace(/&nbsp;/ig, ' ')
		var listTags = jiexiTag.querySelectorAll('.img-list .clearfix')

		let answerBlockTag = jiexiTag.querySelector('.answer-block')
		let answerTag = answerBlockTag.querySelectorAll('.right-color')
		let answer = [];
		for (j = 0; j < answerTag.length; j++) {
			answer[j] = answerTag[j].innerHTML.trim().replace(/&nbsp;/ig, ' ').replaceAll(/<[^>]+>/g, "")
		}

		if (listTags.length > 0) { // 如果是选择题
			answer = answer[0].split('')
			t = answer
			c = 65
			answerIndex = 0
			for (tag of listTags) {
				if (t.includes(String.fromCharCode(c++))) {
					answer[answerIndex++] = tag.querySelector('.text-block').innerHTML.replace(/&nbsp;/ig, ' ')
						.replaceAll(/<[^>]+>/g, "")
				}
			}
		}

		$.ajax({
			url: server + '/question/question/commit',
			async: false,
			dataType: 'JSON',
			type: 'POST',
			contentType: "application/json",
			data: JSON.stringify({
				title,
				answer,
				identifyCode
			}),
			success(res) {
				show(`正在提交第${i + 1}个: ${res.msg}<br>`, true)
			},
			error() {
				show(`[error] 提交第${i + 1}个时网络异常<br>`, true)
			}
		})

	}
}

function search() {
	var result = {}
	let title = $(phone ? '.topic' : '.tigan').text().trim().replace(/&nbsp;/ig, ' ');
	if (identifyCode === '') return "用户名为空"
	$.ajax({
		url: server + '/question/question/search',
		type: 'POST',
		async: false,
		dataType: 'JSON',
		contentType: "application/json",
		data: JSON.stringify({
			title,
			identifyCode
		}),
		success(data) {
			result = data
		},
		error(e) {
			console.log("error: ", e)
		}
	})
	return result
}

function autoFill(answer) {
	//answer: Array
	if (answer == null || answer.length <= 0) return

	// 填空
	let inputs = document.querySelectorAll('.tiankong')
	if (inputs != null && inputs.length > 0) {
		for (let i = 0; i < inputs.length; i++) {
			if (i >= answer.length) {
				break;
			}
			let input = inputs[i]
			let ans = answer[i]

			input.value = ans
		}
		return
	}

	// 不是填空题, 是选择题
	let xuanxiangs = $('.question-block .item-line')

	for (let i = 0; i < xuanxiangs.length; i++) {
		for (let j = 0; j < answer.length; j++) {
			let xuanxiang = xuanxiangs[i].getElementsByClassName('xuanxiang')[0]
			let xuanxiangText = xuanxiang.innerText.trim()
			let ans = answer[j].replace('\n', ' ')

			if (xuanxiangText == ans) {
				let square = xuanxiangs[i].getElementsByClassName('iradio_square-green')[0]
				if (square == undefined) {
					// 多选
					square = xuanxiangs[i].getElementsByClassName('icheckbox_square-green')[0]
				}
				if (!square.classList.contains('checked')) {
					xuanxiang.click()
				}
				return
			}
		}
	}
}

function answerHandle(num, answer) {
	if (answer.data.length > 0) {
		// autoFill(answer)
		show(num + ':<br>', false)
		for (let i = 0; i < answer.data.length; i++) {
			const element = answer.data[i]
			show('<span style="color: red;">题目:</span>' + element.title + '<br>')
			show('<span style="color: burlywood;">答案:</span>' + element.answer)
			show('<hr>')
		}
		autoFill(answer.data[0].answer)
	} else {
		show(num + ':<br>' + answer.msg, false)
	}
}

(function () {

	init()

	var lastPageNum = -1

	if (document.querySelectorAll(".jiexi-question-container").length > 0) {
		parseQuestion()
	} else {
		if (!phone) {
			var nextBtn = document.querySelector(".g-next")
			var numTag = document.getElementsByClassName('num')
			if (nextBtn != null && nextBtn.childNodes != null && nextBtn.childNodes.length > 2) {
				nextBtn.children[0].addEventListener('click', function () {
					let currentPageNum = parseInt(numTag[0].innerHTML)
					lastPageNum = currentPageNum
					let answer = search()

					answerHandle(currentPageNum, answer)
				})
				nextBtn.children[1].addEventListener('click', function () {
					let currentPageNum = parseInt(numTag[0].innerHTML)
					lastPageNum = currentPageNum
					let answer = search()

					answerHandle(currentPageNum, answer)
				})
			} else {
				console.log("翻页按钮未找到");
			}
		} else {
			numTag = document.getElementById('q_number').querySelectorAll('span')
		}

		setInterval(function () {
			if (numTag.length === 0 || numTag[0] === null) return
			var currentPageNum = parseInt(numTag[0].innerHTML)
			if (currentPageNum != lastPageNum) {
				let answer = search()

				lastPageNum = currentPageNum
				answerHandle(currentPageNum, answer)
			}
		}, 800)
	}
})()