{"id":2748,"date":"2025-07-22T15:39:43","date_gmt":"2025-07-22T20:39:43","guid":{"rendered":"https:\/\/biblioteca.utc.edu.ec\/?page_id=2748"},"modified":"2025-07-22T17:30:56","modified_gmt":"2025-07-22T22:30:56","slug":"tools-id-gosch","status":"publish","type":"page","link":"https:\/\/biblioteca.utc.edu.ec\/?page_id=2748","title":{"rendered":"Tools-ID-GoSch"},"content":{"rendered":"\n<!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>An\u00e1lisis Bibliom\u00e9trico por ID de Autor<\/title>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            background: linear-gradient(135deg, #ffffff 0%, #ffffff 100%);\n            min-height: 100vh;\n            color: #333;\n        }\n\n        .container {\n            max-width: 1400px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n\n        .header {\n            text-align: center;\n            margin-bottom: 40px;\n            color: white;\n        }\n\n        .header h1 {\n            font-size: 1.5rem;\n            margin-bottom: 10px;\n            text-shadow: 2px 2px 4px rgba(0,0,0,0.3);\n        }\n\n        .header p {\n            font-size: 1.1rem;\n            opacity: 0.9;\n        }\n\n        .api-config {\n            background: rgba(255,255,255,0.95);\n            padding: 25px;\n            border-radius: 15px;\n            margin-bottom: 30px;\n            box-shadow: 0 10px 30px rgba(0,0,0,0.2);\n        }\n\n        .api-config h3 {\n            margin-bottom: 15px;\n            color: #333;\n        }\n\n        .api-input-group {\n            display: flex;\n            gap: 10px;\n            margin-bottom: 15px;\n        }\n\n        .api-config input {\n            flex: 1;\n            padding: 12px;\n            border: 2px solid #e1e5e9;\n            border-radius: 8px;\n            font-size: 0.9rem;\n        }\n\n        .test-btn {\n            background: #28a745;\n            color: white;\n            border: none;\n            padding: 12px 20px;\n            border-radius: 8px;\n            cursor: pointer;\n            font-weight: 600;\n            transition: background 0.3s;\n        }\n\n        .test-btn:hover {\n            background: #218838;\n        }\n\n        .api-status {\n            padding: 12px;\n            border-radius: 8px;\n            margin-top: 10px;\n            text-align: center;\n            font-weight: bold;\n        }\n\n        .api-status.connected {\n            background: #d4edda;\n            color: #155724;\n        }\n\n        .api-status.error {\n            background: #f8d7da;\n            color: #721c24;\n        }\n\n        .api-status.testing {\n            background: #fff3cd;\n            color: #856404;\n        }\n\n        .search-form {\n            background: white;\n            padding: 30px;\n            border-radius: 15px;\n            box-shadow: 0 10px 30px rgba(0,0,0,0.2);\n            margin-bottom: 40px;\n        }\n\n        .form-group {\n            margin-bottom: 20px;\n        }\n\n        .form-group label {\n            display: block;\n            margin-bottom: 8px;\n            font-weight: 600;\n            color: #555;\n        }\n\n        .form-group input, .form-group select {\n            width: 100%;\n            padding: 15px;\n            border: 2px solid #e1e5e9;\n            border-radius: 8px;\n            font-size: 1rem;\n            transition: border-color 0.3s ease;\n        }\n\n        .form-group input:focus, .form-group select:focus {\n            outline: none;\n            border-color: #667eea;\n            box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n        }\n\n        .author-ids {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n            gap: 15px;\n            margin-bottom: 20px;\n        }\n\n        .author-id-btn {\n            background: #f8f9fa;\n            border: 2px solid #e1e5e9;\n            padding: 15px;\n            border-radius: 8px;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            text-align: left;\n        }\n\n        .author-id-btn:hover {\n            border-color: #667eea;\n            background: #f0f4ff;\n        }\n\n        .author-id-btn.selected {\n            border-color: #667eea;\n            background: #e7f3ff;\n        }\n\n        .author-id-btn .name {\n            font-weight: bold;\n            color: #333;\n            margin-bottom: 5px;\n        }\n\n        .author-id-btn .id {\n            font-size: 0.85em;\n            color: #666;\n            font-family: monospace;\n        }\n\n        .search-btn {\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            border: none;\n            padding: 15px 30px;\n            border-radius: 8px;\n            font-size: 1.1rem;\n            font-weight: 600;\n            cursor: pointer;\n            transition: all 0.3s ease;\n            width: 100%;\n        }\n\n        .search-btn:hover:not(:disabled) {\n            transform: translateY(-2px);\n            box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);\n        }\n\n        .search-btn:disabled {\n            opacity: 0.6;\n            cursor: not-allowed;\n        }\n\n        .loading {\n            text-align: center;\n            padding: 40px;\n            color: white;\n            display: none;\n        }\n\n        .loading.show {\n            display: block;\n        }\n\n        .loading-spinner {\n            border: 4px solid rgba(255,255,255,0.3);\n            border-radius: 50%;\n            border-top: 4px solid white;\n            width: 40px;\n            height: 40px;\n            animation: spin 1s linear infinite;\n            margin: 0 auto 20px;\n        }\n\n        @keyframes spin {\n            0% { transform: rotate(0deg); }\n            100% { transform: rotate(360deg); }\n        }\n\n        .message {\n            padding: 15px;\n            border-radius: 8px;\n            margin-bottom: 20px;\n            text-align: center;\n            display: none;\n        }\n\n        .message.show {\n            display: block;\n        }\n\n        .message.error {\n            background: #f8d7da;\n            color: #721c24;\n            border: 1px solid #f5c6cb;\n        }\n\n        .message.warning {\n            background: #fff3cd;\n            color: #856404;\n            border: 1px solid #ffeaa7;\n        }\n\n        .message.success {\n            background: #d4edda;\n            color: #155724;\n            border: 1px solid #c3e6cb;\n        }\n\n        .message.info {\n            background: #d1ecf1;\n            color: #0c5460;\n            border: 1px solid #bee5eb;\n        }\n\n        .results {\n            display: none;\n        }\n\n        .results.show {\n            display: block;\n            animation: fadeIn 0.5s ease;\n        }\n\n        @keyframes fadeIn {\n            from { opacity: 0; transform: translateY(20px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .author-profile {\n            background: white;\n            padding: 30px;\n            border-radius: 15px;\n            margin-bottom: 30px;\n            box-shadow: 0 5px 15px rgba(0,0,0,0.1);\n        }\n\n        .author-header {\n            display: flex;\n            align-items: center;\n            gap: 20px;\n            margin-bottom: 20px;\n        }\n\n        .author-avatar {\n            width: 80px;\n            height: 80px;\n            border-radius: 50%;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: white;\n            font-size: 2rem;\n            font-weight: bold;\n        }\n\n        .author-info h2 {\n            color: #333;\n            margin-bottom: 5px;\n        }\n\n        .author-info .affiliation {\n            color: #666;\n            margin-bottom: 10px;\n        }\n\n        .author-info .interests {\n            color: #888;\n            font-size: 0.9em;\n        }\n\n        .author-stats {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n            gap: 20px;\n            margin-top: 20px;\n        }\n\n        .stat-card {\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            padding: 20px;\n            border-radius: 10px;\n            text-align: center;\n        }\n\n        .stat-number {\n            font-size: 2rem;\n            font-weight: bold;\n            margin-bottom: 5px;\n        }\n\n        .stat-label {\n            font-size: 0.9rem;\n            opacity: 0.9;\n        }\n\n        .charts-container {\n            display: grid;\n            grid-template-columns: 1fr;\n            gap: 30px;\n            margin-bottom: 30px;\n        }\n\n        @media (min-width: 768px) {\n            .charts-container {\n                grid-template-columns: 1fr 1fr;\n            }\n        }\n\n        .chart-card {\n            background: white;\n            padding: 25px;\n            border-radius: 15px;\n            box-shadow: 0 5px 15px rgba(0,0,0,0.1);\n        }\n\n        .chart-card h3 {\n            margin-bottom: 20px;\n            color: #333;\n            text-align: center;\n        }\n\n        .chart-container {\n            position: relative;\n            height: 300px;\n        }\n\n        .publications-table {\n            background: white;\n            border-radius: 15px;\n            overflow: hidden;\n            box-shadow: 0 5px 15px rgba(0,0,0,0.1);\n        }\n\n        .publications-table h3 {\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            color: white;\n            padding: 20px;\n            margin: 0;\n        }\n\n        .table-container {\n            overflow-x: auto;\n            max-height: 500px;\n            overflow-y: auto;\n        }\n\n        table {\n            width: 100%;\n            border-collapse: collapse;\n        }\n\n        th, td {\n            padding: 15px;\n            text-align: left;\n            border-bottom: 1px solid #eee;\n        }\n\n        th {\n            background: #f8f9fa;\n            font-weight: 600;\n            color: #555;\n            position: sticky;\n            top: 0;\n        }\n\n        tr:hover {\n            background: #f8f9fa;\n        }\n\n        .publication-title {\n            font-weight: bold;\n            color: #333;\n            margin-bottom: 5px;\n        }\n\n        .publication-authors {\n            font-size: 0.9em;\n            color: #666;\n            margin-bottom: 3px;\n        }\n\n        .publication-venue {\n            font-size: 0.85em;\n            color: #888;\n            font-style: italic;\n        }\n\n        .citation-count {\n            font-weight: bold;\n            color: #667eea;\n        }\n\n        .no-data {\n            text-align: center;\n            padding: 40px;\n            color: #666;\n            font-style: italic;\n        }\n\n        .progress-bar {\n            width: 100%;\n            height: 4px;\n            background: #e1e5e9;\n            border-radius: 2px;\n            overflow: hidden;\n            margin: 10px 0;\n        }\n\n        .progress-fill {\n            height: 100%;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            width: 0%;\n            transition: width 0.3s ease;\n        }\n\n        .cors-proxy-info {\n            background: #e7f3ff;\n            border: 1px solid #b3d9ff;\n            border-radius: 8px;\n            padding: 15px;\n            margin: 15px 0;\n            font-size: 0.9em;\n        }\n\n        .cors-proxy-info h4 {\n            color: #0066cc;\n            margin-bottom: 10px;\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <!-- Header -->\n        <div class=\"header\">\n            <h1>\ud83d\udcca An\u00e1lisis Bibliom\u00e9trico por ID<\/h1>\n            <p>B\u00fasqueda directa de autores usando Google Scholar Author ID<\/p>\n        <\/div>\n\n        <!-- Configuraci\u00f3n API -->\n        <div class=\"api-config\">\n            <h3>\ud83d\udd11 Configuraci\u00f3n de SerpApi<\/h3>\n<p><a href=\"https:\/\/serpapi.com\/manage-api-key\" target=\"_blank\">\n  Accede para crearte una API de SerpApi\n<\/a><\/p>\n            <div class=\"api-input-group\">\n                <input type=\"password\" id=\"apiKey\" placeholder=\"API Key de SerpApi\" value=\"e7b7831f1a50ebd83a65992a4717192003742514315207f501c790efe0e537da\">\n                <button class=\"test-btn\" id=\"testApiBtn\">Probar API<\/button>\n            <\/div>\n            <div class=\"api-status\" id=\"apiStatus\"><\/div>\n            \n            <div class=\"cors-proxy-info\">\n                <h4>\u2139\ufe0f Informaci\u00f3n del Sistema<\/h4>\n                <p>Este sistema usa el endpoint <code>google_scholar_author<\/code> con IDs espec\u00edficos de investigadores para obtener datos detallados directamente de Google Scholar.<\/p>\n            <\/div>\n        <\/div>\n\n        <!-- Mensajes -->\n        <div class=\"message\" id=\"messageContainer\"><\/div>\n\n        <!-- Formulario de b\u00fasqueda -->\n        <div class=\"search-form\">\n            <div class=\"form-group\">\n                <label for=\"authorId\">\ud83d\udd0d ID del Autor de Google Scholar:<\/label>\n                <input type=\"text\" id=\"authorId\" placeholder=\"Ej: rYOPP2cAAAAJ\" value=\"rYOPP2cAAAAJ\">\n                <small style=\"color: #666; margin-top: 5px; display: block;\">\n                    Puedes encontrar el ID en la URL del perfil de Google Scholar: \n                    <code>https:\/\/scholar.google.com\/citations?user=<strong>Tpe0wwIAAAAJ<\/strong><\/code>\n                <\/small>\n            <\/div>\n\n            <div class=\"form-group\">\n                <label>\ud83d\udcda O selecciona un investigador conocido:<\/label>\n                <div class=\"author-ids\">\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('Tpe0wwIAAAAJ')\">\n                        <div class=\"name\">Dra. Mayra Alb\u00e1n, PhD<\/div>\n                        <div class=\"id\">Tpe0wwIAAAAJ<\/div>\n                    <\/div>\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('5PNrbPkAAAAJ')\">\n                        <div class=\"name\">Dr. Carlos Torres, PhD.<\/div>\n                        <div class=\"id\">5PNrbPkAAAAJ<\/div>\n                    <\/div>\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('KMRb_iAAAAAJ')\">\n                        <div class=\"name\">Dr. Edilberto Chac\u00f3n, PhD.<\/div>\n                        <div class=\"id\">KMRb_iAAAAAJ<\/div>\n                    <\/div>\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('FjMA-NYAAAAJ')\">\n                        <div class=\"name\">Mg. Ricardo Ure\u00f1a<\/div>\n                        <div class=\"id\">FjMA-NYAAAAJ<\/div>\n                    <\/div>\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('ulakui0AAAAJ')\">\n                        <div class=\"name\">Mg. Alex Mullo<\/div>\n                        <div class=\"id\">ulakui0AAAAJ<\/div>\n                    <\/div>\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('Sl208icAAAAJ')\">\n                        <div class=\"name\">Roberto Hern\u00e1ndez Sampieri<\/div>\n                        <div class=\"id\">Sl208icAAAAJ<\/div>\n                    <\/div>\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('5hUf1-sAAAAJ')\">\n                        <div class=\"name\">Dr. Michael Anthony Davis, PhD.<\/div>\n                        <div class=\"id\">5hUf1-sAAAAJ<\/div>\n                    <\/div>\n                    <div class=\"author-id-btn\" onclick=\"selectAuthor('tvUH3WMAAAAJ')\">\n                        <div class=\"name\">Sepp Hochreiter<\/div>\n                        <div class=\"id\">tvUH3WMAAAAJ<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n            \n            <button class=\"search-btn\" id=\"searchBtn\">\ud83d\ude80 Analizar Autor<\/button>\n        <\/div>\n\n        <!-- Estado de carga -->\n        <div class=\"loading\" id=\"loadingState\">\n            <div class=\"loading-spinner\"><\/div>\n            <p id=\"loadingText\">Obteniendo datos del autor&#8230;<\/p>\n            <p><small id=\"loadingSubtext\">Consultando Google Scholar<\/small><\/p>\n            <div class=\"progress-bar\">\n                <div class=\"progress-fill\" id=\"progressFill\"><\/div>\n            <\/div>\n        <\/div>\n\n        <!-- Resultados -->\n        <div class=\"results\" id=\"resultsContainer\">\n            <!-- Perfil del autor -->\n            <div class=\"author-profile\">\n                <div class=\"author-header\">\n                    <div class=\"author-avatar\" id=\"authorAvatar\">?<\/div>\n                    <div class=\"author-info\">\n                        <h2 id=\"authorName\">Nombre del Autor<\/h2>\n                        <div class=\"affiliation\" id=\"authorAffiliation\">Afiliaci\u00f3n<\/div>\n                        <div class=\"interests\" id=\"authorInterests\">\u00c1reas de inter\u00e9s<\/div>\n                    <\/div>\n                <\/div>\n                \n                <div class=\"author-stats\">\n                    <div class=\"stat-card\">\n                        <div class=\"stat-number\" id=\"totalCitations\">&#8230;<\/div>\n                        <div class=\"stat-label\">Citas Totales<\/div>\n                    <\/div>\n                    <div class=\"stat-card\">\n                        <div class=\"stat-number\" id=\"hIndex\">&#8230;<\/div>\n                        <div class=\"stat-label\">\u00cdndice H<\/div>\n                    <\/div>\n                    <div class=\"stat-card\">\n                        <div class=\"stat-number\" id=\"i10Index\">&#8230;<\/div>\n                        <div class=\"stat-label\">\u00cdndice i10<\/div>\n                    <\/div>\n                    <div class=\"stat-card\">\n                        <div class=\"stat-number\" id=\"totalPublications\">&#8230;<\/div>\n                        <div class=\"stat-label\">Publicaciones<\/div>\n                    <\/div>\n                    <div class=\"stat-card\">\n                        <div class=\"stat-number\" id=\"coAuthors\">&#8230;<\/div>\n                        <div class=\"stat-label\">Coautores<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <!-- Gr\u00e1ficos \n            <div class=\"charts-container\">\n                -->\n                <!-- Gr\u00e1fico de citas por a\u00f1o \n                <div class=\"chart-card\">\n                    <h3>\ud83d\udcc8 Citas por A\u00f1o<\/h3>\n                    <div class=\"chart-container\">\n                        <canvas id=\"citationsChart\"><\/canvas>\n                    <\/div>\n                <\/div>\n-->\n                <!-- Gr\u00e1fico de publicaciones por a\u00f1o -->\n                <div class=\"chart-card\">\n                    <h3>\ud83d\udcda Publicaciones por A\u00f1o<\/h3>\n                    <div class=\"chart-container\">\n                        <canvas id=\"publicationsChart\"><\/canvas>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <!-- Tabla de publicaciones -->\n            <div class=\"publications-table\">\n                <h3>\ud83d\udccb Publicaciones Principales<\/h3>\n                <div class=\"table-container\">\n                    <table>\n                        <thead>\n                            <tr>\n                                <th>T\u00edtulo<\/th>\n                                <th>Autores<\/th>\n                                <th>Publicaci\u00f3n<\/th>\n                                <th>A\u00f1o<\/th>\n                                <th>Citas<\/th>\n                            <\/tr>\n                        <\/thead>\n                        <tbody id=\"publicationsTableBody\">\n                        <\/tbody>\n                    <\/table>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n        \/\/ Variables globales\n        let currentAuthorData = null;\n        let charts = {};\n        let apiKey = 'e7b7831f1a50ebd83a65992a4717192003742514315207f501c790efe0e537da';\n\n        \/\/ Funci\u00f3n para mostrar mensajes\n        function showMessage(text, type = 'info', duration = 5000) {\n            const messageContainer = document.getElementById('messageContainer');\n            messageContainer.textContent = text;\n            messageContainer.className = `message show ${type}`;\n            \n            setTimeout(() => {\n                messageContainer.classList.remove('show');\n            }, duration);\n        }\n\n        \/\/ Funci\u00f3n para mostrar estado de API\n        function showApiStatus(status, message) {\n            const statusDiv = document.getElementById('apiStatus');\n            statusDiv.className = `api-status ${status}`;\n            statusDiv.textContent = message;\n        }\n\n        \/\/ Funci\u00f3n para actualizar progreso\n        function updateProgress(percentage, text, subtext) {\n            document.getElementById('progressFill').style.width = `${percentage}%`;\n            if (text) document.getElementById('loadingText').textContent = text;\n            if (subtext) document.getElementById('loadingSubtext').textContent = subtext;\n        }\n\n        \/\/ Funci\u00f3n para seleccionar autor predefinido\n        function selectAuthor(authorId) {\n            document.getElementById('authorId').value = authorId;\n            \n            \/\/ Actualizar estilos visuales\n            document.querySelectorAll('.author-id-btn').forEach(btn => {\n                btn.classList.remove('selected');\n            });\n            event.target.closest('.author-id-btn').classList.add('selected');\n        }\n\n        \/\/ Funci\u00f3n para probar la API\n        async function testApiConnection() {\n            const key = document.getElementById('apiKey').value.trim();\n            \n            if (!key) {\n                showMessage('Por favor ingresa tu API Key primero', 'error');\n                return;\n            }\n\n            showApiStatus('testing', '\ud83d\udd04 Probando conexi\u00f3n...');\n            \n            try {\n                \/\/ Usar proxy CORS para la prueba\n                const testUrl = `https:\/\/api.allorigins.win\/get?url=${encodeURIComponent(`https:\/\/serpapi.com\/search.json?engine=google_scholar_author&author_id=rYOPP2cAAAAJ&api_key=${key}&hl=en`)}`;\n                \n                const response = await fetch(testUrl);\n                const proxyData = await response.json();\n                \n                if (proxyData.status && proxyData.status.http_code === 200) {\n                    const data = JSON.parse(proxyData.contents);\n                    \n                    if (!data.error) {\n                        apiKey = key;\n                        localStorage.setItem('serpapi_key', key);\n                        showApiStatus('connected', '\u2705 Conexi\u00f3n exitosa');\n                        showMessage('API Key v\u00e1lida y funcionando correctamente', 'success');\n                    } else {\n                        throw new Error(data.error);\n                    }\n                } else {\n                    throw new Error('Error en la respuesta del proxy');\n                }\n            } catch (error) {\n                console.error('Error testing API:', error);\n                showApiStatus('error', '\u274c Error de conexi\u00f3n');\n                showMessage(`Error: ${error.message}`, 'error');\n            }\n        }\n\n        \/\/ Funci\u00f3n para obtener datos del autor\n        async function getAuthorData(authorId) {\n            const proxyUrl = `https:\/\/api.allorigins.win\/get?url=${encodeURIComponent(`https:\/\/serpapi.com\/search.json?engine=google_scholar_author&author_id=${authorId}&api_key=${apiKey}&hl=en`)}`;\n            \n            console.log('Fetching author data:', proxyUrl);\n\n            const response = await fetch(proxyUrl);\n            const proxyData = await response.json();\n            \n            if (!response.ok || !proxyData.status || proxyData.status.http_code !== 200) {\n                throw new Error(`Error del proxy: ${response.status}`);\n            }\n            \n            const data = JSON.parse(proxyData.contents);\n            \n            if (data.error) {\n                throw new Error(`Error de SerpApi: ${data.error}`);\n            }\n\n            return data;\n        }\n\n        \/\/ Funci\u00f3n para procesar datos del autor\n        function processAuthorData(data) {\n            console.log('Processing author data:', data);\n            \n            const author = data.author || {};\n            const citedBy = data.cited_by || {};\n            const articles = data.articles || [];\n            const coAuthors = data.co_authors || [];\n\n            return {\n                name: author.name || 'Nombre no disponible',\n                affiliation: author.affiliation || 'Afiliaci\u00f3n no disponible',\n                interests: author.interests ? author.interests.join(', ') : 'No especificados',\n                email: author.email || '',\n                website: author.website || '',\n                citedBy: {\n                    total: citedBy.total || 0,\n                    hIndex: citedBy.h_index || 0,\n                    i10Index: citedBy.i10_index || 0\n                },\n                citedByGraph: data.cited_by_graph || [],\n                publicGraph: data.public_access_graph || [],\n                articles: articles,\n                coAuthors: coAuthors.length,\n                thumbnail: author.thumbnail || ''\n            };\n        }\n\n        \/\/ Funci\u00f3n para mostrar estado de carga\n        function showLoading(show) {\n            const loadingState = document.getElementById('loadingState');\n            const searchBtn = document.getElementById('searchBtn');\n            \n            if (show) {\n                loadingState.classList.add('show');\n                searchBtn.disabled = true;\n                updateProgress(0, 'Iniciando b\u00fasqueda...', '');\n            } else {\n                loadingState.classList.remove('show');\n                searchBtn.disabled = false;\n            }\n        }\n\n        \/\/ Funci\u00f3n para actualizar perfil del autor\n        function updateAuthorProfile(authorData) {\n            document.getElementById('authorName').textContent = authorData.name;\n            document.getElementById('authorAffiliation').textContent = authorData.affiliation;\n            document.getElementById('authorInterests').textContent = authorData.interests;\n            \n            \/\/ Avatar con inicial del nombre\n            const avatar = document.getElementById('authorAvatar');\n            avatar.textContent = authorData.name.charAt(0).toUpperCase();\n            \n            \/\/ Estad\u00edsticas\n            document.getElementById('totalCitations').textContent = authorData.citedBy.total.toLocaleString();\n            document.getElementById('hIndex').textContent = authorData.citedBy.hIndex;\n            document.getElementById('i10Index').textContent = authorData.citedBy.i10Index;\n            document.getElementById('totalPublications').textContent = authorData.articles.length;\n            document.getElementById('coAuthors').textContent = authorData.coAuthors;\n        }\n\n        \/\/ Funci\u00f3n para crear gr\u00e1fico de citas por a\u00f1o\n        function createCitationsChart(citedByGraph) {\n            const ctx = document.getElementById('citationsChart').getContext('2d');\n            \n            if (charts.citationsChart) {\n                charts.citationsChart.destroy();\n            }\n\n            const years = citedByGraph.map(item => item.year);\n            const citations = citedByGraph.map(item => item.citations);\n\n            charts.citationsChart = new Chart(ctx, {\n                type: 'line',\n                data: {\n                    labels: years,\n                    datasets: [{\n                        label: 'Citas',\n                        data: citations,\n                        backgroundColor: 'rgba(102, 126, 234, 0.2)',\n                        borderColor: 'rgba(102, 126, 234, 1)',\n                        borderWidth: 2,\n                        fill: true,\n                        tension: 0.4\n                    }]\n                },\n                options: {\n                    responsive: true,\n                    maintainAspectRatio: false,\n                    plugins: {\n                        legend: {\n                            display: false\n                        }\n                    },\n                    scales: {\n                        y: {\n                            beginAtZero: true,\n                            title: {\n                                display: true,\n                                text: 'N\u00famero de Citas'\n                            }\n                        },\n                        x: {\n                            title: {\n                                display: true,\n                                text: 'A\u00f1o'\n                            }\n                        }\n                    }\n                }\n            });\n        }\n\n        \/\/ Funci\u00f3n para crear gr\u00e1fico de publicaciones por a\u00f1o\n        function createPublicationsChart(articles) {\n            const ctx = document.getElementById('publicationsChart').getContext('2d');\n            \n            if (charts.publicationsChart) {\n                charts.publicationsChart.destroy();\n            }\n\n            \/\/ Agrupar publicaciones por a\u00f1o\n            const publicationsByYear = {};\n            articles.forEach(article => {\n                if (article.year) {\n                    const year = parseInt(article.year);\n                    if (!isNaN(year)) {\n                        publicationsByYear[year] = (publicationsByYear[year] || 0) + 1;\n                    }\n                }\n            });\n\n            const years = Object.keys(publicationsByYear).sort();\n            const publications = years.map(year => publicationsByYear[year]);\n\n            charts.publicationsChart = new Chart(ctx, {\n                type: 'bar',\n                data: {\n                    labels: years,\n                    datasets: [{\n                        label: 'Publicaciones',\n                        data: publications,\n                        backgroundColor: 'rgba(118, 75, 162, 0.8)',\n                        borderColor: 'rgba(118, 75, 162, 1)',\n                        borderWidth: 2,\n                        borderRadius: 5\n                    }]\n                },\n                options: {\n                    responsive: true,\n                    maintainAspectRatio: false,\n                    plugins: {\n                        legend: {\n                            display: false\n                        }\n                    },\n                    scales: {\n                        y: {\n                            beginAtZero: true,\n                            title: {\n                                display: true,\n                                text: 'N\u00famero de Publicaciones'\n                            }\n                        },\n                        x: {\n                            title: {\n                                display: true,\n                                text: 'A\u00f1o'\n                            }\n                        }\n                    }\n                }\n            });\n        }\n\n        \/\/ Funci\u00f3n para crear tabla de publicaciones\n        function createPublicationsTable(articles) {\n            const tbody = document.getElementById('publicationsTableBody');\n            tbody.innerHTML = '';\n\n            if (articles.length === 0) {\n                tbody.innerHTML = '<tr><td colspan=\"5\" class=\"no-data\">No se encontraron publicaciones<\/td><\/tr>';\n                return;\n            }\n\n            \/\/ Ordenar por n\u00famero de citas (descendente)\n            const sortedArticles = articles.sort((a, b) => {\n                const citesA = a.cited_by ? (a.cited_by.value || 0) : 0;\n                const citesB = b.cited_by ? (b.cited_by.value || 0) : 0;\n                return citesB - citesA;\n            });\n\n            sortedArticles.forEach(article => {\n                const row = document.createElement('tr');\n                row.innerHTML = `\n                    <td>\n                        <div class=\"publication-title\">${article.title || 'Sin t\u00edtulo'}<\/div>\n                    <\/td>\n                    <td>\n                        <div class=\"publication-authors\">${article.authors || 'Autores no especificados'}<\/div>\n                    <\/td>\n                    <td>\n                        <div class=\"publication-venue\">${article.publication || 'No especificado'}<\/div>\n                    <\/td>\n                    <td>${article.year || 'N\/A'}<\/td>\n                    <td>\n                        <span class=\"citation-count\">${article.cited_by ? (article.cited_by.value || 0).toLocaleString() : '0'}<\/span>\n                    <\/td>\n                `;\n                tbody.appendChild(row);\n            });\n        }\n\n        \/\/ Funci\u00f3n principal de b\u00fasqueda\n        async function performSearch() {\n            const authorId = document.getElementById('authorId').value.trim();\n            \n            if (!apiKey) {\n                showMessage('Por favor, configura tu API Key de SerpApi primero', 'error');\n                return;\n            }\n\n            if (!authorId) {\n                showMessage('Por favor, ingresa un ID de autor', 'error');\n                return;\n            }\n\n            \/\/ Mostrar estado de carga\n            showLoading(true);\n            document.getElementById('resultsContainer').classList.remove('show');\n\n            try {\n                updateProgress(30, 'Obteniendo datos del autor...', `ID: ${authorId}`);\n                \n                const rawData = await getAuthorData(authorId);\n                currentAuthorData = processAuthorData(rawData);\n\n                updateProgress(60, 'Procesando informaci\u00f3n...', 'Generando visualizaciones');\n\n                \/\/ Actualizar interfaz\n                updateAuthorProfile(currentAuthorData);\n                \n                updateProgress(80, 'Creando gr\u00e1ficos...', 'Finalizando an\u00e1lisis');\n\n                \/\/ Crear gr\u00e1ficos\n                if (currentAuthorData.citedByGraph.length > 0) {\n                    createCitationsChart(currentAuthorData.citedByGraph);\n                }\n                \n                createPublicationsChart(currentAuthorData.articles);\n                createPublicationsTable(currentAuthorData.articles);\n\n                updateProgress(100, 'An\u00e1lisis completado', '');\n\n                \/\/ Mostrar resultados\n                setTimeout(() => {\n                    document.getElementById('resultsContainer').classList.add('show');\n                    showMessage(`\u2705 An\u00e1lisis completado para ${currentAuthorData.name}`, 'success');\n                }, 500);\n\n            } catch (error) {\n                console.error('Error en b\u00fasqueda:', error);\n                showMessage(`Error: ${error.message}`, 'error', 8000);\n            } finally {\n                showLoading(false);\n            }\n        }\n\n        \/\/ Event listeners\n        document.getElementById('testApiBtn').addEventListener('click', testApiConnection);\n        document.getElementById('searchBtn').addEventListener('click', performSearch);\n\n        document.getElementById('authorId').addEventListener('keypress', function(e) {\n            if (e.key === 'Enter') {\n                performSearch();\n            }\n        });\n\n        \/\/ Hacer funciones globales\n        window.selectAuthor = selectAuthor;\n\n        \/\/ Inicializaci\u00f3n\n        document.addEventListener('DOMContentLoaded', function() {\n            console.log('Aplicaci\u00f3n iniciada - B\u00fasqueda por ID de autor');\n            \n            \/\/ API key ya est\u00e1 configurada\n            showApiStatus('connected', '\u2705 API Key configurada');\n            \n            \/\/ Mostrar mensaje de bienvenida\n            showMessage('\ud83c\udfaf Sistema listo. Selecciona un autor o ingresa un ID para comenzar el an\u00e1lisis', 'info', 5000);\n            \n            \/\/ Seleccionar el primer autor por defecto\n            selectAuthor('rYOPP2cAAAAJ');\n        });\n    <\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>An\u00e1lisis Bibliom\u00e9trico por ID de Autor \ud83d\udcca An\u00e1lisis Bibliom\u00e9trico por ID B\u00fasqueda directa de autores usando Google Scholar Author ID [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_eb_attr":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-2748","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=\/wp\/v2\/pages\/2748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2748"}],"version-history":[{"count":8,"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=\/wp\/v2\/pages\/2748\/revisions"}],"predecessor-version":[{"id":2809,"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=\/wp\/v2\/pages\/2748\/revisions\/2809"}],"wp:attachment":[{"href":"https:\/\/biblioteca.utc.edu.ec\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}