Greasy Fork is available in English.
http://tampermonkey.net/
// ==UserScript== // @name AnswerTip // @description http://tampermonkey.net/ // @version 0.32 // @author polygon // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAEwZJREFUeF7tnQ2QJVV1x8/peUNhEoPUrlJSErA0JuaDxDIFEvmYfX37sZOE1VVY1BBwZfEjfIQ1fhFNYGOCEDWsYUhM4gdKJAhCMOBO9vW5s29hE8SqNUTjVyUhqdUQo25GLZdF970+qQtvi91lXvft+7rf6+57umpqa2vuOfec/7m/6Y/bfS+CHKKAKDBSARRtRAFRYLQCAoiMDlEgRQEBRIaHKCCAyBgQBdwUkDOIm25i5YkCAognhZY03RQQQNx0EytPFBBAPCm0pOmmgADipptYeaKAAOJJoSVNNwUEEDfdxMoTBQQQTwotabopIIC46SZWnigggHhSaEnTTQEBxE03sfJEAQHEk0JLmm4KCCBuuomVJwoIIJ4UWtJ0U0AAcdNNrDxRQADxpNCSppsCAoibbmLliQICiCeFljTdFBBA3HQTK08UEEA8KbSk6aaAAOKmm1h5ooAA4kmhJU03BQQQN93EyhMFBBBPCi1puikggLjpJlaeKCCAeFJoSdNNAQHETTex8kQBAcSTQkuabgoIIG66Vd4qDMNViPhTAHDkzzEAsOfIn36/v6fX6/Urn9iEAxRAJix4Gd212+0TEVEh4q8BwAuHUPy4Q1+PGHAQccdgMLh3aWnpnxx8NMpEAKlhOc8555wf279//xnMfCYizgPAi0pKYy8z3xMEwRIz7yQic+bx6hBAalRupdQlALAWANoA8IwphL4DAHb2+/2ber3ed6bQ/8S7FEAmLnn+DpVSGwDgMgA4I791KRYPA8DC8vLywu7duw+U0kNFnAogFSnESmGEYbgWEQ0Yv17RMB9i5gWt9YcrGt/YYQkgY0tYvIMwDE8bgvGa4r2X4nFnEAQL3W73U6V4n6JTAWSK4o84a1yPiG+rWFi24dx11FFHXbpt27Zv2hpUvZ0AUqEKKaXuBIBXlBDSDwBg7/BnPwCsBoBVw3+L7u4LzPxGrfUDRTuehj8BZBqqH9GnUspM5t0DACePGY65ef40APy9gQER97Zarb2Li4s/HOV3bm5uNSKuarVaq5l5DhHXMfMpY8ZhINxERLeO6Wfq5gLIlEvQ6XTOTJLkHwDgaS6hIOLnmHkxCILFbrf7oIuPI23OPvvs5w8Gg3kzx8LMZp7F6UDEd8ZxfK2TcUWMBJApFiIMw4sQ8WbHEG4JguCmoqAYFYOBJUmS1zHzlS4QM/OHtNZm/qaWhwAypbIppa4BgKsdutfMvFVrfa+DrbNJFEW/DABXMvNFDk6IiCIHu6mbCCBTKIFSSgFAnLPrrwDAViL6q5x2hTbvdDrmsmszM+cd8O8jorcWGswEnAkgExD50C7WrFnzMzMzM1/N2e0WALiBiL6X06605p1O5+LBYHADIj49RyfnEpF5UlebQwCZYKlOP/30Y48++uivAcAzc3R7BRHdmKP9###GUXQWM38QAH7WtlPzgqXW+n7b9tNuJ4BMsAJKqb8DgJdbdmkezZ5PROaxbaUPpRQBQGgZ5P7BYPCiHTt2mD8UlT8EkAmVSCn15wDwJsvuHmHmk7XWZnKvFodS6s8A4HLLYO9/7LHHXrZr165ly/ZTayaATED6nE+sdhFRVd7azaVOu92eD4Jgm6XRnUR0rmXbqTUTQEqWfjhL/jkAOM6iq4eJ6HkW7SrbJIqiTcz81zYBMvN6rfXdNm2n1UYAKVn5KIquZearLLr54czMzPHbt2//P4u2lW4SRdH7mfnNFkF2iehsi3ZTayKAlCh9FEU/zczm7JH59V8QBC8pe1a8xFSf4loptTj8+jG1W2Z+ldb6k5OMLU9fAkgetXK2tf1LyswXaK0/kdN9pZu32+3nBUGgAeDEjEDNt+5zVU1GACmpMp1O5xeSJDFnj6yXELcQkXntpHFHFEXrmfkui8QuIqKPW7SbeBMBpCTJoyhaYOZLM9z/+8zMzKlNuO8YladS6jYzn5Ohw2eJ6LSSSjGWWwFkLPlWNu50Oi829x7MHGS4r+wseVGyRFH0UmbeZeHv9URk9fTLwldhTQSQwqR80pFSyrylm3XZ9CARvaSE7ivn0maSFBEX4zg2C99V6hBASiiHUuqzAHBqmusm3pinXGaZ1R6NJj+Zpkm/339ur9f7rxJK4uxSAHGWbmVD890EM/9zmtuq/rUsWIrD3Cml/ggA3lm3S04BpOBRYXN5hYgXxnF8S8FdV9pdGIYvQMTUFxSr+IdDACl4WFlcXu2fnZ09cXFx8dsFd115d0ops3Rp6pxHv98/ttfrfbcqyQggBVZibm7upFar9Z8Zl1f3xHG8rsBua+NKKWUuscyl1sgjSZKNS0tLrt/pF66FAFKgpEops7DBDRk355dqrc2r794dYRj+HCJ+KSPxu4lofVXEEUAKrITNJcTs7OyzfLy8OihzFEVmPd9fSpOdiCozLisTSIHjdGqulFJfHm5gMyqGHhGtmVqAFejY5tuYIAiO63a736pAuCCAFFgFpZTZM8Ms6TnquIqIriuwy9q5Gi7MnbVz1clE9MUqJCeAFFSFubm5VqvVSt0rAxF/K47jvymoy1q6mZ+ff86BAwe+nha82U4ujmPzJvDUDwGkoBJEUXQ8M/93hrs1RNQrqMvaulFKcUbwv1mVdX0FkIKGmVLK7BP4+TR3SZI8f2lp6T8K6rK2bsIw/DoiPiclgc1EtLUKCQogBVVBKWU+HTWLUI88Zmdnj05bab2gUCrvRill7kHSXm+/johsPlMuPVcBpCCJlVIXAsDHUtx9m4ieVVB3tXajlLodAM5LSeIjRHRxFZIUQAqqglLqLQDw3hR3nyeiFxfUXa3dKKX+FAA2pyTxGSL6jSokKYAUVIUoit7OzGmPcAWQodYCSEGDrk5uhnuYp628LpdYTwIil1h1GtxFxBqG4bmIeIfcpGerKTfp2Ro1rkWn02knSZI6uSWPeZ8ouzzmbdzwz07I5ktCAJCJQgCQicLs8dS4Fu12+8QgCFK/p5ZXTQDkVZPGDX27hNatW/f0Rx999PsZreVlxTA8DRHlZUW7YdWsVllv8yJiHMdxp1lZ58vG5qtCed09n6a1aa2UMjPpZkZ95DEzM7OqySspZhUriqIHmfmUtHbywVSWijX9fRRF5zGzecY/8vBpPawjRTB7rg8Gg3/LKO8dRLShKkNAZtILrEQYhsch4jczALlNa/3qArutjSullNmizWzVNvJAxA1xHKfOJ00yYQGkYLXDMNSI2E5x++jMzMwJPl5mRVG0jZnn0ySfnZ09ZnFxMethR8FVSwF2Yj150pFS6l0A8G65zDpcgTpeXpkM5AxSMLjtdvvMIAh2ZlxGVHKh5oKlOMydzdKjiLgxjuPKrIklgJQ0IpRSXwCAX5SzyBMKKKVsF68+odfrfaOksji5lTOIk2zpRmEYXoWI12a4lu0PDhfoXiI6p4RyjOVSABlLvpWN165de1K/3zfL1vxEhnvZQOdJgWQDnRLGYmVdKqXMtyGXZAQoW7A9IZBswVbZkVxSYGEYrkHEJQv3jd3EUyn1SgD4lIUGsomnhUiNaxJFUZeZo6zEmPl3tNapE2hZPqr2+06nc2qSJPcCwOqM2GQb6KoVb1LxKKU2AsBHbPqr2gyyTcxpbcIwfAgRUxepNvbM/Cqt9SfH7a8se7lJL0vZoV+l1J0A8AqLbvqzs7PPXVxcrNRjTou4n9JEKfUZALDZkLNLRGY9scoeAkjJpQnD8GREJAB4pkVX3yKi4yzaVbaJzertB4Nn5vVa67srm4zMpE+mNEqpNwGA7aY5DxDRr04msmJ7CcMwQsSupde7iMjcxFf6kDPIhMqjlLoVAGzf4v1av9//lV6v94MJhTd2N2EYXoGIH7B09K8zMzOd7du3/49l+6k1E0AmJH273T4lCALzyPMEyy73DQaDs3bs2LHbsv3UmoVh+EFEfINlAD8ybzvHcfyPlu2n2kwAmaD8Simz3KZZdtP6QMTXxHH8t9YGE2xo7q8A4EZEPNO227ptgS2A2FZ2zHZmA8sgCG5n5p93cLXFbA5KRN9zsC3FpNPpXJwkyXssHz4cjOEaIjK51OYQQCZQqjHhOBjhVwBgKxGlLW9aejadTmeemTfbTIAeEczHieii0gMsuAMBpGBBj3RXEByHutXMvFVrbWapJ3aYhfEA4Epmdhnk24lo7cSCLbAjAaRAMScAx6Fd3BIEwU3dbvfBElMwy4S+IAiC1zKz2QP+aQ591fpdMwHEoeI2JiWcOVbsFhH/JUkSQkTzPUUh+x+a2BFxvfnWCQDmbPJdqU0dJgKzchNAshRy+L0LHMx8MyK+1qG7Q032AIC59DKrguxFxL2tVmtv2rZvc3NzqxFxVavVWm3uKxDx5cyc+Q5VRpzfD4JgvtvtZq2gOGa65ZsLIAVr7AIHAJxPRLdHUfS7zPz7AHBMwWGZCce9w5/9wzdszX7uWW/a5g6Dme8LgmBTHMdZ61/l9j0NAwGkQNVd4GDmV2utbzsYRhRFITObR6EvLTC0Sbm6s9/vb+r1et+dVIdl9yOAFKSwCxyjJgHNQtj79u17DyJeWlB4ZbvZGQTBQrfbtfk4quxYCvUvgBQgpwscNkuQDnfOfX2FzyYPMfOC1vrDBchYSRcCyJhlcYEj7z4hSqmXIeIFzHzumOEWZf4wACwsLy8v7N69+0BRTqvoRwAZoyoucACA8/fXwxceLxjCcuwYobua3g8AS/1+f6HX633H1Umd7AQQx2q5wJEkycalpaWxVw7sdDonJEli1rg9nZnPQMSTHNNINUPEZWY2C0+YvRfNbLg5c3h1CCAO5XaBAwBeR0Qfdegu02S4P6KZ0DtrOLH3jEyjlRs8AgB7EPE+RNze7XZtVmVx7KoeZgJIzjq5wMHMmyZ5IxuG4SpEPB4Rnz0YDB7/1/wfAJ49XMzOTCge9tPv9/f0er1+Tjka31wAyVFiFzgQ8ZI4jj+UoxtpWiEFBBDLYrjAAQBvmPbr6ZbpSbMRCgggFkPDBQ5EfGMcx39p4V6aVFgBASSjOC5wAMBvE9FfVLjuEpqlAgJIilAucDDzZVrrmyz1l2YVV0AAGVEgFzgA4HIiWqh4zSW8HAoIICuI5QJHExegzjGOGttUADmitC5wAMBmItra2FHicWICyCHFd4TjzUR0g8djqNGpCyDD8rrAgYhvieP4/Y0eIZ4nJ4AAmJU7XBZ1eysRvc/z8dP49L0HxAUOZn671vpPGj86JEHwGhAXOADgKiK6TsaOHwp4C4gLHMz8e1prsx6tHJ4o4CUgLnAAwLuI6I89GReS5lAB7wBxgYOZ/0Br/W4ZNf4p4BUgLnAg4tVxHP+hf0NDMjYKeAOIIxxfSpJkg9b6yzJc/FTAC0Bc4Dg4HBBRIPGTjcezbjwg48AhkHhMhg836UXAIZD4DUljzyBFwiGQ+AtJIwEpAw6BxE9IGgeIIxznA4BZ9/Y8m2EgN+42KjWjTaMAcYHj0C0IlFK3CyTNGNhFZdEYQBzhuDCO41sOFVMgKWpoNcNPIwBxhGNjHMcrLiQtkDRjcBeRRe0BcYQjczlQgaSI4VV/H7UGxBEO6xUPBZL6D/BxM6gtII5wXBbHca5F3QSScYdYve1rCYgjHFfGcfwBl3IJJC6qNcOmdoA4wjH26iMCSTMGfN4sagWIIxzviOP4+rzCrNQ+DyTykVURik/fR20AcYGjjM9kLSF5GxG9d/rllQjGVaAWgDjCcQ0RbRlXIIczyRVEdGMZ/YrPyStQC0CMLEqpawDg6hwS7QaADWXtzDriTCI7SuUoUB2a1gYQF0iY+T4Didb6f8soxqGQIOLImfky+hafk1GgVoC4QAIA24Ig2NDtdveVIekQkruJ6NYy/IvP6SpQO0AcIbmDiDZMV2rpvY4K1BIQF0iY+Wat9cY6Fklinp4CtQXEBRIAWCCiy6cnt/RcNwVqDYgjJNcT0TvqViiJdzoK1B4QF0hklns6g62OvTYCEBdIAEC2TqvjiJ1wzI0BxBESmdib8ICrW3eNAsQFEma+QGv9iboVTuKdjAKNA8QBkh8NX0n59GQkl17qpEAjAXGAZHkICdWpeBJr+Qo0FpC8kDDzN4bvbT1QvuzSQ10UaDQgeSEBgK8OzyRfrEsBJc5yFWg8IDkh2UJE5rV6OUSBxxXwAhBLSAQOgeIpCngDSAYkAofAsaICXgEyAhKBQ+AYqYB3gBwBicAhcKQq4CUgByGRG3KhI0sBbwHJEkZ+Lwp49RRLyi0KuCggZxAX1cTGGwUEEG9KLYm6KCCAuKgmNt4oIIB4U2pJ1EUBAcRFNbHxRgEBxJtSS6IuCgggLqqJjTcKCCDelFoSdVFAAHFRTWy8UUAA8abUkqiLAgKIi2pi440CAog3pZZEXRQQQFxUExtvFBBAvCm1JOqigADioprYeKOAAOJNqSVRFwUEEBfVxMYbBQQQb0otibooIIC4qCY23igggHhTaknURQEBxEU1sfFGAQHEm1JLoi4KCCAuqomNNwoIIN6UWhJ1UUAAcVFNbLxR4P8BHAwOMoxQKrMAAAAASUVORK5CYII= // @match https://changjiang.yuketang.cn/*/exercise/* // @match https://changjiang-exam.yuketang.cn/exam/* // @match https://changjiang.yuketang.cn/* // @match https://www.xuetangx.com/*/exercise/* // @match https://mooc1.chaoxing.com/work/doHomeWorkNew* // @match https://examination.xuetangx.com/exam/* // @match https://onlineexamh5new.zhihuishu.com/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant GM_addElement // @run-at document-end // @namespace http://tampermonkey.net/ // ==/UserScript== (function() { const order = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'] const n = 10 const wait = 3 // s const configs = { 'onlineexamh5new.zhihuishu.com': { main: '.examPaper_subject', // 答案要展示的父级元素节点,会append到该Node下 question: '.subject_describe', // 问题,题目所在位置,其innerText属性是问题(不含选项) options: '.subject_node p span, .node_detail p', // 每个选项的位置,会根据它匹配多个Node select: 'onChecked', // 点击后,相应属性增加值,因为有的选项需要多次点击,所以增加此用于判断是否点击上 // 一些自定义添加的答案区域style style: ` background-color: #f5f5f5; height: 200px; overflow-y: scroll; ` }, 'changjiang.yuketang.cn': { main: '.item-body', // 答案要展示的父级元素节点,会append到该Node下 question: '.problem-body', // 问题,题目所在位置,其innerText属性是问题(不含选项) options: '.item-body ul li label', // 每个选项的位置,会根据它匹配多个Node select: 'is-checked', // 点击后,相应属性增加值,因为有的选项需要多次点击,所以增加此用于判断是否点击上 // 一些自定义添加的答案区域style style: ` background-color: #f5f5f5; ` }, 'changjiang-exam.yuketang.cn': { main: '.item-body', question: 'h4', options: '.item-body ul li label', select: 'is-checked', style: ` background-color: #f5f5f5; height: 200px; overflow-y: scroll; ` }, 'www.xuetangx.com': { main: '.courseActionLesson', question: '.leftQuestion', options: '.leftradio', select: 'active', style: ` background-color: #fcfcfc; border: 1px solid hsla(0,0%,81.2%,.31); width: 500px; height: 200px; overflow-y: scroll; ` }, 'mooc1.chaoxing.com': { main: '.TiMu', question: '.Zy_TItle div p', options: 'ul li', select: 'Hover', style: ` background-color: #fcfcfc; height: 200px; overflow-y: scroll; ` }, 'examination.xuetangx.com': { main: '.subject-item', question: '.item-body', options: 'ul li', select: 'is-checked', style: ` background-color: #fcfcfc; 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 cookieSet = () => { GM_xmlhttpRequest({ method: 'POST', url: 'https://tiku.fenbi.com/android/tourist/enter', responseType: 'json', onload: (xhr) => { const data = xhr.response let cookie = `userid=${data.userId}; tourist=${data.touristToken};` console.log(cookie) } }) } let clickOption = (optionNodes, text) => { optionNodes.forEach((optionNode) => { let option_text = optionNode.innerText.replaceAll('[p]', '').replaceAll('[/p]', '').split('\n').slice(-1) console.log(option_text, text) if (option_text.includes(text)||text.includes(option_text)) { let id = setInterval(() => { if (!optionNode.innerHTML.includes(config.select)) { optionNode.click() } else { clearInterval(id) } }, 3000) } }) } let answerParser = (data, answerNode, optionNodes, mainNode) => { let s = '' let answer_groups = [] for (let i=0;i<n;i++) { let item = data['questionList'][i] // 1 题目 s += item['content'].replaceAll('[', '<').replaceAll(']', '>') + '<br/>' const re = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?%+_]", 'g'); let same = item['content'].replaceAll(re, '').includes(mainNode.getAttribute('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')) }) if (item['accessories'].length > 0 && item['accessories'][0]['options'].length > 0) { let options = item['accessories'][0]['options'] for (let j=0;j<options.length;j++) { let option = options[j].replace('[p]', '').replace('[/p]', '') 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]}] ` + option + '</b><br/>' } else { s += `[${order[j]}] ` + option + '<br/>' } } } } } // 2.2 文字描述形式 } else if (item['correctAnswer'].hasOwnProperty('answer')) { let 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/>' } } // 判断是否为多选 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 }) } 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 } let searchAnswer = (text, answerNode, optionNodes, mainNode) => { GM_xmlhttpRequest({ method: 'POST', url: 'https://schoolapi.fenbi.com/college/android/search-item/search?format=ubb&searchType=2&text=' + encodeURIComponent(text), responseType: 'json', onload: (xhr) => { let res = xhr.response let enc = res['data'] if (enc == null) { if (res.errMessage.includes('次数')) { cookieSet() } answerNode.innerHTML = xhr.response.errMessage setTimeout(() => { mainNode.setAttribute('currentQuestion', '') }, wait * 1000); return } // 解密 let t = new Date().valueOf() GM_xmlhttpRequest({ method: 'POST', url: `http://101.35.131.22:5500/decrypt`, headers: { "Content-Type": "application/x-www-form-urlencoded" }, data: `enc=${enc}`, responseType: 'text', onload: (xhr) => { let data = JSON.parse(xhr.responseText) answerParser(data, answerNode, optionNodes, mainNode) } }) }, ontimeout: function () { answer.innerHTML = "No Sugesstion" } }) } cookieSet() let id = setInterval(() => { let mainNodes = document.querySelectorAll(config.main) if (mainNodes.length == 0) return clearInterval(id) mainNodes.forEach(function(mainNode) { mainNode.setAttribute('currentQuestion', '') setInterval(() => { let questionNode = mainNode.querySelector(config.question) if (questionNode == null) return let text = questionNode.innerText.slice(0, 233) if (text == mainNode.getAttribute('currentQuestion')) return mainNode.setAttribute('currentQuestion', text) let answerNode = mainNode.querySelector('.answer-polygon') if (answerNode == null) { answerNode = document.createElement('div') answerNode.setAttribute('class', 'answer-polygon') mainNode.append(answerNode) } try { answerNode.innerHTML = 'searching...' } catch { return } let optionNodes = mainNode.querySelectorAll(config.options) searchAnswer(text, answerNode, optionNodes, mainNode) }, 6000) }) }, 233) })();