Remove all bots from the player join screen. Simply start a kahoot game and watch as all bots get killed.
目前為
// ==UserScript==
// @name Kahoot AntiBot
// @namespace http://tampermonkey.net/
// @version 1.6.1
// @description Remove all bots from the player join screen. Simply start a kahoot game and watch as all bots get killed.
// @author theusaf
// @match *://play.kahoot.it/*
// @grant none
// ==/UserScript==
var waterMark = document.createElement("p");
waterMark.innerText = "v1.6.1 @theusaf";
waterMark.style = "position: fixed; bottom: 100px; right: 100px; font-size: 1em";
document.body.append(waterMark);
window.isUsingNamerator = false;
window.restartTester = setInterval(()=>{
let playerList = document.getElementsByClassName("player-list")[0];
if(playerList && !ready){
setup3();
}
ready = false;
},1000);
window.ready = false;
function checkSettings(){
var name = document.querySelectorAll("[data-functional-selector=\"game-settings-namerator-toggle\"]")[0];
isUsingNamerator = Array.from(name.classList).includes("on");
let observer = new MutationObserver(function(button){
isUsingNamerator = Array.from(button[0].target.classList).includes("on");
});
let conf = {
attributes: true
};
observer.observe(name,conf);
}
window.similarity = function (s1, s2) {
if(!isNaN(s2) && !isNaN(s1) && s1.length == s2.length){
return 1;
}
if(isUsingNamerator){
let caps = s2.length - s2.replace(/[A-Z]/g, '').length;
if(caps !== 2){
return 1;
}
if (s2.substr(0,1).replace(/[A-Z]/g,'').length == 1){
return 1;
}
if (s2.replace(/[0-9]/g,'').length < s2.length){ //has Numbers
return 1;
}
}
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
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.test_leaderboard = function (mu,observer){
if(document.getElementsByTagName("iframe")[1].contentDocument.querySelectorAll("[data-functional-selector=\"highscores\"]").length > 0){
if(document.getElementsByTagName("iframe")[1].contentDocument.querySelectorAll("[data-functional-selector=\"highscores\"]")[0].querySelectorAll("[data-functional-selector=\"player-name\"]").length == 0){
return;
}
}else{
return;
}
let players = document.getElementsByTagName("iframe")[1].contentDocument.querySelectorAll("[data-functional-selector=\"highscores\"]")[0].querySelectorAll("[data-functional-selector=\"player-name\"]");
for(let i in players){
if(cachedLeaderboard.length == 0){
cachedLeaderboard.push({element:players[i],text:players[i].innerText,clicked:false});
continue;
}
for(let k in cachedLeaderboard){
if(cachedLeaderboard[k].text == players[i].innerText){
continue;
}
if(confirmedPlayers.includes(cachedLeaderboard[k].text)){
continue;
}
if(similarity(cachedLeaderboard[k].text,players[i].innerText) >= 0.60){
if(confirmedPlayers.includes(players[i].innerText)){
break;
}
players[i].click();
if(!cachedLeaderboard[k].clicked){
if(confirmedPlayers.includes(cachedLeaderboard[k].text)){
break;
}
cachedLeaderboard[k].element.click();
cachedLeaderboard[k].clicked = true;
}
break;
}
}
if(cachedLeaderboard.filter(function(item){return item.text == players[i].innerText}).length === 0){
cachedLeaderboard.push({element:players[i],text:players[i].innerText,clicked:false});
}
}
}
window.setup1 = function (){
setInterval(test_leaderboard,1000);
var launch_button = document.querySelectorAll("[data-functional-selector=\"launch-button\"]")[0];
if(launch_button){
console.warn("launch button found!");
setup2();
checkSettings();
}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 (){
ready = true;
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.cachedLeaderboard = [];
window.timer = setInterval(function(){
for(let i in cachedUsernames){
if(cachedUsernames[i].time <= 0 && !cachedUsernames[i].clicked && !confirmedPlayers.includes(cachedUsernames[i].text)){
confirmedPlayers.push(cachedUsernames[i].text);
continue;
}
if(cachedUsernames[i].time <= -20){
cachedUsernames.splice(i,1);
continue;
}
cachedUsernames[i].time--;
}
},1000);
window.confirmedPlayers = []; //confirmed players.
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){
let beaned = false;
if(cachedUsernames.length == 0){
cachedUsernames.push({element:players[i],text:players[i].innerText,clicked:false,time:10});
continue;
}
for(let k in cachedUsernames){
if(cachedUsernames[k].element == players[i]){
continue;
}
if(confirmedPlayers.includes(cachedUsernames[k].text)){
continue;
}
if(similarity(cachedUsernames[k].text,players[i].innerText) >= 0.60){
if(confirmedPlayers.includes(players[i].innerText)){
break;
}
players[i].click();
beaned = true;
if(!cachedUsernames[k].clicked){
if(confirmedPlayers.includes(cachedUsernames[k].text)){
break;
}
cachedUsernames[k].element.click();
cachedUsernames[k].clicked = true;
}
break;
}
}
if(cachedUsernames.filter(function(item){return item.text == players[i].innerText}).length === 0 && !beaned){
cachedUsernames.push({element:players[i],text:players[i].innerText,clicked:false,time:10});
}
}
};