Discord Auto Register - Simple

Tự động tạo tài khoản Discord - Get Token, Mở Mail, Copy Email

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Discord Auto Register - Simple
// @namespace    http://tampermonkey.net/
// @version      15.5
// @description  Tự động tạo tài khoản Discord - Get Token, Mở Mail, Copy Email
// @match        https://discord.com/register*
// @match        https://discord.com/channels/*
// @match        https://discord.com/verify*
// @grant        GM_xmlhttpRequest
// @grant        GM_openInTab
// @connect      email.devtai.net
// @connect      localhost
// @connect      click.discord.com
// ==/UserScript==

(async () => {
    'use strict';

    const CFG = {
        SERVER: 'http://localhost:5000',
        PASS: '939945729',
        API: 'https://email.devtai.net/api',
        DOMAINS: ['epmtyfl.me', 'sptech.io.vn'],
        INTERVAL: 5000,
        MAX: 24
    };

    const state = { email: '', user: '', count: 0, checking: false, panelOpen: true };
    const sleep = ms => new Promise(r => setTimeout(r, ms));
    const $ = s => document.querySelector(s);
    const $$ = s => document.querySelectorAll(s);

    // Toast notification
    const toast = (msg, color = '#3b82f6') => {
        const el = document.createElement('div');
        el.style.cssText = `position:fixed;bottom:80px;right:20px;background:${color};color:#fff;padding:12px 20px;border-radius:10px;font:600 13px Inter,sans-serif;box-shadow:0 4px 12px rgba(0,0,0,.3);z-index:999999;opacity:0;transition:all .3s;cursor:pointer;`;
        el.textContent = msg;
        document.body.appendChild(el);
        requestAnimationFrame(() => el.style.opacity = '1');
        el.onclick = () => el.remove();
        setTimeout(() => el.remove(), 4000);
    };

    const success = msg => toast(msg, '#10b981');
    const error = msg => toast(msg, '#ef4444');
    const info = msg => toast(msg, '#3b82f6');

    // API call
    const api = (method, url, data) => new Promise(resolve => {
        GM_xmlhttpRequest({
            method, url,
            headers: { 'Content-Type': 'application/json' },
            data: data ? JSON.stringify(data) : undefined,
            timeout: 10000,
            onload: r => {
                try { resolve({ ok: true, data: JSON.parse(r.responseText) }); }
                catch { resolve({ ok: false }); }
            },
            onerror: () => resolve({ ok: false }),
            ontimeout: () => resolve({ ok: false })
        });
    });

    // Gen username & email
    const genUsername = () => `royarontop_${Math.floor(Math.random() * 1000000)}`;
    const genEmail = () => {
        const d = CFG.DOMAINS[~~(Math.random() * CFG.DOMAINS.length)];
        const s = Array(8).fill().map(() => 'abcdefghijklmnopqrstuvwxyz0123456789'[~~(Math.random() * 36)]).join('');
        const p = ~~(Math.random() * (s.length + 1));
        return `${s.slice(0, p)}royar${s.slice(p)}@${d}`;
    };

    // Lấy token Discord
    const getToken = () => {
        try {
            const t = (webpackChunkdiscord_app.push([[''], {}, e => { m = []; for (let c in e.c) m.push(e.c[c]); }]), m)
                .find(m => m?.exports?.default?.getToken !== void 0).exports.default.getToken();
            if (t) return t;
        } catch { }
        for (let k in localStorage) {
            if (k.includes('token')) {
                const v = localStorage[k];
                if (typeof v === 'string' && v.length > 50) return v.replace(/\"/g, '');
            }
        }
        return null;
    };

    // Extract link verify từ email
    const extractLink = (txt, html) => {
        const m1 = txt.match(/https:\/\/click\.discord\.com\/ls\/click\?upn=[^\s\n]+/);
        if (m1) return m1[0];
        const m2 = html.match(/href="(https:\/\/click\.discord\.com\/ls\/click\?upn=[^"]+)"/);
        return m2 ? m2[1].replace(/&/g, '&') : null;
    };

    // Check email để lấy link verify
    const checkEmail = async () => {
        if (state.checking || !state.email) return;
        state.checking = true;
        state.count++;

        try {
            const r = await api('GET', `${CFG.API}/email/${state.email}`);
            if (r.ok && r.data?.length > 0) {
                const msg = r.data.find(m => m.fromAddress?.includes('discord.com') && 
                    (m.subject?.includes('Verify') || m.subject?.includes('Xác')));

                if (msg) {
                    const full = await api('GET', `${CFG.API}/inbox/${msg.id}`);
                    if (full.ok) {
                        const link = extractLink(full.data.textContent || '', full.data.htmlContent || '');
                        if (link) {
                            let token = getToken();
                            for (let i = 0; !token && i < 3; i++) {
                                await sleep(500);
                                token = getToken();
                            }
                            if (token) {
                                await api('POST', `${CFG.SERVER}/api/save-token`, {
                                    email: state.email, username: state.user, password: CFG.PASS, token, verified: false
                                });
                            }
                            localStorage.setItem('v_link', link);
                            localStorage.setItem('v_progress', 'true');
                            localStorage.setItem('v_email', state.email);
                            localStorage.setItem('v_user', state.user);
                            success('✅ Đã lấy link verify!');
                            window.open(link, '_blank');
                            return;
                        }
                    }
                }
            }
            if (state.count < CFG.MAX) setTimeout(checkEmail, CFG.INTERVAL);
        } catch {
            if (state.count < CFG.MAX) setTimeout(checkEmail, CFG.INTERVAL);
        } finally {
            state.checking = false;
        }
    };

    // Fill form đăng ký
    const setInput = (el, val) => {
        if (!el) return;
        Object.getOwnPropertyDescriptor(el.__proto__, 'value').set.call(el, val);
        el.dispatchEvent(new Event('input', { bubbles: true }));
    };

    const selectDD = async (sel, txt) => {
        const dd = $(sel);
        if (!dd) return false;
        dd.click();
        await sleep(500);
        const opt = Array.from($$('div[role="option"]')).find(o => o.textContent.trim().toLowerCase() === txt.toLowerCase());
        if (opt) { opt.click(); return true; }
        return false;
    };

    const fillDOB = async () => {
        await selectDD('div[aria-label="Ngày"]', (1 + ~~(Math.random() * 28)).toString());
        await sleep(300);
        await selectDD('div[aria-label="Tháng"]', `tháng ${1 + ~~(Math.random() * 12)}`);
        await sleep(300);
        await selectDD('div[aria-label="Năm"]', (1990 + ~~(Math.random() * 16)).toString());
    };

    const startReg = async () => {
        state.email = genEmail();
        state.user = genUsername();
        localStorage.setItem('p_email', state.email);
        localStorage.setItem('p_user', state.user);
        await sleep(500);
        setInput($('input[type="email"]'), state.email);
        setInput($('input[aria-label="Tên hiển thị"]'), 'royar on top');
        setInput($('input[aria-label="Tên đăng nhập"]'), state.user);
        setInput($('input[aria-label="Mật khẩu"]'), CFG.PASS);
        await fillDOB();
    };

    // Xóa dữ liệu & tạo acc mới
    const clearData = async () => {
        localStorage.clear();
        sessionStorage.clear();
        document.cookie.split(';').forEach(c => {
            const n = c.split('=')[0].trim();
            document.cookie = `${n}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;domain=.discord.com`;
        });
        if (window.indexedDB) {
            const dbs = await window.indexedDB.databases();
            await Promise.all(dbs.map(db => db.name ? window.indexedDB.deleteDatabase(db.name) : null));
        }
        success('🗑️ Đã xóa dữ liệu!');
    };

    const newAcc = async () => {
        await clearData();
        localStorage.removeItem('v_done');
        window.location.href = 'https://discord.com/register';
    };

    // Verify
    const verify = async () => {
        if (localStorage.getItem('v_progress') !== 'true') return;
        const email = localStorage.getItem('v_email');
        const user = localStorage.getItem('v_user');
        if (!email) return;
        info('⏳ Đang verify...');
        const check = setInterval(async () => {
            const txt = document.body.textContent;
            if (txt.includes('phone') || txt.includes('điện thoại')) {
                clearInterval(check);
                error('📱 Yêu cầu SĐT. Bỏ qua!');
                localStorage.removeItem('v_progress');
                setTimeout(() => window.location.href = 'https://discord.com/channels/@me', 2000);
                return;
            }
            if (txt.includes('Đã Được Xác Nhận') || txt.includes('Verified')) {
                clearInterval(check);
                success('✅ Verify thành công!');
                await api('POST', `${CFG.SERVER}/api/update-verified`, { email, username: user, password: CFG.PASS, verified: true });
                localStorage.setItem('v_done', 'true');
                localStorage.removeItem('v_progress');
                await sleep(1500);
                window.location.href = 'https://discord.com/channels/@me';
            }
        }, 800);
        setTimeout(() => clearInterval(check), 30000);
    };

    const channels = async () => {
        if (localStorage.getItem('v_done') === 'true') return;
        const email = localStorage.getItem('p_email') || localStorage.getItem('v_email');
        const user = localStorage.getItem('p_user') || localStorage.getItem('v_user');
        if (!email) return;
        state.email = email;
        state.user = user;
        state.count = 0;
        state.checking = false;
        setTimeout(checkEmail, 2000);
    };

    // Toggle panel
    const togglePanel = () => {
        state.panelOpen = !state.panelOpen;
        const content = $('#panel-content');
        const toggle = $('#panel-toggle');
        
        if (state.panelOpen) {
            content.style.maxHeight = '500px';
            content.style.opacity = '1';
            content.style.padding = '12px';
            toggle.textContent = '▼';
        } else {
            content.style.maxHeight = '0';
            content.style.opacity = '0';
            content.style.padding = '0 12px';
            toggle.textContent = '▲';
        }
    };

    // Panel UI
    const panel = () => {
        const p = document.createElement('div');
        const isC = location.pathname.includes('/channels/');
        const email = localStorage.getItem('p_email') || localStorage.getItem('v_email') || '';
        const user = localStorage.getItem('p_user') || localStorage.getItem('v_user') || '';
        
        p.id = 'control-panel';
        p.innerHTML = `
            <div id="panel-header" style="display:flex;justify-content:space-between;align-items:center;padding:10px 12px;background:linear-gradient(135deg,#667eea,#764ba2);border-radius:12px 12px 0 0;cursor:pointer;user-select:none;">
                <div style="font:700 13px Inter,sans-serif;color:#fff;text-shadow:0 1px 3px rgba(0,0,0,.3);display:flex;align-items:center;gap:6px;">
                    <span>🦈</span>
                    <span>ROYAR Reg</span>
                </div>
                <button id="panel-toggle" style="background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.3);color:#fff;width:24px;height:24px;border-radius:6px;cursor:pointer;font:700 12px Inter,sans-serif;transition:all .3s;">▼</button>
            </div>
            <div id="panel-content" style="max-height:500px;opacity:1;overflow:hidden;transition:all .4s;padding:12px;background:rgba(255,255,255,.95);border-radius:0 0 12px 12px;">
                ${isC ? `
                    <div style="background:linear-gradient(135deg,#10b981,#34d399);padding:8px 10px;border-radius:8px;margin-bottom:10px;color:#fff;font:600 11px Inter,sans-serif;box-shadow:0 2px 8px rgba(16,185,129,.3);">
                        <div style="margin-bottom:3px;word-break:break-all;">📧 ${email || '-'}</div>
                        <div>👤 ${user || '-'}</div>
                    </div>
                    <button id="btn-token" style="width:100%;padding:8px;margin-bottom:6px;background:linear-gradient(135deg,#f59e0b,#fbbf24);color:#fff;border:none;border-radius:8px;font:700 12px Inter,sans-serif;cursor:pointer;box-shadow:0 2px 8px rgba(245,158,11,.3);transition:all .2s;">
                        🔑 Get Token
                    </button>
                    <button id="btn-open-mail" style="width:100%;padding:8px;margin-bottom:6px;background:linear-gradient(135deg,#8b5cf6,#a78bfa);color:#fff;border:none;border-radius:8px;font:700 12px Inter,sans-serif;cursor:pointer;box-shadow:0 2px 8px rgba(139,92,246,.3);transition:all .2s;">
                        📬 Mở Mail
                    </button>
                    <button id="btn-copy-email" style="width:100%;padding:8px;margin-bottom:6px;background:linear-gradient(135deg,#06b6d4,#22d3ee);color:#fff;border:none;border-radius:8px;font:700 12px Inter,sans-serif;cursor:pointer;box-shadow:0 2px 8px rgba(6,182,212,.3);transition:all .2s;">
                        📋 Lấy Mail
                    </button>
                ` : ''}
                <button id="btn-start" style="width:100%;padding:10px;background:linear-gradient(135deg,#3b82f6,#60a5fa);color:#fff;border:none;border-radius:8px;font:700 12px Inter,sans-serif;cursor:pointer;box-shadow:0 3px 10px rgba(59,130,246,.4);transition:all .2s;">
                    ${isC ? '🔄 Reset' : '▶️ Bắt Đầu'}
                </button>
            </div>
        `;

        p.style.cssText = 'position:fixed;bottom:15px;right:15px;z-index:999998;font-family:Inter,sans-serif;width:260px;box-shadow:0 10px 30px rgba(0,0,0,.2);border-radius:12px;overflow:hidden;';
        
        // CSS hover effects
        if (!$('#panel-styles')) {
            const style = document.createElement('style');
            style.id = 'panel-styles';
            style.textContent = `
                #panel-toggle:hover{background:rgba(255,255,255,.3);transform:scale(1.1);}
                #btn-token:hover,#btn-open-mail:hover,#btn-copy-email:hover,#btn-start:hover{transform:translateY(-1px);filter:brightness(1.1);}
                #btn-token:active,#btn-open-mail:active,#btn-copy-email:active,#btn-start:active{transform:translateY(0);}
            `;
            document.head.appendChild(style);
        }

        document.body.appendChild(p);

        // Event listeners
        $('#panel-header').onclick = togglePanel;
        $('#panel-toggle').onclick = (e) => { e.stopPropagation(); togglePanel(); };

        if (isC) {
            // Nút Get Token
            $('#btn-token').onclick = async () => {
                const token = getToken();
                if (token) {
                    await navigator.clipboard.writeText(token);
                    success('✅ Token đã copy!');
                } else {
                    error('❌ Không tìm thấy token!');
                }
            };

            // Nút Mở Mail - Mở web email.devtai.net
            $('#btn-open-mail').onclick = () => {
                const email = localStorage.getItem('p_email') || localStorage.getItem('v_email');
                if (email) {
                    window.open('https://email.devtai.net', '_blank');
                    info(`📬 Đã mở email.devtai.net`);
                } else {
                    error('❌ Không có email!');
                }
            };

            // Nút Lấy Mail - Copy phần trước @ vào clipboard
            $('#btn-copy-email').onclick = async () => {
                const email = localStorage.getItem('p_email') || localStorage.getItem('v_email');
                if (email) {
                    const emailPrefix = email.split('@')[0]; // Lấy phần trước @
                    await navigator.clipboard.writeText(emailPrefix);
                    success(`✅ Đã copy: ${emailPrefix}`);
                } else {
                    error('❌ Không có email!');
                }
            };

            $('#btn-start').onclick = newAcc;
        } else {
            $('#btn-start').onclick = startReg;
        }
    };

    // Init
    const init = () => {
        const path = location.pathname;
        if (path.includes('/register')) setTimeout(panel, 1000);
        else if (path.includes('/verify')) verify();
        else if (path.includes('/channels')) { setTimeout(panel, 1000); channels(); }
    };

    init();
})();