您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Use www.langlib.com/Mokao/TOEFL without having an account. (tips: right-click + "open in new tab" on a practice link to enter it)
// ==UserScript== // @name Langlib TPO local data store // @version 0.0.0 // @description Use www.langlib.com/Mokao/TOEFL without having an account. (tips: right-click + "open in new tab" on a practice link to enter it) // @match *://www.langlib.com/Mokao/TOEFL/Test/* // @match *://www.langlib.com/Mokao/TOEFL/Answer/* // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant unsafeWindow // @run-at document-start // @namespace https://greasyfork.org/users/410786 // ==/UserScript== new MutationObserver(function(mutations, observer) { if(unsafeWindow.$ === undefined || unsafeWindow.$.ajax === undefined) return observer.disconnect() unsafeWindow.$.oldAjax= unsafeWindow.$.ajax unsafeWindow.$.ajax=function(){ if(arguments[0] && arguments[0].success){ const option=arguments[0] if(option.url==="/Mokao/TOEFL/InitTPOUserAnswer") { option.oldSuccess = option.success option.success=function(response, textStatus, xhr){ const {tpoIndex} = JSON.parse(option.data) const storeKey='data_' + tpoIndex const data=GM_getValue(storeKey) if(data===undefined){ response.forEach(function(it) { it.UA="" }) GM_setValue(storeKey, JSON.stringify(response)) } else response = JSON.parse(data) return option.oldSuccess(response, textStatus, xhr) } } else if(option.url==="/Mokao/TOEFL/SaveTPOUserAnswer") { const {answer, questNo, section, tpoIndex} = JSON.parse(option.data) const storeKey="data_" + tpoIndex let data=GM_getValue(storeKey) if(data!==undefined){ data=JSON.parse(data) data.find( function(it){ return it.S===section && it.QN===questNo } ).UA=answer GM_setValue(storeKey, JSON.stringify(data)) }else{ console.error("Unexpected error | option=", option) } } else if(option.url==="/Mokao/TOEFL/ReWriteTPOUserRecord") { const {tpoIndex, section} = JSON.parse(option.data) const storeKey="data_" + tpoIndex GM_deleteValue(storeKey) option.success('success') } } return unsafeWindow.$.oldAjax(...arguments) } }).observe(unsafeWindow.document, { childList: true, subtree: true })