您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Remove all bots from the player join screen. Simply start a kahoot game and watch as all bots get killed. Does not work on leaderboards currently.
当前为
// ==UserScript== // @name Kahoot AntiBot // @namespace http://tampermonkey.net/ // @version 1.1 // @description Remove all bots from the player join screen. Simply start a kahoot game and watch as all bots get killed. Does not work on leaderboards currently. // @author theusaf // @match *://play.kahoot.it/* // @grant none // ==/UserScript== window.similarity = function (s1, s2) { if(!isNaN(s2) && !isNaN(s1)){ return 1; } var longer = s1; var shorter = s2; if (s1.length < s2.length) { longer = s2; shorter = s1; } var longerLength = longer.length; if (longerLength == 0) { return 1.0; } return (longerLength - editDistance(longer, shorter)) / parseFloat(longerLength); } window.editDistance = function (s1, s2) { s1 = s1.toLowerCase(); s2 = s2.toLowerCase(); var costs = new Array(); for (var i = 0; i <= s1.length; i++) { var lastValue = i; for (var j = 0; j <= s2.length; j++) { if (i == 0){ costs[j] = j; } else { if (j > 0) { var newValue = costs[j - 1]; if (s1.charAt(i - 1) != s2.charAt(j - 1)){ newValue = Math.min(Math.min(newValue, lastValue),costs[j]) + 1; } costs[j - 1] = lastValue; lastValue = newValue; } } } if (i > 0){ costs[s2.length] = lastValue; } } return costs[s2.length]; } window.setup1 = function (){ var launch_button = document.querySelectorAll("[data-functional-selector=\"launch-button\"]")[0]; if(launch_button){ console.warn("launch button found!"); launch_button.addEventListener("click",setup2); }else{ setTimeout(setup1,1000); } } window.setup2 = function (){ var start_button = document.querySelectorAll("[data-functional-selector=\"start-button\"]")[0]; if(start_button){ console.warn("start button found!"); setup3(); }else{ setTimeout(setup2,1000); } } window.setup3 = function (){ let playerList = document.getElementsByClassName("player-list")[0]; let conf = { childList: true, subtree: true }; let observer = new MutationObserver(kill_bots); observer.observe(playerList,conf); } window.onload = setup1; window.cachedUsernames = []; window.kill_bots = function (e,observer){ console.warn("determining evil now. be warned."); if(document.getElementsByClassName("player-list").length == 0){ observer.disconnect(); return; } let players = document.querySelectorAll("[data-functional-selector=\"player\"]"); for(let i in players){ if(cachedUsernames.length == 0){ cachedUsernames.push({element:players[i],text:players[i].innerText,clicked:false}); continue; } for(let k in cachedUsernames){ if(cachedUsernames[k].element == players[i]){ continue; } if(similarity(cachedUsernames[k].text,players[i].innerText) >= 0.60){ players[i].click(); if(!cachedUsernames[k].clicked){ cachedUsernames[k].element.click(); cachedUsernames[k].clicked = true; } break; } } cachedUsernames.push({element:players[i],text:players[i].innerText,clicked:false}); } };