Discord Auto Register - Simple

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

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==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();
})();