您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Win micromatch in less than a second! This is based off of the original script by Danielv123, but far upgraded
// ==UserScript== // @name Updated Quizlet Micromatch bot // @namespace BenjaminHinchliff // @version 0.3 // @description Win micromatch in less than a second! This is based off of the original script by Danielv123, but far upgraded // @author Benjamin Hinchliff // @match https://quizlet.com/*/match* // @grant none // ==/UserScript== // modify this to change the total delay of all the clicking const delay = 0.5; // artificial slowing of the delay (in ms) to because Quizlet's timer starts late sometimes const delayEpsilon = 10; // a little function to allow the program to click on elements function clickEvent(element) { let eve = new CustomEvent("pointerdown", { bubbles: true }); element.dispatchEvent(eve); } function getTerms() { // eslint-disable-next-line no-undef let rawTerms = Quizlet.matchModeData.terms; let terms = {}; for (const term of rawTerms) { terms[term.word] = term.definition; } return terms } // only works if 1 solve per load (which is true rn) let solving = false; // try to run on load or click function solveMatch(terms) { // get all the nodes (and convert to array) let nodes = document.querySelector(".MatchModeQuestionGridBoard-tiles")?.childNodes; if (!nodes) { return; } // prevent multiple execution if (solving) { return; } solving = true; nodes = Array.from(nodes); const perElementDelay = ((delay * 1000) / nodes.length) + delayEpsilon; for (let i = 0, len = nodes.length; i < len; i += 1) { const node = nodes[i]; // get term let search = node.firstChild?.firstChild?.firstChild?.firstChild?.innerHTML; // match with definition let dictionaryResult = terms[search]; if(dictionaryResult) { // find term in nodes and send click events const targetNode = nodes.find((node) => node.innerHTML.includes(dictionaryResult)); if (targetNode !== undefined) { setTimeout(() => { clickEvent(node.firstChild); clickEvent(targetNode.firstChild); }, perElementDelay * i); } } } } const terms = getTerms(); solveMatch(terms); // probably really slow but who cares let observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (!mutation.addedNodes) { return; } solveMatch(terms); }) }); // tbd whether this is smart or just really dumb observer.observe(document.body, { childList: true, subtree: true, attributes: false, characterData: false, });