Speedtest by Ookla fake Mbps

Fake your Speedtest by Ookla Mbps values! If this gets enough installs i will update it!

// ==UserScript==
// @name         Speedtest by Ookla fake Mbps
// @namespace    http://tampermonkey.net/
// @version      2024-12-27
// @description  Fake your Speedtest by Ookla Mbps values! If this gets enough installs i will update it!
// @author       DominusGabi
// @match        https://www.speedtest.net/run
// @icon         https://www.google.com/s2/favicons?sz=64&domain=speedtest.net
// @grant        none
// @license MIT
// ==/UserScript==

//---MAX-AND-MIN-MBPS-----

var max = 10000
var min = 8000

//-------------------------

var checkLoad = setInterval(function(){
    if(document.querySelector('.connecting-message').style.opacity==0){
        start()
        clearInterval(checkLoad)
    }
})


var number = parseFloat((Math.random()*(max-min)+min).toFixed(2))
function updateNumber(){
    var changeNumber = parseFloat(Math.random().toFixed(2))
    if(Math.random()>.99) changeNumber*=5
    if(Math.random()>.5) number+=changeNumber
    else number-=changeNumber
}

var next = 0;
function nextf() {
    if(!next){
        next=1
        number = parseFloat((Math.random()*(max-min)+min).toFixed(2))
    }
}

function start() {
    setInterval(function(){
        updateNumber()
        setMbps(parseFloat(number.toFixed(2)))
    },100)
    var updateUploadTxt = setInterval(function(){
        if(document.querySelector('.download-speed').innerHTML!="—"){
            clearInterval(updateUploadTxt)
            document.querySelector('.download-speed').innerHTML=number
        }
    },100)
    var downloadUploadTxt = setInterval(function(){
        if(document.querySelector('.upload-speed').innerHTML!="—"){
            clearInterval(downloadUploadTxt)
            document.querySelector('.upload-speed').innerHTML=number
        }
    },100)
}




window.setMbps = function(newMbps){

    var stage = "download"

    if(!document.querySelectorAll('.result-item')[3].classList.contains('inactive')){
        stage = "upload"
        nextf()
    }


    var speedTxtC = document.querySelector('.gauge-speed-text')
    var speedNeedleC = document.querySelector('.gauge-speed-needle')
    var gradientC = document.querySelector('.gauge-speed-arc')

    var speedTxt = speedTxtC.cloneNode()
    var speedNeedle = speedNeedleC.cloneNode()
    var gradient = gradientC.cloneNode()

    speedTxtC.parentElement.appendChild(speedTxt)
    speedNeedleC.parentElement.appendChild(speedNeedle)
    gradientC.parentElement.appendChild(gradient)

    speedNeedle.innerHTML=speedNeedleC.innerHTML
    speedNeedle.style.opacity="1"

    speedTxtC.remove()
    speedNeedleC.remove()
    gradientC.remove()


    var speedIncrements = [0, 1, 5, 10, 20, 30, 50, 75, 100]
    var speedDegrees = [-132, -99, -66, -33, 0, 33, 66, 99, 132]
    function _convertSpeedToDegrees(e, t, n) {
        var r = n.length;
        if (e >= t[r - 1])
            return n[r - 1];
        for (var i = 1; i < r; i++)
            if (e < t[i]) {
                var o = t[i - 1]
                , a = t[i]
                , s = n[i - 1];
                return (e - o) / (a - o) * (n[i] - s) + s
            }
        return n[r - 1]
    }

    let arcImg = {
        download: {
            multi: $(".gauge-speed-arc-img-dl-multi").get(0),
            single: $(".gauge-speed-arc-img-dl-single").get(0)
        },
        upload: {
            multi: $(".gauge-speed-arc-img-ul-multi").get(0),
            single: $(".gauge-speed-arc-img-ul-single").get(0)
        }
    }
    let arc = {
        arc: $("#arc-background"),
        bigcircle: $("#big-circle"),
        circleko: $("#circle-knockout"),
        arcko: $("#arc-knockout"),
        propsCircleToArc: false ? {
            scaleX: [1, 1],
            opacity: [1, 0]
        } : {
            scaleX: [1, 0],
            opacity: [1, 1]
        },
        propsArcToCircle: false ? {
            scaleX: [1, 1],
            opacity: [0, 1]
        } : {
            scaleX: [0, 1],
            opacity: [1, 1]
        },
        smallo: 1,
        bigo: .5,
        ringmaskstart: 0,
        ringmaskend: 308 / 2 - 308/12,
        yellow: "#fff38e",
        blue: "#232f4e"
    }

    var gradientctx = gradient.getContext("2d")

    var speedIncrements = [0, 1, 5, 10, 20, 30, 50, 75, 100]
    var speedDegrees = [-132, -99, -66, -33, 0, 33, 66, 99, 132]
    var radiansStart = (speedDegrees[0] - 90) * Math.PI / 180

    function isImageLoaded(e) {
        return !!e.complete && (void 0 === e.naturalWidth || 0 !== e.naturalWidth)
    }

    function _drawGradient(e){
        var n = radiansStart
        var r = (e - 90) * Math.PI / 180
        var i = gradientctx;
        i.clearRect(0, 0, gradient.width, gradient.height)
        i.save()
        i.beginPath()
        i.arc(gradient.width / 2, gradient.height / 2, gradient.width / 2, n, r)
        i.lineTo(gradient.width / 2, gradient.height / 2)
        i.clip();
        var o = arcImg[stage][OOKLA.globals.configs.connections.mode]
        var a = function() {
            i.drawImage(o, 0, 0, gradient.width, gradient.height)
            i.restore()
        }
        isImageLoaded(o) ? a() : o.onload = a
    }



    function setMbpsTxt(x){
        var speedTxtctx = speedTxt.getContext('2d')
        var gradient = document.querySelector('.gauge-speed-arc')
        var fontGuage = '80px gauge-mono, Montserrat, Montserrat-Fixed, Avenir, "Avenir Next LT Pro", Corbel, "URW Gothic", source-sans-pro, sans-serif'

        speedTxtctx.font = fontGuage
        speedTxtctx.textAlign = "center"
        speedTxtctx.textBaseline = "bottom"
        speedTxtctx.fillStyle = "white"
        speedTxtctx.save()
        speedTxtctx.clearRect(0, 0, gradient.width,  gradient.height)
        speedTxtctx.fillText(x, gradient.width / 2, gradient.height - gradient.height / 7.8)
        speedTxtctx.restore()
    }
    function setMbpsNeedle(x){
        var valueDeg = _convertSpeedToDegrees(x,speedIncrements,speedDegrees)
        speedNeedle.style.transform=`rotateZ(${valueDeg}deg)`
    }
    window.setMbpsArc = function(x){

        _drawGradient(_convertSpeedToDegrees(x,speedIncrements,speedDegrees))
    }




    setMbpsTxt(newMbps)
    setMbpsNeedle(newMbps)
    setMbpsArc(newMbps)

}