API RIOT GAMES
Esta es el post sobre la API de Riot Games
Cómo funciona la integración de Riot Games en mi Portfolio
Para mostrar mis estadísticas de League of Legends en tiempo real sin saturar la cuota de la API de Riot Games, he diseñado una estrategia "Offline-First". Esto significa que las visitas web nunca atacan la API directamente. En su lugar, un comando automático en segundo plano consulta los datos de Riot, los procesa y guarda una "foto" o Snapshot en un archivo JSON local.
El flujo de llamadas a la API (Paso a Paso)
La API de Riot exige realizar peticiones encadenadas. Con solo disponer de mi gameName (titorepetto) y mi tagLine (tdah), el proceso en mi servidor Laravel sigue este orden estricto de llamadas y procesado de tipos de datos:
Obtener la cuenta base (PUUID)
El primer paso es buscar el identificador universal interno del jugador, conocido como PUUID. Para ello llamamos al endpoint account-v1. Datos que entran: gameName (String) y tagLine (String). Datos que salen: El puuid (String).
private function fetchPuuid(): ?string
{
// Llama a: https://europe.api.riotgames.com/riot/account/v1/accounts/by-riot-id/{gameName}/{tagLine}
$data = $this->apiGet($url);
// Retorna el Universal ID de Riot (String)
return $data['puuid'] ?? null;
}
Cargar los detalles del Invocador
Usando el PUUID obtenido, llamamos al endpoint summoner-v4. De aquí sacamos información básica como el nivel de la cuenta y el icono de perfil. Datos que entran: puuid (String). Datos que salen: Datos del Invocador (Array).
private function fetchSummoner(string $puuid): ?array
{
// Llama a: https://euw1.api.riotgames.com/lol/summoner/v4/summoners/by-puuid/{puuid}
// Retorna un Array con ['summonerLevel' (int), 'profileIconId' (int), etc.]
return $this->apiGet($url);
}
Consultar la Liga y Estadísticas (Ranked)
El tercer paso es conectar con league-v4 cruzando el PUUID. Esto nos devuelve una lista de todas las colas competitivas (SoloQ, Flex) con sus victorias, derrotas, rango y puntos. Datos que entran: puuid (String). Datos que salen: Lista de Ligas (Array de Arrays).
private function fetchRanked(string $puuid): array
{
// Llama a: https://euw1.api.riotgames.com/lol/league/v4/entries/by-puuid/{puuid}
// Calcula la tasa de victoria (Float) usando victorias (Int) y derrotas (Int)
$winRate = round(($wins / $total) * 100, 1);
// Retorna Array final con ['tier' (String), 'lp' (int), 'win_rate' (Float), etc.]
}
Rescatar los Top 3 Campeones (Maestría)
Para darle más atractivo visual al widget, llamo al endpoint champion-mastery-v4 pasándole el límite específico en la URL (?count=3). Además cruzo los championId con la información de DataDragon para sacar el nombre del campeón en texto. Datos que entran: puuid (String). Datos que salen: Top 3 campeones jugados (Array de Arrays).
private function fetchTopChampions(string $puuid): array
{
// Llama a: https://euw1.api.riotgames.com/lol/champion-mastery/v4/champion-masteries/by-puuid/{puuid}/top?count=3
// Retorna un Array con los campeones y su ['mastery_level' (Int), 'mastery_points' (Int)]
}
Consolidación y creación del Snapshot (JSON)
Una vez hemos acumulado los datos de perfil, ligas y campeones, juntamos todo en un único Array global y lo convertimos a formato de texto plano (String JSON). Esto se guarda físicamente en el servidor e incluye un pequeño Timestamp fecha/hora (String) para saber exactamente cuándo fue actualizado.
public function saveSnapshot(array $stats): void
{
// Añade el string de la hora de la actualización
$stats['updated_at'] = now()->toIso8601String();
// Transforma el Array PHP multidimensional a un String JSON legible
Storage::put(
'lol-stats.json',
json_encode($stats, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
);
}
Resultados y Rendimiento
Al implementar este flujo por detrás (y no consultar los 4 endpoints de la API con cada usuario visitando la web), pasamos de tardar cerca de 1.2 segundos por carga, a simplemente leer el archivo JSON estático lol-stats.json, lo que toma un tiempo ridículo de lectura local de ~0.005 segundos. Un win-win entre optimización y experiencia de usuario.