API GitHub Analytics
Estadísticas y métricas de repositorios en tiempo real
Documentación completa para obtener y mostrar datos de GitHub de forma eficiente.
GitHub Analytics API
Estadísticas y métricas de repositorios en tiempo real
Esta API personalizada obtiene y procesa datos reales de GitHub desde el usuario'MiguelVivar'. Implementa 8 funciones principales que consultan la API oficial de GitHub para mostrar estadísticas completas sobre repositorios, contribuciones, lenguajes de programación y actividad reciente. Incluye manejo inteligente de errores, procesamiento de hasta 300 eventos para análisis de contribuciones, y soporte para 20+ lenguajes con sus respectivos colores de identificación.
Funcionalidades
Estadísticas de Repos
Procesa hasta 100 repositorios ordenados por actualización, filtra forks y archivados
Análisis de Commits
Calcula commits aproximados desde eventos de GitHub + estimación base de 500 commits
Lenguajes de Programación
Analiza hasta 15 repositorios activos con mapeo de 20+ colores específicos por lenguaje
Actividad Reciente
Formatea los últimos 30 eventos: PushEvent, CreateEvent, WatchEvent y ForkEvent
Métricas de Popularidad
Suma automática de todas las estrellas de repositorios y métricas de seguidores
Tipado Completo
6 interfaces principales: GitHubUser, GitHubRepo, GitHubEvent, ContributionStats y más
Funciones Disponibles
// 8 funciones principales implementadas en el proyecto
// 1. Obtener datos del usuario específico (MiguelVivar)
const user = await fetchGitHubUser();
// URL: https://api.github.com/users/MiguelVivar
// 2. Obtener repositorios (ordenados por actualización, máximo 100)
const repos = await fetchGitHubRepos();
// URL: https://api.github.com/users/MiguelVivar/repos?sort=updated&per_page=100
// 3. Calcular estadísticas de lenguajes (de repositorios activos)
const languages = await calculateLanguageStats(repos);
// Procesa hasta 15 repositorios activos (no forks, no archivados)
// Incluye 20+ lenguajes con colores específicos
// 4. Obtener estadísticas generales calculadas
const stats = await calculateGitHubStats();
// Combina datos de usuario, repos y eventos
// 5. Obtener actividad reciente (últimos 30 eventos)
const events = await fetchGitHubEvents();
// URL: https://api.github.com/users/MiguelVivar/events?per_page=30
// 6. Formatear actividad reciente en formato legible
const activity = formatRecentActivity(events);
// Convierte eventos de GitHub en objetos ActivityItem
// 7. Obtener lenguajes de un repositorio específico
const repoLanguages = await fetchRepoLanguages('Portafolio');
// URL: https://api.github.com/repos/MiguelVivar/{repoName}/languages
// 8. Obtener datos de contribuciones (hasta 300 eventos)
const contributions = await fetchGitHubContributions();
// Procesa múltiples páginas de eventos para estadísticas anuales
Interfaces TypeScript
// Interfaces TypeScript reales implementadas
interface GitHubUser {
public_repos: number;
followers: number;
following: number;
created_at: string;
login: string;
name: string;
bio: string;
location: string;
blog: string;
twitter_username: string;
company: string;
}
interface GitHubRepo {
id: number;
name: string;
full_name: string;
description: string;
html_url: string;
stargazers_count: number;
forks_count: number;
language: string;
updated_at: string;
created_at: string;
pushed_at: string;
fork: boolean;
archived: boolean;
topics: string[];
}
interface GitHubEvent {
id: string;
type: string;
actor: { login: string };
repo: { name: string };
payload: {
commits?: Array<{ message: string }>;
ref_type?: string;
[key: string]: unknown;
};
created_at: string;
}
interface LanguageStats {
[language: string]: number;
}
interface ContributionDay {
date: string;
contributions: number;
level: number; // 0-4 intensity level
}
interface ContributionStats {
totalContributions: number;
currentStreak: number;
longestStreak: number;
weeklyAverage: number;
contributions: ContributionDay[];
}
interface LanguageData {
name: string;
percentage: number;
color: string;
}
interface ActivityItem {
type: 'commit' | 'repository' | 'star' | 'fork';
message: string;
date: string;
repository?: string;
}
Ejemplo de Uso
// Importar funciones de la API real
import {
fetchAllGitHubData,
fetchGitHubUser,
fetchGitHubRepos,
calculateLanguageStats,
fetchGitHubEvents,
calculateGitHubStats,
fetchGitHubContributions
} from '@/lib/githubApi';
// Usuario de GitHub configurado: 'MiguelVivar'
const GITHUB_USERNAME = 'MiguelVivar';
const GITHUB_API_BASE = 'https://api.github.com';
// Obtener todos los datos de GitHub en una sola llamada
const githubData = await fetchAllGitHubData();
console.log(githubData);
// Output real del proyecto:
{
stats: {
totalRepositories: 42,
totalContributions: 1248,
totalStars: 156,
totalFollowers: 89,
totalCommits: 2340,
publicRepos: 38
},
languages: [
{ name: 'TypeScript', percentage: 35, color: '#3178c6' },
{ name: 'JavaScript', percentage: 28, color: '#f7df1e' },
{ name: 'Python', percentage: 18, color: '#3776ab' },
{ name: 'CSS', percentage: 12, color: '#1572b6' },
{ name: 'HTML', percentage: 7, color: '#e34f26' }
],
recentActivity: [
{
type: 'commit',
message: 'feat: Implementar dashboard de GitHub',
date: '2024-05-24',
repository: 'Portafolio'
},
{
type: 'repository',
message: 'Creado nuevo repositorio: Portfolio-2024',
date: '2024-05-23'
}
]
}
Implementación en React
// Implementación real en GitHubDashboard.tsx
import React, { useEffect, useState } from 'react';
import { motion } from 'framer-motion';
import { FaGithub, FaStar, FaCodeBranch, FaUsers, FaCode } from 'react-icons/fa';
import { BiGitCommit } from 'react-icons/bi';
import { fetchAllGitHubData } from '../../lib/githubApi';
const GitHubDashboard: React.FC = () => {
const [stats, setStats] = useState({
totalRepositories: 0,
totalContributions: 0,
totalStars: 0,
totalFollowers: 0,
totalCommits: 0,
publicRepos: 0
});
const [languages, setLanguages] = useState([]);
const [recentActivity, setRecentActivity] = useState([]);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchGitHubData = async () => {
try {
setIsLoading(true);
setError(null);
// Llamada a la API real
const data = await fetchAllGitHubData();
setStats(data.stats);
setLanguages(data.languages);
setRecentActivity(data.recentActivity);
} catch (error) {
console.error('Error fetching GitHub data:', error);
setError('Error al cargar datos de GitHub. Usando datos de respaldo.');
// Fallback a datos simulados
setStats({
totalRepositories: 42,
totalContributions: 1248,
totalStars: 156,
totalFollowers: 89,
totalCommits: 2340,
publicRepos: 38
});
} finally {
setIsLoading(false);
}
};
fetchGitHubData();
}, []);
// Renderizado con componentes especializados
return (
<div className="space-y-8">
<GitHubStatsCard stats={stats} loading={isLoading} />
<LanguageChart languages={languages} />
<ContributionGraph />
<RecentActivity activities={recentActivity} />
</div>
);
};
Endpoints de GitHub API
Endpoints Utilizados
GET /users/MiguelVivar
Información del perfil de usuario
GET /users/MiguelVivar/repos?sort=updated&per_page=100
Lista de repositorios ordenados por actualización
GET /users/MiguelVivar/events?per_page=30
Eventos y actividad reciente del usuario
GET /repos/MiguelVivar/{repo}/languages
Estadísticas de lenguajes por repositorio
Límites y Consideraciones
Configuración del Proyecto
Configuración Actual
'MiguelVivar'
api.github.com
githubApi.ts
389 líneas
Componentes Relacionados
GitHubDashboard.tsx
GitHubStatsCard.tsx
LanguageChart.tsx
RecentActivity.tsx
Manejo de Errores y Datos de Respaldo
Estrategia de Recuperación
La implementación incluye un sistema robusto de manejo de errores con datos de respaldo para garantizar que la interfaz siempre muestre información relevante, incluso cuando la API de GitHub no esté disponible.
Datos de Respaldo
- • 42 repositorios totales
- • 1,248 contribuciones
- • 156 estrellas ganadas
- • 89 seguidores
- • 2,340 commits estimados
Lenguajes de Respaldo
- • TypeScript (35%)
- • JavaScript (28%)
- • Python (18%)
- • CSS (12%)
- • HTML (7%)
Códigos de Error Manejados
Rate Limit Exceeded
Límite de 60 requests/hora excedido
Network Error
Error de conectividad o timeout
Repository Not Found
Repositorio privado o no encontrado
Implementación del Try-Catch
try {
setIsLoading(true);
setError(null);
const data = await fetchAllGitHubData();
setStats(data.stats);
setLanguages(data.languages);
setRecentActivity(data.recentActivity);
} catch (error) {
console.error('Error fetching GitHub data:', error);
setError('Error al cargar datos de GitHub. Usando datos de respaldo.');
// Fallback a datos simulados en caso de error
setStats({ /* datos de respaldo */ });
setLanguages({ /* lenguajes de respaldo */ });
} finally {
setIsLoading(false);
}
Mapeo de Colores por Lenguaje
La API incluye un mapeo de colores específico para cada lenguaje de programación, utilizado en las visualizaciones de gráficos y estadísticas.
Nota: Los lenguajes no incluidos en este mapeo utilizan el color predeterminado #64748b. Los colores están basados en los estándares oficiales de cada lenguaje.
Enlaces y Recursos
Documentación Oficial
Recursos Adicionales
Documentación Técnica Completa
Explora la documentación completa del portafolio, incluyendo arquitectura, sistema de terminal, componentes y guías de desarrollo.
Ver Documentación Completa¿Necesitas ayuda con la implementación??
Contáctame para soporte personalizado y optimización de tu integración.