{"id":82,"date":"2026-03-18T12:42:07","date_gmt":"2026-03-18T12:42:07","guid":{"rendered":"https:\/\/tools.sanepo.com\/?post_type=tool&#038;p=82"},"modified":"2026-03-18T12:42:07","modified_gmt":"2026-03-18T12:42:07","slug":"online-javascript-obfuscator","status":"publish","type":"tool","link":"https:\/\/tools.sanepo.com\/zh-hans\/features\/online-javascript-obfuscator\/","title":{"rendered":"Free Online JavaScript Obfuscator \u2013 Secure JS Scrambler Tool"},"content":{"rendered":"\n<!-- \n  Sanepo Tools: Online JavaScript Obfuscator\n  Developed by: WP-NanoTech Developer\n  Environment: 100% Client-Side (Vanilla JS)\n-->\n\n<style>\n    @import url('https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&family=Fira+Code:wght@400;500;700&display=swap');\n\n    \/* 1. CSS Variables Default (Light Mode) *\/\n    #wpnt-js-obfuscator {\n        \/* Dibuat transparent agar otomatis mengikuti warna background tema website *\/\n        --wpnt-bg-card: transparent; \n        --wpnt-bg-panel: #f8fafc;\n        --wpnt-border: #e2e8f0;\n        --wpnt-text-primary: #0f172a;\n        --wpnt-text-secondary: #64748b;\n        --wpnt-accent: #4f46e5;\n        --wpnt-accent-hover: #4338ca;\n        --wpnt-accent-bg: #e0e7ff;\n        --wpnt-accent-text: #4338ca;\n        --wpnt-success-bg: rgba(16, 185, 129, 0.1);\n        --wpnt-success-text: #059669;\n        --wpnt-success-border: rgba(16, 185, 129, 0.2);\n        \n        font-family: 'Inter', -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n        color: var(--wpnt-text-primary);\n        width: 100%;\n        margin: 20px auto;\n        background: var(--wpnt-bg-card);\n        padding: 0;\n        box-sizing: border-box;\n        line-height: 1.5;\n        border: none;\n        box-shadow: none;\n    }\n\n    #wpnt-js-obfuscator * {\n        box-sizing: border-box;\n        transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease;\n    }\n\n    \/* 2. Dark Mode Engine (OS Preference Default) *\/\n    @media (prefers-color-scheme: dark) {\n        #wpnt-js-obfuscator {\n            --wpnt-bg-card: transparent;\n            --wpnt-bg-panel: #0f172a;\n            --wpnt-border: #334155;\n            --wpnt-text-primary: #f8fafc;\n            --wpnt-text-secondary: #94a3b8;\n            --wpnt-accent: #5b62f4;\n            --wpnt-accent-hover: #4f46e5;\n            --wpnt-accent-bg: rgba(91, 98, 244, 0.15);\n            --wpnt-accent-text: #818cf8;\n        }\n    }\n\n    \/* 3. EXPLICIT LIGHT MODE OVERRIDE (Memaksa Light Mode jika tema web menggunakan class .light) *\/\n    html.light #wpnt-js-obfuscator,\n    body.light #wpnt-js-obfuscator,\n    [data-theme=\"light\"] #wpnt-js-obfuscator,\n    .light-mode #wpnt-js-obfuscator {\n        --wpnt-bg-card: transparent !important;\n        --wpnt-bg-panel: #f8fafc !important;\n        --wpnt-border: #e2e8f0 !important;\n        --wpnt-text-primary: #0f172a !important;\n        --wpnt-text-secondary: #64748b !important;\n        --wpnt-accent: #4f46e5 !important;\n        --wpnt-accent-hover: #4338ca !important;\n        --wpnt-accent-bg: #e0e7ff !important;\n        --wpnt-accent-text: #4338ca !important;\n    }\n\n    \/* 4. EXPLICIT DARK MODE OVERRIDE (Memaksa Dark Mode jika tema web menggunakan class .dark) *\/\n    html.dark #wpnt-js-obfuscator,\n    body.dark #wpnt-js-obfuscator,\n    [data-theme=\"dark\"] #wpnt-js-obfuscator,\n    body.dark-mode #wpnt-js-obfuscator {\n        --wpnt-bg-card: transparent !important;\n        --wpnt-bg-panel: #0f172a !important;\n        --wpnt-border: #334155 !important;\n        --wpnt-text-primary: #f8fafc !important;\n        --wpnt-text-secondary: #94a3b8 !important;\n        --wpnt-accent: #5b62f4 !important;\n        --wpnt-accent-hover: #4f46e5 !important;\n        --wpnt-accent-bg: rgba(91, 98, 244, 0.15) !important;\n        --wpnt-accent-text: #818cf8 !important;\n    }\n\n    \/* Header Styling *\/\n    #wpnt-js-obfuscator .wpnt-header {\n        text-align: center;\n        margin-bottom: 32px;\n    }\n\n    #wpnt-js-obfuscator h3 {\n        margin: 0 0 12px 0;\n        font-size: 24px;\n        font-weight: 700;\n        letter-spacing: -0.02em;\n        color: var(--wpnt-text-primary);\n    }\n\n    #wpnt-js-obfuscator p {\n        margin: 0;\n        font-size: 14px;\n        color: var(--wpnt-text-secondary);\n    }\n    \n    #wpnt-js-obfuscator .wpnt-privacy-badge {\n        display: inline-flex;\n        align-items: center;\n        gap: 6px;\n        background: var(--wpnt-success-bg);\n        color: var(--wpnt-success-text);\n        border: 1px solid var(--wpnt-success-border);\n        padding: 6px 14px;\n        border-radius: 30px;\n        font-size: 12px;\n        font-weight: 600;\n        margin-top: 16px;\n    }\n\n    \/* Layout Grid *\/\n    #wpnt-js-obfuscator .wpnt-grid {\n        display: grid;\n        grid-template-columns: minmax(0, 1fr) 320px;\n        gap: 24px;\n    }\n\n    \/* Left Column (Editors) *\/\n    #wpnt-js-obfuscator .wpnt-editor-group {\n        display: flex;\n        flex-direction: column;\n        gap: 20px;\n    }\n\n    #wpnt-js-obfuscator .wpnt-textarea-wrapper {\n        background: var(--wpnt-bg-panel);\n        border: 1px solid var(--wpnt-border);\n        border-radius: 8px;\n        overflow: hidden;\n    }\n\n    #wpnt-js-obfuscator .wpnt-textarea-header {\n        padding: 12px 16px;\n        border-bottom: 1px solid var(--wpnt-border);\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n    }\n\n    #wpnt-js-obfuscator .wpnt-textarea-title {\n        font-size: 12px;\n        font-weight: 700;\n        text-transform: uppercase;\n        letter-spacing: 0.05em;\n        color: var(--wpnt-text-primary);\n    }\n\n    #wpnt-js-obfuscator .wpnt-size-badge {\n        font-family: 'Fira Code', monospace;\n        font-size: 11px;\n        font-weight: 700;\n        background: var(--wpnt-accent-bg);\n        color: var(--wpnt-accent-text);\n        padding: 4px 8px;\n        border-radius: 4px;\n    }\n\n    #wpnt-js-obfuscator textarea {\n        width: 100%;\n        min-height: 220px;\n        padding: 16px;\n        border: none;\n        background: transparent;\n        color: var(--wpnt-text-secondary);\n        font-family: 'Fira Code', monospace;\n        font-size: 13px;\n        resize: vertical;\n        outline: none;\n        line-height: 1.6;\n    }\n\n    #wpnt-js-obfuscator textarea:focus {\n        color: var(--wpnt-text-primary);\n    }\n\n    #wpnt-js-obfuscator textarea::placeholder {\n        color: var(--wpnt-text-secondary);\n        opacity: 0.6;\n    }\n\n    \/* Left Column Actions *\/\n    #wpnt-js-obfuscator .wpnt-action-row {\n        display: flex;\n        gap: 12px;\n        margin-top: -4px;\n    }\n\n    #wpnt-js-obfuscator .wpnt-btn-outline {\n        background: transparent;\n        color: var(--wpnt-accent-text);\n        border: 1px solid var(--wpnt-accent);\n        padding: 8px 16px;\n        border-radius: 6px;\n        font-size: 13px;\n        font-weight: 600;\n        cursor: pointer;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        gap: 6px;\n    }\n\n    #wpnt-js-obfuscator .wpnt-btn-outline:hover:not(:disabled) {\n        background: var(--wpnt-accent-bg);\n    }\n\n    #wpnt-js-obfuscator .wpnt-btn-outline:disabled {\n        opacity: 0.5;\n        cursor: not-allowed;\n    }\n\n    \/* Right Column (Settings Panel) *\/\n    #wpnt-js-obfuscator .wpnt-settings-panel {\n        background: var(--wpnt-bg-panel);\n        border: 1px solid var(--wpnt-border);\n        border-radius: 8px;\n        padding: 24px;\n        height: fit-content;\n    }\n\n    #wpnt-js-obfuscator .wpnt-setting-title {\n        font-weight: 700;\n        font-size: 16px;\n        margin: 0 0 16px 0;\n        color: var(--wpnt-text-primary);\n    }\n\n    #wpnt-js-obfuscator .wpnt-divider {\n        border: 0;\n        border-top: 1px dashed var(--wpnt-border);\n        margin: 0 0 20px 0;\n    }\n\n    #wpnt-js-obfuscator .wpnt-label {\n        font-size: 13px;\n        font-weight: 600;\n        color: var(--wpnt-text-primary);\n        display: block;\n        margin-bottom: 8px;\n    }\n\n    \/* Dropdown Select *\/\n    #wpnt-js-obfuscator select {\n        width: 100%;\n        padding: 10px 12px;\n        border-radius: 6px;\n        border: 1px solid var(--wpnt-border);\n        background-color: transparent;\n        font-family: inherit;\n        font-size: 13px;\n        color: var(--wpnt-text-primary);\n        outline: none;\n        cursor: pointer;\n        appearance: none;\n        margin-bottom: 24px;\n        background-image: url(\"data:image\/svg+xml;charset=UTF-8,%3csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c\/polyline%3e%3c\/svg%3e\");\n        background-repeat: no-repeat;\n        background-position: right 12px center;\n        background-size: 14px;\n    }\n\n    #wpnt-js-obfuscator select:focus {\n        border-color: var(--wpnt-accent);\n    }\n    \n    #wpnt-js-obfuscator select option {\n        background-color: var(--wpnt-bg-panel);\n        color: var(--wpnt-text-primary);\n    }\n\n    \/* Toggle Switches *\/\n    #wpnt-js-obfuscator .wpnt-toggle-wrap {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        cursor: pointer;\n        margin-bottom: 16px;\n    }\n\n    #wpnt-js-obfuscator .wpnt-toggle-text {\n        font-size: 13px;\n        font-weight: 600;\n        color: var(--wpnt-text-primary);\n    }\n\n    #wpnt-js-obfuscator .wpnt-toggle-switch {\n        position: relative;\n        width: 40px;\n        height: 22px;\n        background-color: var(--wpnt-border);\n        border-radius: 20px;\n    }\n\n    #wpnt-js-obfuscator .wpnt-toggle-switch::after {\n        content: '';\n        position: absolute;\n        top: 2px;\n        left: 2px;\n        width: 18px;\n        height: 18px;\n        background-color: #ffffff;\n        border-radius: 50%;\n        transition: transform 0.2s ease;\n        box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n    }\n\n    #wpnt-js-obfuscator input[type=\"checkbox\"] {\n        display: none;\n    }\n\n    #wpnt-js-obfuscator input[type=\"checkbox\"]:checked + .wpnt-toggle-switch {\n        background-color: var(--wpnt-accent);\n    }\n\n    #wpnt-js-obfuscator input[type=\"checkbox\"]:checked + .wpnt-toggle-switch::after {\n        transform: translateX(18px);\n    }\n\n    \/* Main Button *\/\n    #wpnt-js-obfuscator .wpnt-btn-main {\n        background: var(--wpnt-accent);\n        color: #ffffff;\n        border: none;\n        padding: 12px;\n        border-radius: 6px;\n        cursor: pointer;\n        font-weight: 600;\n        font-size: 14px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 8px;\n        width: 100%;\n        margin-top: 24px;\n    }\n\n    #wpnt-js-obfuscator .wpnt-btn-main:hover {\n        background: var(--wpnt-accent-hover);\n    }\n\n    \/* Toast Notification *\/\n    #wpnt-js-obfuscator .wpnt-toast {\n        position: fixed;\n        bottom: 30px;\n        left: 50%;\n        transform: translateX(-50%) translateY(100px);\n        background: var(--wpnt-success-text);\n        color: white;\n        padding: 10px 20px;\n        border-radius: 30px;\n        font-size: 13px;\n        font-weight: 600;\n        opacity: 0;\n        transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n        pointer-events: none;\n        z-index: 9999;\n        box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n    }\n\n    #wpnt-js-obfuscator .wpnt-toast.show {\n        transform: translateX(-50%) translateY(0);\n        opacity: 1;\n    }\n\n    \/* Loader *\/\n    #wpnt-js-obfuscator .wpnt-loader {\n        display: none;\n        width: 14px;\n        height: 14px;\n        border: 2px solid #ffffff;\n        border-bottom-color: transparent;\n        border-radius: 50%;\n        animation: rotation 1s linear infinite;\n    }\n\n    @keyframes rotation {\n        0% { transform: rotate(0deg); }\n        100% { transform: rotate(360deg); }\n    }\n\n    \/* Mobile Responsiveness *\/\n    @media (max-width: 768px) {\n        #wpnt-js-obfuscator {\n            padding: 24px 0px;\n        }\n        #wpnt-js-obfuscator .wpnt-grid {\n            grid-template-columns: 1fr;\n        }\n        #wpnt-js-obfuscator .wpnt-action-row {\n            flex-direction: column;\n        }\n    }\n<\/style>\n\n<div id=\"wpnt-js-obfuscator\">\n    <div class=\"wpnt-header\">\n        <h3>Sanepo Tools: JS Obfuscator<\/h3>\n        <p>Scramble your JavaScript source code, making it extremely difficult to reverse engineer.<\/p>\n        <div class=\"wpnt-privacy-badge\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"><\/path><\/svg>\n            100% Local Browser Execution. No data is sent to any server.\n        <\/div>\n    <\/div>\n\n    <div class=\"wpnt-grid\">\n        <!-- Left Column: Editors -->\n        <div class=\"wpnt-editor-group\">\n            \n            <!-- Input Area -->\n            <div class=\"wpnt-textarea-wrapper\">\n                <div class=\"wpnt-textarea-header\">\n                    <span class=\"wpnt-textarea-title\">Source Code (Original)<\/span>\n                    <span class=\"wpnt-size-badge\" id=\"wpnt-orig-size\">0 BYTES<\/span>\n                <\/div>\n                <textarea id=\"wpnt-input-code\" placeholder=\"Paste your raw JavaScript code here...&#10;&#10;function sayHello() {&#10;    console.log('Welcome to Sanepo Tools!');&#10;}\"><\/textarea>\n            <\/div>\n\n            <!-- Output Area -->\n            <div class=\"wpnt-textarea-wrapper\">\n                <div class=\"wpnt-textarea-header\">\n                    <span class=\"wpnt-textarea-title\">Obfuscated Result<\/span>\n                    <span class=\"wpnt-size-badge\" id=\"wpnt-result-size\">0 BYTES<\/span>\n                <\/div>\n                <textarea id=\"wpnt-output-code\" placeholder=\"Your obfuscated, unreadable code will appear here...\" readonly><\/textarea>\n            <\/div>\n\n            <!-- Action Buttons for Output -->\n            <div class=\"wpnt-action-row\">\n                <button class=\"wpnt-btn-outline\" id=\"wpnt-btn-copy\" disabled>\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg>\n                    Copy Code\n                <\/button>\n                <button class=\"wpnt-btn-outline\" id=\"wpnt-btn-download\" disabled>\n                    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"><\/path><polyline points=\"7 10 12 15 17 10\"><\/polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"><\/line><\/svg>\n                    Download .js\n                <\/button>\n            <\/div>\n\n        <\/div>\n\n        <!-- Right Column: Settings Panel -->\n        <div class=\"wpnt-settings-panel\">\n            <h4 class=\"wpnt-setting-title\">Obfuscation Settings<\/h4>\n            <hr class=\"wpnt-divider\">\n            \n            <div>\n                <label class=\"wpnt-label\">Protection Level<\/label>\n                <select id=\"wpnt-preset\">\n                    <option value=\"low\">Low (Faster, Larger Output)<\/option>\n                    <option value=\"medium\" selected>Medium (Optimal Balance)<\/option>\n                    <option value=\"high\">High (Hardest to read, Slower)<\/option>\n                <\/select>\n            <\/div>\n\n            <div>\n                <!-- Anti Debug -->\n                <label class=\"wpnt-toggle-wrap\">\n                    <span class=\"wpnt-toggle-text\">Anti-Debug Mode<\/span>\n                    <input type=\"checkbox\" id=\"wpnt-opt-antidebug\" checked>\n                    <div class=\"wpnt-toggle-switch\"><\/div>\n                <\/label>\n                \n                <!-- Compact Code -->\n                <label class=\"wpnt-toggle-wrap\">\n                    <span class=\"wpnt-toggle-text\">Compact Code (Minify)<\/span>\n                    <input type=\"checkbox\" id=\"wpnt-opt-compact\" checked>\n                    <div class=\"wpnt-toggle-switch\"><\/div>\n                <\/label>\n                \n                <!-- Control Flow Flattening -->\n                <label class=\"wpnt-toggle-wrap\">\n                    <span class=\"wpnt-toggle-text\">Control Flow Flattening<\/span>\n                    <input type=\"checkbox\" id=\"wpnt-opt-controlflow\">\n                    <div class=\"wpnt-toggle-switch\"><\/div>\n                <\/label>\n                \n                <!-- String Array Shuffle -->\n                <label class=\"wpnt-toggle-wrap\">\n                    <span class=\"wpnt-toggle-text\">String Array Shuffle<\/span>\n                    <input type=\"checkbox\" id=\"wpnt-opt-stringarray\" checked>\n                    <div class=\"wpnt-toggle-switch\"><\/div>\n                <\/label>\n            <\/div>\n\n            <button class=\"wpnt-btn-main\" id=\"wpnt-btn-obfuscate\">\n                <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\"><\/line><path d=\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"><\/path><\/svg>\n                <span>Obfuscate Code<\/span>\n                <span class=\"wpnt-loader\" id=\"wpnt-loader\"><\/span>\n            <\/button>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Toast Notification Container -->\n<div class=\"wpnt-toast\" id=\"wpnt-toast\">Copied to clipboard!<\/div>\n\n<script>\n    (function() {\n        const loadObfuscatorScript = () => {\n            if (typeof JavaScriptObfuscator === 'undefined') {\n                const script = document.createElement('script');\n                script.src = \"https:\/\/cdn.jsdelivr.net\/npm\/javascript-obfuscator\/dist\/index.browser.js\";\n                script.async = true;\n                document.head.appendChild(script);\n            }\n        };\n\n        loadObfuscatorScript();\n\n        const inputCode = document.getElementById('wpnt-input-code');\n        const outputCode = document.getElementById('wpnt-output-code');\n        const btnObfuscate = document.getElementById('wpnt-btn-obfuscate');\n        const btnCopy = document.getElementById('wpnt-btn-copy');\n        const btnDownload = document.getElementById('wpnt-btn-download');\n        const sizeOrig = document.getElementById('wpnt-orig-size');\n        const sizeResult = document.getElementById('wpnt-result-size');\n        const toast = document.getElementById('wpnt-toast');\n        const loader = document.getElementById('wpnt-loader');\n        const btnText = btnObfuscate.querySelector('span:not(.wpnt-loader)');\n\n        const formatBytes = (bytes) => {\n            if (bytes === 0) return '0 BYTES';\n            const k = 1024;\n            const sizes = ['BYTES', 'KB', 'MB'];\n            const i = Math.floor(Math.log(bytes) \/ Math.log(k));\n            return parseFloat((bytes \/ Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n        };\n\n        inputCode.addEventListener('input', () => {\n            const bytes = new Blob([inputCode.value]).size;\n            sizeOrig.textContent = formatBytes(bytes);\n        });\n\n        const showToast = (message, isError = false) => {\n            toast.textContent = message;\n            toast.style.background = isError ? '#ef4444' : 'var(--wpnt-success-text)';\n            toast.classList.add('show');\n            setTimeout(() => toast.classList.remove('show'), 3000);\n        };\n\n        btnObfuscate.addEventListener('click', () => {\n            const source = inputCode.value.trim();\n            if (!source) {\n                showToast('Please enter some code first!', true);\n                return;\n            }\n\n            if (typeof JavaScriptObfuscator === 'undefined') {\n                showToast('Loading engine, please wait...', true);\n                return;\n            }\n\n            btnObfuscate.disabled = true;\n            btnText.style.display = 'none';\n            loader.style.display = 'block';\n\n            setTimeout(() => {\n                try {\n                    const preset = document.getElementById('wpnt-preset').value;\n                    const isAntiDebug = document.getElementById('wpnt-opt-antidebug').checked;\n                    const isCompact = document.getElementById('wpnt-opt-compact').checked;\n                    const isControlFlow = document.getElementById('wpnt-opt-controlflow').checked;\n                    const isStringArray = document.getElementById('wpnt-opt-stringarray').checked;\n\n                    let config = {\n                        compact: isCompact,\n                        controlFlowFlattening: isControlFlow,\n                        debugProtection: isAntiDebug,\n                        stringArray: isStringArray,\n                        stringArrayEncoding: [],\n                        stringArrayThreshold: 0.75,\n                        deadCodeInjection: false\n                    };\n\n                    if (preset === 'high') {\n                        config.controlFlowFlattening = true;\n                        config.controlFlowFlatteningThreshold = 1;\n                        config.deadCodeInjection = true;\n                        config.deadCodeInjectionThreshold = 1;\n                        config.stringArrayEncoding = ['rc4'];\n                    } else if (preset === 'low') {\n                        config.controlFlowFlattening = false;\n                        config.stringArrayEncoding = ['base64'];\n                    }\n\n                    const obfuscationResult = JavaScriptObfuscator.obfuscate(source, config);\n                    const finalCode = obfuscationResult.getObfuscatedCode();\n\n                    outputCode.value = finalCode;\n                    \n                    const resultBytes = new Blob([finalCode]).size;\n                    sizeResult.textContent = formatBytes(resultBytes);\n\n                    btnCopy.disabled = false;\n                    btnDownload.disabled = false;\n                    \n                    showToast('Code successfully obfuscated!');\n\n                } catch (error) {\n                    console.error(error);\n                    showToast('Syntax Error in your code!', true);\n                } finally {\n                    btnObfuscate.disabled = false;\n                    btnText.style.display = 'inline-block';\n                    loader.style.display = 'none';\n                }\n            }, 50); \n        });\n\n        btnCopy.addEventListener('click', () => {\n            if (outputCode.value) {\n                navigator.clipboard.writeText(outputCode.value).then(() => {\n                    showToast('Copied to clipboard!');\n                }).catch(err => {\n                    outputCode.select();\n                    document.execCommand('copy');\n                    showToast('Copied to clipboard!');\n                });\n            }\n        });\n\n        btnDownload.addEventListener('click', () => {\n            if (outputCode.value) {\n                const blob = new Blob([outputCode.value], { type: 'application\/javascript' });\n                const url = URL.createObjectURL(blob);\n                const a = document.createElement('a');\n                a.href = url;\n                a.download = 'obfuscated-sanepo.js';\n                document.body.appendChild(a);\n                a.click();\n                document.body.removeChild(a);\n                URL.revokeObjectURL(url);\n                showToast('File downloaded!');\n            }\n        });\n\n    })();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Sanepo Tools: JS Obfuscator Scramble your JavaScript so [&hellip;]<\/p>\n","protected":false},"featured_media":0,"template":"","meta":[],"class_list":["post-82","tool","type-tool","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tools.sanepo.com\/zh-hans\/wp-json\/wp\/v2\/tool\/82","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tools.sanepo.com\/zh-hans\/wp-json\/wp\/v2\/tool"}],"about":[{"href":"https:\/\/tools.sanepo.com\/zh-hans\/wp-json\/wp\/v2\/types\/tool"}],"wp:attachment":[{"href":"https:\/\/tools.sanepo.com\/zh-hans\/wp-json\/wp\/v2\/media?parent=82"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}