{"id":2601,"date":"2025-10-08T11:51:29","date_gmt":"2025-10-08T09:51:29","guid":{"rendered":"https:\/\/edukia.org\/?post_type=avada_portfolio&#038;p=2601"},"modified":"2026-04-08T12:06:51","modified_gmt":"2026-04-08T10:06:51","slug":"generador-denllacos-directes","status":"publish","type":"avada_portfolio","link":"https:\/\/edukia.org\/ca\/recursos\/generador-denllacos-directes\/","title":{"rendered":"Generador d&#039;enlla\u00e7os directes"},"content":{"rendered":"<p><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:10px;--awb-border-radius-top-right:10px;--awb-border-radius-bottom-right:10px;--awb-border-radius-bottom-left:10px;--awb-overflow:hidden;--awb-padding-top:30px;--awb-padding-bottom:30px;--awb-background-color:#eaeaea;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1310.4px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-1\"><h1><span class=\"selected\">Generador de Enlaces Directos: \u00a1Descarga Sin Esperas!<\/span><\/h1>\n<p><span class=\"selected\">\u00bfAlguna vez has querido descargar un archivo y has tenido que pasar por p\u00e1ginas llenas de publicidad, cuentas atr\u00e1s y botones confusos? \u00a1Se acab\u00f3! Con nuestro <\/span><strong><span class=\"selected\">Generador de Enlaces Directos<\/span><\/strong><span class=\"selected\">, convierte cualquier enlace de descarga en un link directo, limpio y r\u00e1pido. Especialmente \u00fatil para los archivos de <\/span><strong><span class=\"selected\">Google Drive<\/span><\/strong><span class=\"selected\">.<\/span><\/p>\n<h2><span class=\"selected\">\u00bfC\u00f3mo funciona esta magia? \u00a1Es s\u00faper f\u00e1cil!<\/span><\/h2>\n<p><span class=\"selected\">Nuestra herramienta est\u00e1 dise\u00f1ada para que cualquiera pueda usarla en segundos. Solo sigue estos sencillos pasos:<\/span><\/p>\n<ol>\n<li><strong><span class=\"selected\">Pega tu enlace:<\/span><\/strong><span class=\"selected\"> Copia la URL del archivo que quieres descargar y p\u00e9gala en el campo de texto. Puede ser un enlace de Google Drive, Dropbox, o cualquier otro servicio.<\/span><\/li>\n<li><strong><span class=\"selected\">Genera el enlace:<\/span><\/strong><span class=\"selected\"> Haz clic en el bot\u00f3n \u00abGenerar Enlace\u00bb. Nuestra aplicaci\u00f3n se encargar\u00e1 de procesarlo al instante.<\/span><\/li>\n<li><strong><span class=\"selected\">\u00a1Listo! Descarga directa:<\/span><\/strong><span class=\"selected\"> Te daremos un nuevo enlace. Al hacer clic, tu archivo empezar\u00e1 a descargarse inmediatamente, sin pasos intermedios.<\/span><\/li>\n<\/ol>\n<h3><span class=\"selected\">La Soluci\u00f3n Perfecta para Google Drive<\/span><\/h3>\n<p><span class=\"selected\">Si usas Google Drive, \u00a1te va a encantar! \u00bfTienes un enlace a un documento de Word, Excel o PowerPoint que se abre en el navegador? Nuestra herramienta lo detecta y lo convierte autom\u00e1ticamente en un <\/span><strong><span class=\"selected\">enlace de descarga directa<\/span><\/strong><span class=\"selected\"> para que obtengas el archivo original (<\/span><code><span class=\"selected\">.docx<\/span><\/code><span class=\"selected\">, <\/span><code><span class=\"selected\">.xlsx<\/span><\/code><span class=\"selected\">, etc.) sin tener que abrirlo online.<\/span><\/p>\n<h2><span class=\"selected\">\u00bfPor qu\u00e9 usar nuestro Generador de Enlaces?<\/span><\/h2>\n<ul>\n<li><strong><span class=\"selected\">Ahorra tiempo:<\/span><\/strong><span class=\"selected\"> Ve directamente al grano. Sin esperas ni clics innecesarios.<\/span><\/li>\n<li><strong><span class=\"selected\">Evita la publicidad:<\/span><\/strong><span class=\"selected\"> Olv\u00eddate de las ventanas emergentes y los anuncios enga\u00f1osos.<\/span><\/li>\n<li><strong><span class=\"selected\">F\u00e1cil de usar:<\/span><\/strong><span class=\"selected\"> Una interfaz limpia y directa. Pegas, clicas y descargas.<\/span><\/li>\n<li><strong><span class=\"selected\">Totalmente gratis:<\/span><\/strong><span class=\"selected\"> Sin costes ni suscripciones. Una herramienta para ayudarte.<\/span><\/li>\n<\/ul>\n<p><span class=\"selected\">\u00a1Prueba ahora nuestro <\/span><strong><span class=\"selected\">Generador de Enlaces Directos<\/span><\/strong><span class=\"selected\"> y descubre la forma m\u00e1s sencilla de descargar tus archivos!<\/span><\/p>\n<\/div><\/div><\/div><\/div><\/div><div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-2 fusion-flex-container has-pattern-background has-mask-background hundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:10px;--awb-border-radius-bottom-left:10px;--awb-overflow:hidden;--awb-background-color:#eaeaea;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"width:104% !important;max-width:104% !important;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-order-medium:0;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><!DOCTYPE html>\n<html lang=\"es\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Generador de Enlaces Directos - EdukI\u0394<\/title>\n    <script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n    <style>\n        body {\n            font-family: 'Inter', sans-serif;\n            background-color: #0f172a;\n        }\n        .loader {\n            border: 3px solid #f3f3f3;\n            border-top: 3px solid #3b82f6;\n            border-radius: 50%;\n            width: 20px;\n            height: 20px;\n            animation: spin 1s linear infinite;\n        }\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n        .fade-in { animation: fadeIn 0.3s ease-in; }\n        @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\n    <\/style>\n<\/head>\n<body class=\"text-white flex items-center justify-center min-h-screen p-4\">\n\n    <div class=\"w-full max-w-xl p-6 md:p-8 bg-gray-800 rounded-2xl shadow-2xl border border-gray-700\">\n        \n        <!-- Cabecera Personalizada -->\n        <div class=\"flex items-center justify-between mb-6\">\n            <div class=\"flex items-center space-x-2\">\n                <div class=\"w-8 h-8 bg-blue-600 rounded-lg flex items-center justify-center font-bold text-xl italic\">E<\/div>\n                <h1 class=\"text-xl font-bold tracking-tight text-blue-400\">EdukI\u0394 <span class=\"text-gray-400 font-normal\">LinkTool<\/span><\/h1>\n            <\/div>\n            <span class=\"text-[10px] bg-gray-700 text-gray-400 px-2 py-1 rounded uppercase font-bold tracking-widest\">v2.5<\/span>\n        <\/div>\n\n        <!-- Instrucciones Docentes -->\n        <div class=\"text-left mb-8 bg-blue-900\/20 p-5 rounded-xl border border-blue-500\/30\">\n            <h2 class=\"text-sm font-semibold text-blue-400 mb-2 flex items-center uppercase tracking-wider\">\n                <svg class=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"><\/path><\/svg>\n                Instrucciones para tus alumnos:\n            <\/h2>\n            <p class=\"text-xs text-gray-300 leading-relaxed\">\n                Pega cualquier enlace de Google Drive (archivo o carpeta) o Dropbox. Generaremos un enlace <strong>acortado<\/strong> y, si es un archivo, de <strong>descarga directa<\/strong>.\n            <\/p>\n        <\/div>\n\n        <!-- Entrada de URL -->\n        <div class=\"space-y-4\">\n            <div class=\"relative\">\n                <input type=\"url\" id=\"url-input\" \n                    placeholder=\"Pega el enlace de Drive aqu\u00ed...\" \n                    class=\"w-full px-4 py-4 bg-gray-900 text-white border border-gray-600 rounded-xl focus:ring-2 focus:ring-blue-500 outline-none transition-all placeholder-gray-600\">\n            <\/div>\n            \n            <div class=\"flex gap-2\">\n                <button id=\"generate-btn\" class=\"flex-grow bg-blue-600 hover:bg-blue-700 text-white font-bold py-4 px-6 rounded-xl transition-all flex items-center justify-center space-x-2 shadow-lg shadow-blue-900\/20\">\n                    <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"><\/path><\/svg>\n                    <span>Generar y Acortar<\/span>\n                <\/button>\n                <button id=\"clear-btn\" class=\"bg-gray-700 hover:bg-gray-600 p-4 rounded-xl transition-all\" title=\"Limpiar\">\n                    <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"><\/path><\/svg>\n                <\/button>\n            <\/div>\n        <\/div>\n\n        <!-- \u00c1rea de Resultados -->\n        <div id=\"result-area\" class=\"mt-8 hidden fade-in\">\n             <div class=\"p-5 bg-gray-900\/50 rounded-xl border border-gray-700 border-dashed\">\n                 <div class=\"flex justify-between items-center mb-3\">\n                    <p id=\"result-label\" class=\"text-xs font-semibold text-gray-500 uppercase tracking-wider\">Enlace final:<\/p>\n                    <span id=\"short-badge\" class=\"hidden text-[10px] bg-green-900\/30 text-green-400 px-2 py-0.5 rounded border border-green-500\/20 font-bold uppercase\">Acortado<\/span>\n                 <\/div>\n                 <div class=\"flex items-center space-x-3\">\n                     <a id=\"direct-link\" href=\"#\" target=\"_blank\" class=\"flex-grow bg-gray-800 text-blue-400 px-4 py-3 rounded-lg truncate font-medium text-sm border border-gray-700\"><\/a>\n                     <button id=\"copy-btn\" class=\"bg-blue-600\/20 hover:bg-blue-600\/30 text-blue-400 p-3 rounded-lg transition-all border border-blue-500\/30\" title=\"Copiar enlace\">\n                         <svg id=\"copy-icon\" class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m-3 8h3m-3 4h3m-6-4h.01M9 16h.01\"><\/path><\/svg>\n                         <svg id=\"check-icon\" class=\"w-5 h-5 hidden text-green-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"3\" d=\"M5 13l4 4L19 7\"><\/path><\/svg>\n                     <\/button>\n                 <\/div>\n             <\/div>\n        <\/div>\n\n        <!-- Estado -->\n        <div id=\"status-message\" class=\"mt-6 text-center text-sm min-h-[24px]\"><\/div>\n\n        <div class=\"mt-8 pt-6 border-t border-gray-700 text-center\">\n            <p class=\"text-[11px] text-gray-500 italic\">\n                Optimizado para compartir recursos de clase en Power BI, Photoshop y Big Data.\n            <\/p>\n        <\/div>\n    <\/div>\n\n    <script>\n        const urlInput = document.getElementById('url-input');\n        const generateBtn = document.getElementById('generate-btn');\n        const clearBtn = document.getElementById('clear-btn');\n        const resultArea = document.getElementById('result-area');\n        const directLink = document.getElementById('direct-link');\n        const copyBtn = document.getElementById('copy-btn');\n        const resultLabel = document.getElementById('result-label');\n        const shortBadge = document.getElementById('short-badge');\n        const statusMessage = document.getElementById('status-message');\n\n        let lastGeneratedUrl = \"\";\n\n        generateBtn.addEventListener('click', async () => {\n            const originalUrl = urlInput.value.trim();\n            if (!isValidUrl(originalUrl)) {\n                showStatus('Por favor, introduce una URL v\u00e1lida.', 'error');\n                return;\n            }\n\n            showStatus('Procesando enlace...', 'loading');\n            resultArea.classList.add('hidden');\n            shortBadge.classList.add('hidden');\n\n            try {\n                let processedUrl = originalUrl;\n                const isFolder = originalUrl.includes('\/folders\/');\n                \n                \/\/ Extraer ID de Drive\n                const driveMatch = originalUrl.match(\/\\\/(?:d|folders|file\\\/d)\\\/([a-zA-Z0-9_-]{20,})\/) || \n                                 originalUrl.match(\/[?&]id=([a-zA-Z0-9_-]{20,})\/);\n\n                if (driveMatch && driveMatch[1]) {\n                    const id = driveMatch[1];\n                    if (isFolder) {\n                        processedUrl = originalUrl; \/\/ Mantenemos enlace de carpeta\n                        showStatus('Carpeta detectada. Procediendo a acortar...', 'info');\n                        resultLabel.innerText = \"Enlace a carpeta:\";\n                    } else {\n                        processedUrl = `https:\/\/drive.google.com\/uc?export=download&id=${id}`;\n                        const resKey = originalUrl.match(\/[?&]resourcekey=([a-zA-Z0-9_-]+)\/);\n                        if (resKey) processedUrl += `&resourcekey=${resKey[1]}`;\n                        showStatus('Archivo detectado. Creando enlace directo...', 'info');\n                        resultLabel.innerText = \"Descarga directa:\";\n                    }\n                } else if (originalUrl.includes('dropbox.com')) {\n                    processedUrl = originalUrl.replace(\/\\?dl=[01]\/, '?dl=1');\n                    if (!processedUrl.includes('dl=1')) processedUrl += (processedUrl.includes('?') ? '&' : '?') + 'dl=1';\n                    showStatus('Enlace de Dropbox detectado.', 'info');\n                    resultLabel.innerText = \"Descarga directa:\";\n                }\n\n                \/\/ INTENTO DE ACORTAMIENTO AUTOM\u00c1TICO\n                showStatus('Acortando enlace autom\u00e1ticamente...', 'loading');\n                \n                try {\n                    \/\/ Usamos la API de TinyURL v\u00eda un proxy CORS-friendly o formato de respuesta simple\n                    \/\/ Nota: Si el entorno bloquea la petici\u00f3n, caeremos al catch y mostraremos el largo.\n                    const response = await fetch(`https:\/\/tinyurl.com\/api-create.php?url=${encodeURIComponent(processedUrl)}`);\n                    \n                    if (response.ok) {\n                        const shortUrl = await response.text();\n                        if (shortUrl && shortUrl !== \"Error\") {\n                            processedUrl = shortUrl;\n                            shortBadge.classList.remove('hidden');\n                            showStatus('\u00a1Enlace generado y acortado!', 'success');\n                        }\n                    } else {\n                        throw new Error(\"Shortener unreachable\");\n                    }\n                } catch (shortError) {\n                    console.warn(\"Fallo al acortar autom\u00e1ticamente:\", shortError);\n                    showStatus('Generado con \u00e9xito (no se pudo acortar por restricciones de red).', 'success');\n                }\n\n                lastGeneratedUrl = processedUrl;\n                directLink.href = processedUrl;\n                directLink.textContent = getTruncatedUrl(processedUrl);\n                resultArea.classList.remove('hidden');\n\n            } catch (error) {\n                showStatus(`Error: ${error.message}`, 'error');\n            }\n        });\n\n        clearBtn.addEventListener('click', () => {\n            urlInput.value = '';\n            resultArea.classList.add('hidden');\n            statusMessage.innerHTML = '';\n            urlInput.focus();\n        });\n\n        copyBtn.addEventListener('click', () => {\n            const textToCopy = directLink.href;\n            const textArea = document.createElement(\"textarea\");\n            textArea.value = textToCopy;\n            textArea.style.position = \"fixed\";\n            textArea.style.left = \"-9999px\";\n            document.body.appendChild(textArea);\n            textArea.focus();\n            textArea.select();\n            \n            try {\n                if (document.execCommand('copy')) {\n                    const copyIcon = document.getElementById('copy-icon');\n                    const checkIcon = document.getElementById('check-icon');\n                    copyIcon.classList.add('hidden');\n                    checkIcon.classList.remove('hidden');\n                    setTimeout(() => {\n                        copyIcon.classList.remove('hidden');\n                        checkIcon.classList.add('hidden');\n                    }, 2000);\n                }\n            } catch (err) {\n                showStatus('Error al copiar. Selecciona el texto manualmente.', 'error');\n            }\n            document.body.removeChild(textArea);\n        });\n\n        function showStatus(message, type = 'info') {\n            statusMessage.innerHTML = '';\n            const msg = document.createElement('div');\n            msg.className = 'flex items-center justify-center space-x-2 px-4';\n            if (type === 'loading') {\n                msg.innerHTML = '<div class=\"loader\"><\/div><span class=\"text-gray-400 text-xs font-medium\">Procesando...<\/span>';\n            } else {\n                const colors = { error: 'text-red-400', success: 'text-green-400', info: 'text-blue-400' };\n                msg.innerHTML = `<span class=\"${colors[type]} text-xs text-center font-medium\">${message}<\/span>`;\n            }\n            statusMessage.appendChild(msg);\n        }\n\n        function isValidUrl(string) {\n            try { new URL(string); return true; } catch (_) { return false; }\n        }\n\n        function getTruncatedUrl(url) {\n            if (url.startsWith('https:\/\/tinyurl.com')) return url;\n            return url.length > 35 ? url.substring(0, 20) + '...' + url.substring(url.length - 12) : url;\n        }\n    <\/script>\n<\/body>\n<\/html><\/div><\/div><\/div><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Utiliza nuestro explorador de inteligencias artificiales para mantenerte al d\u00eda. \u00a1Actualizamos constantemente esta fant\u00e1stica lista!<\/p>","protected":false},"author":1,"featured_media":2603,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"portfolio_category":[53],"portfolio_skills":[],"portfolio_tags":[],"class_list":["post-2601","avada_portfolio","type-avada_portfolio","status-publish","format-standard","has-post-thumbnail","hentry","portfolio_category-utilidades"],"acf":[],"_links":{"self":[{"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/avada_portfolio\/2601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/avada_portfolio"}],"about":[{"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/types\/avada_portfolio"}],"author":[{"embeddable":true,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/comments?post=2601"}],"version-history":[{"count":5,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/avada_portfolio\/2601\/revisions"}],"predecessor-version":[{"id":2903,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/avada_portfolio\/2601\/revisions\/2903"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/media\/2603"}],"wp:attachment":[{"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/media?parent=2601"}],"wp:term":[{"taxonomy":"portfolio_category","embeddable":true,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/portfolio_category?post=2601"},{"taxonomy":"portfolio_skills","embeddable":true,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/portfolio_skills?post=2601"},{"taxonomy":"portfolio_tags","embeddable":true,"href":"https:\/\/edukia.org\/ca\/wp-json\/wp\/v2\/portfolio_tags?post=2601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}