Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자가 될래요

Riot API 사용해보기(2) 본문

프로젝트

Riot API 사용해보기(2)

Youcan 2024. 9. 11. 20:00

Riot API들을 하나하나 보다보니, puuid 뿐만 아니라, 요청을 보내는데 필요한 것들이 더 있었다.

 

SUMMONER 탭을 들어가면 역시 여러 api 주소가 있는데, 이중에서 3번째에 있는 

/lol/summoner/v4/summoners/by-puuid/{encryptedPUUID}를 보니 이전에 구했던 puuid를 이용하여 정보를 얻어 올 수 있을 것 같다.

정보는 accountId, profileIconId, revisionDate, id, puuid, summoner Level을 반환한다.

 

 

그럼 한번 hide on bush의 정보를 보자.

hide on bush#kr1의 puuid를 얻어주고.. /lol/summoner/v4/summoners/by-puuid/{encryptedPUUID} 요청을 보낼 서버와 클라이언트 페이지를 만들어 주자.

 

summoner.tsx

더보기

// src/app/components/riot/summoner.tsx

 

"use client";

import { useState } from "react";

export default function SummonerComponent() {
  const [encryptedPUUID, setEncryptedPUUID] = useState("");
  const [summonerData, setSummonerData] = useState<any>(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  const handleFetchSummoner = async () => {
    setLoading(true);
    setError("");
    setSummonerData(null);

    try {
      const response = await fetch(
        `/api/riot/summoner?encryptedPUUID=${encryptedPUUID}`,
        {
          method: "GET",
        }
      );

      if (!response.ok) {
        const errorData = await response.json();
        setError(errorData.error || "An error occurred");
        return;
      }

      const data = await response.json();
      setSummonerData(data);
    } catch (err) {
      setError("Failed to fetch summoner data");
    } finally {
      setLoading(false);
    }
  };

  return (
    <div className="flex flex-col items-center justify-center min-h-screen p-4 bg-gray-100">
      <h1 className="text-2xl font-bold mb-6">Summoner Page</h1>

      <input
        type="text"
        value={encryptedPUUID}
        onChange={(e) => setEncryptedPUUID(e.target.value)}
        placeholder="Enter encryptedPUUID"
        className="w-full max-w-md p-2 border border-gray-300 rounded mb-4"
      />

      <button
        onClick={handleFetchSummoner}
        disabled={loading}
        className="w-full max-w-md py-2 bg-indigo-600 text-white rounded hover:bg-indigo-700 disabled:opacity-50"
      >
        {loading ? "Loading..." : "요청"}
      </button>

      {error && (
        <div className="mt-4 p-4 bg-red-100 text-red-700 rounded">{error}</div>
      )}

      {summonerData && (
        <div className="mt-6 p-4 bg-white rounded shadow-md w-full max-w-md">
          <h2 className="text-lg font-bold mb-2">Summoner Data</h2>
          <pre className="text-sm text-gray-800 overflow-x-scroll">
            {JSON.stringify(summonerData, null, 2)}
          </pre>
        </div>
      )}
    </div>
  );
}

 

route.ts

더보기

// src/app/api/riot/summoner/route.ts

 

import { NextRequest, NextResponse } from "next/server";

export async function GET(request: NextRequest) {
  const { searchParams } = new URL(request.url);
  const encryptedPUUID = searchParams.get("encryptedPUUID");

  if (!encryptedPUUID) {
    return NextResponse.json(
      { error: "encryptedPUUID is required" },
      { status: 400 }
    );
  }

  try {
    const apiKey = process.env.RIOT_API_KEY;

    const response = await fetch(apiUrl, {
      method: "GET",
      headers: {
        "X-Riot-Token": apiKey!,
      },
    });

    if (!response.ok) {
      const errorData = await response.json();
      return NextResponse.json(
        { error: errorData.message },
        { status: response.status }
      );
    }

    const data = await response.json();
    return NextResponse.json(data);
  } catch (error) {
    return NextResponse.json(
      { error: "Failed to fetch data from Riot API" },
      { status: 500 }
    );
  }
}

이렇게 코드를 작성하고 puuid를 넣어서 정보를 받아본다.

 


 

이 다음으로는 Match-V5 탭에 들어가 준다.

첫번째 엔드포인트에 puuid를 이용하면 해당 아이디의 최근 게임했던 gameId 목록을 얻을 수 있고,

전체목록, 랭크, 노말 등을 구분지어 가져올 수 있다.


두번째 엔드포인트에 그 gameId를 넣으면, 해당 게임 경기의 다양한 기록들을 볼 수 있다.


내가 플레이 했던 게임의 id값을 두번째 엔드포인트에 넣으니 엄청난 양의 데이터를 반환한다.(스크롤의 길이가 심상치가 않다.)

 

해당 데이터에 대한 내용은 어떤 분이 어느정도 해석해 둔 것이 있어서 참고하였다.( Riot 프로젝트 - RIOT API 분석 (velog.io)

더보기
{
    "metadata": {
        "dataVersion": "2",
        "matchId": "KR_6961713821",
        "participants": [
            "onzpaKK-V4BWINOlxzE6UmOjE13H1SlUXJabHDI4E1SYmNH_DkC65uWUzedqjqPyrF7KSK-kXN9i8g",
           외 9명
        ]
    },
    "info": {
        "endOfGameResult": "GameComplete",
        # 게임 픽창 시간(유닉스 시간)
        "gameCreation": 1708703810434,
        # 게임 시간(초 단위)
        "gameDuration": 1410,
        # 게임 끝난 시간(유닉스 시간)
        "gameEndTimestamp": 1708705237955,
        # 게임 id
        "gameId": 6961713821,
        # 게임 모드(CLASSIC = 5대5)
        "gameMode": "CLASSIC",
        # 게임 이름?
        "gameName": "teambuilder-match-6961713821",
        # 인게임 시작
        "gameStartTimestamp": 1708703827638,
        # 게임 타입
        "gameType": "MATCHED_GAME",
        # 버전 = 14.4패치
        "gameVersion": "14.4.561.3953",
        # 맵 id (11이 소환사의 협곡)
        "mapId": 11,
        # 참가자 정보
        "participants": [
            {
            	# 올인 핑
                "allInPings": 0,
                # 도움 핑
                "assistMePings": 7,
                # 어시스트 수
                "assists": 2,
                # 바론 막타
                "baronKills": 0,
                # 기본 핑
                "basicPings": 0,
                # 현상금 레벨
                "bountyLevel": 0,
                
                "challenges": {
                	# 연속 어시스트 기록
                    "12AssistStreakCount": 0,
                    # 스킬 사용 횟수
                    "abilityUses": 268,
                    # 15분 전 에이스 횟수
                    "acesBefore15Minutes": 0,
                    # 정글 몹 처치
                    "alliedJungleMonsterKills": 0,
                    # 바론 막타
                    "baronTakedowns": 0,
                    "blastConeOppositeOpponentCount": 0,
                    # 생성 현상금
                    "bountyGold": 0,
                    # 뺏은 버프 횟수
                    "buffsStolen": 0,
                    # 서폿 템 유무
                    "completeSupportQuestInTime": 0,
                    # 공격적 와드 장악력 "controlWardTimeCoverageInRiverOrEnemyHalf": 0.7095672615944019,
                    # 제어 와드
                    "controlWardsPlaced": 1,
                    # DPM
                    "damagePerMinute": 865.0203906284592,
                    # 팀내 데미지 받은 비중
                    "damageTakenOnTeamPercentage": 0.24315185057986916,
                    # 전령 관련같은데...
                    "dancedWithRiftHerald": 0,
                    # 적 챔프에게 죽은 횟수
                    "deathsByEnemyChamps": 10
                    # 매우 짧은 거리에서 스킬 피한 횟수
                    "dodgeSkillShotsSmallWindow": 0,
                    # 두번 연속 에이스
                    "doubleAces": 0,
                    # 용 처치 횟수(킬, 어시 포함)
                    "dragonTakedowns": 0,
                    # 라인전 시작전 골드, 경험치 이득보고 시작(인베이드 이득, True of False)
                    "earlyLaningPhaseGoldExpAdvantage": 1,
                    # 힐, 실드량
                    "effectiveHealAndShielding": 0,
                    
                    "elderDragonKillsWithOpposingSoul": 0,
                    "elderDragonMultikills": 0,
                    # cc기 맞춘 횟수  "enemyChampionImmobilizations": 38,
                    # 적 정글 몬스터 킬
                    "enemyJungleMonsterKills": 0,
                    # 적 정글러 근처에서 에픽몬스터 처치횟수(스틸횟수)
                    "epicMonsterKillsNearEnemyJungler": 0,
                   # 에픽 몬스터 생성후 30초이내에 처치 "epicMonsterKillsWithin30SecondsOfSpawn": 0,
                    # 에픽 몬스터(바론, 용, 블루, 레드)스틸 횟수
                    "epicMonsterSteals": 0,
                    # 에픽 몬스터 스마이트 없이 스틸
                    "epicMonsterStolenWithoutSmite": 0,
                    # 첫 타워 깼는지 (팀 전체가 1)
                    "firstTurretKilled": 1,
                    # 첫 타워 깬 시점
                    "firstTurretKilledTime": 821.3447503,
                    # 우리팀 데스없이 상대방 전멸
                    "flawlessAces": 0,
                    # 상대팀 전멸시킨 횟수
                    "fullTeamTakedown": 0,
                    # 전체 게임 시간
                    "gameLength": 1410.5417132,
                    "getTakedownsInAllLanesEarlyJungleAsLaner": 0,
                    # GPM
                    "goldPerMinute": 391.2527333411794,
                    "hadOpenNexus": 0,
                    # 자신의 cc기를 활용해 팀원과 같이 적을 죽인 횟수
                    "immobilizeAndKillWithAlly": 0,
                    # 첫 버프 먹은 수 ( max = 4)
                    "initialBuffCount": 0,
                    # 첫 바위 게 먹은 수 ( max = 2)
                    "initialCrabCount": 0,
                    # 10분 이전 정글 몹으로만 cs
                    "jungleCsBefore10Minutes": 0,
                   # 적 정글러 에픽 건드리는데 우리가 죽임 "junglerTakedownsNearDamagedEpicMonster": 0,
                   # 광 타임 끝나기전 터렛 부쉈는 지 "kTurretsDestroyedBeforePlatesFall": 0,
                   # KDA
                    "kda": 0.6,
                    # 암살
                    "killAfterHiddenWithAlly": 0,
                    # 킬 관여율
                    "killParticipation": 0.2857142857142857,
                    "killedChampTookFullTeamDamageSurvived": 0,
                    # "학살중입니다 콜 횟수"
                    "killingSprees": 0,
                    # 다이브 성공 횟수
                    "killsNearEnemyTurret": 1,
                    "killsOnOtherLanesEarlyJungleAsLaner": 0,
                    "killsOnRecentlyHealedByAramPack": 0,
                    # 다이브 받아쳐서 킬한 횟 수
                    "killsUnderOwnTurret": 1,
                    # 에픽 몬스터 딜과 합작 킬
                    "killsWithHelpFromEpicMonster": 0,
                    # 그랩류 같은 것으로 우리팀에게 끌어와서 킬
                    "knockEnemyIntoTeamAndKill": 2,
                    # 극초반 스킬샷 적중횟수
                    "landSkillShotsEarlyGame": 6,
                    # 10분전 라인 미니언
                    "laneMinionsFirst10Minutes": 81,
                    # 라인 초반 강한 이점
                    "laningPhaseGoldExpAdvantage": 0,
                    # 전설입니다 콜 횟수
                    "legendaryCount": 0,
                    # 코어 아이템 목록
                    "legendaryItemUsed": [
                        3142,
                        3004
                    ],
                    # 억제기 잃었음
                    "lostAnInhibitor": 0,
                    # 최고로 낸 cs차이
                    "maxCsAdvantageOnLaneOpponent": 34,
                    # 이상한듯 수치가 안나옴.
                    "maxKillDeficit": 0,
                    # 맞 라인 상대에 대해 최대 레벨 차이
                    "maxLevelLeadLaneOpponent": 2,
                    # 메자이 풀스텍 채웠는지
                    "mejaisFullStackInTime": 0,
                    # 얼마나 적 정글 침범했는지 퍼센트로 나옴(음수로)
                    "moreEnemyJungleThanOpponent": 0,
                    # 한 스펠로 다수의 킬 만들어냄
                    "multiKillOneSpell": 0,
                    # 전령으로 한번에 여러개 타워 처치
                    "multiTurretRiftHeraldCount": 0,
                    # 멀티킬
                    "multikills": 0,
                   # 공격적인 플래쉬로 여러 킬 횟수 "multikillsAfterAggressiveFlash": 0,
                   # 10분이내 타워 처치
                   "outerTurretExecutesBefore10Minutes": 0,
                   # 수적으로 열세일 때 킬
                    "outnumberedKills": 0,
                    # 수적으로 열세일 때 넥서스 처치
                    "outnumberedNexusKill": 0,
                    # 드래곤 영혼 획득
                    "perfectDragonSoulsTaken": 0,
                    # 팀 노데스
                    "perfectGame": 0,
                    # 협력 킬포인트 생산 횟수
                    "pickKillWithAlly": 3,
                    # 의미없는 데이터
                    "playedChampSelectPosition": 1,
                    # 버려
                    "poroExplosions": 0,
                    # 클린즈 사용 횟수
                    "quickCleanse": 0,
                    
                    "quickFirstTurret": 0,
                    # 빠른 솔로킬
                    "quickSoloKills": 0,
                    # 전령 처치횟수
                    "riftHeraldTakedowns": 0,
                    # 팀원 살려준 횟수
                    "saveAllyFromDeath": 0,
                    # 바위 게 컨트롤 횟수
                    "scuttleCrabKills": 0,
                    # 피한 스킬 샷
                    "skillshotsDodged": 2,
                	# 맞춘 스킬 샷
                    "skillshotsHit": 15,
                    # 버려
                    "snowballsHit": 0,
                    # 혼자 바론 킬
                    "soloBaronKills": 0,
                    # 솔로킬
                    "soloKills": 3,
                    # 일반와드 설치 횟수
                    "stealthWardsPlaced": 8,
                    # 한자리수 hp로 살아감
                    "survivedSingleDigitHpCount": 0,
                   # cc기 3개이상 맞고 살아감 "survivedThreeImmobilizesInFight": 2,
                   # 첫번째 포탑 파괴 or 파괴될 때 적 사냥
                    "takedownOnFirstTurret": 0,
                    # 킬 + 어시
                    "takedowns": 6,
                   # 레벨업 활용해서 적 처치 관여 "takedownsAfterGainingLevelAdvantage": 0,
                   # 정글 미니언 스폰전에 적 처치관여(인베이드)
                    "takedownsBeforeJungleMinionSpawn": 0,
                    # 10분 전 적 처치관여 횟수
                    "takedownsFirstXMinutes": 4,
                    # 라인 뒷 골목에서 적 처치관여
                    "takedownsInAlcove": 0,
                    # 우물 킬
                    "takedownsInEnemyFountain": 0,
                    # 바론 먹은 횟수
                    "teamBaronKills": 0,
                    # 팀내 데미지 비중
                    "teamDamagePercentage": 0.26852989743228145,
                    # 팀 장로 드래곤
                    "teamElderDragonKills": 0,
                    # 팀 전령
                    "teamRiftHeraldKills": 0,
                    # 텔포로 적 처치관여
                    "teleportTakedowns": 1,
                    # 큰 데미지 입고도 살아감
                    "tookLargeDamageSurvived": 0,
                    # 광 몇개 캤는지
                    "turretPlatesTaken": 2,
                    # 타워 몇개 부셨는지 관여
                    "turretTakedowns": 0,
                    # 전령으로 타워 몇개 부셨는지
                    "turretsTakenWithRiftHerald": 0,
                    # 3초안에 20개이상 미니언 처치
                    "twentyMinionsIn3SecondsCount": 0,
                    # 와드 두개를 한번의 렌즈로 지움 
                    "twoWardsOneSweeperCount": 0,
                    # 언씬리콜인데 다 0뜸 쓰지말자
                    "unseenRecalls": 0,
                    # 시야점수 이점 (음수면 진거)
                    "visionScoreAdvantageLaneOpponent": 0.01774919033050537,
                    # VPM
                    "visionScorePerMinute": 0.8887097165781768,
                    # 와드 처치 횟수
                    "wardTakedowns": 3,
                    # 와드 처치 횟수 20분전
                    "wardTakedownsBefore20M": 3,
                    # 와드 처치 방어
                    "wardsGuarded": 0
                },
                # 챔프 경험치
                "champExperience": 10777,
                # 챔프 레벨
                "champLevel": 13,
                # 챔프 id
                "championId": 126,
                # 챔프 이름 : 제이스
                "championName": "Jayce",
                # 챔피언 교체(스왑)
                "championTransform": 0,
                # 명령 핑 횟수
                "commandPings": 2,
                "consumablesPurchased": 2,
                # 건축물 딜(억제기 타워 넥서스)
                "damageDealtToBuildings": 1376,
                # 오브젝트 딜
                "damageDealtToObjectives": 2081,
                # 타워 딜
                "damageDealtToTurrets": 1376,
                "damageSelfMitigated": 10640,
                # 위험 핑
                "dangerPings": 0,
                # 데스 수
                "deaths": 10,
                # 핑와 설치 수
                "detectorWardsPlaced": 1,
                # 더블 킬
                "doubleKills": 0,
                # 드래곤 막타
                "dragonKills": 0,
                "eligibleForProgression": true,
                # 미아 핑
                "enemyMissingPings": 22,
                # 적 와드 핑
                "enemyVisionPings": 1,
                # 퍼블 어시
                "firstBloodAssist": false,
                # 퍼블 킬
                "firstBloodKill": false,
                # 타워 퍼블 어시스트
                "firstTowerAssist": false,
                # 타워 퍼블 킬
                "firstTowerKill": false,
                # 15분 서렌 쳐서 졌나?
                "gameEndedInEarlySurrender": false,
                # 서렌 쳐서 졌나?
                "gameEndedInSurrender": true,
                # 후퇴 핑
                "getBackPings": 1,
                # 획득 골드
                "goldEarned": 9197,
                # 사용 골드
                "goldSpent": 7725,
                # 유지 핑
                "holdPings": 0,
                # 개인 포지션 : 탑
                "individualPosition": "TOP",
                # 억제기
                "inhibitorKills": 0,
                "inhibitorTakedowns": 0,
                "inhibitorsLost": 0,
                "item0": 3142,
                "item1": 3042,
                "item2": 1083,
                "item3": 1036,
                "item4": 1055,
                "item5": 3158,
                "item6": 3340,
                "itemsPurchased": 16,
                # 킬링스프리 횟수
                "killingSprees": 0,
                # 킬
                "kills": 4,
                "lane": "MIDDLE",
                "largestCriticalStrike": 0,
                "largestKillingSpree": 0,
                "largestMultiKill": 1,
                "longestTimeSpentLiving": 284,
                # AP딜
                "magicDamageDealt": 10672,
               	# 챔프에 가한 AP딜
                "magicDamageDealtToChampions": 3924,
  
                "magicDamageTaken": 10672,
                "missions": {
                    "playerScore0": 0,
                    "playerScore1": 0,
                    "playerScore10": 0,
                    "playerScore11": 0,
                    "playerScore2": 0,
                    "playerScore3": 0,
                    "playerScore4": 0,
                    "playerScore5": 0,
                    "playerScore6": 0,
                    "playerScore7": 0,
                    "playerScore8": 0,
                    "playerScore9": 0
                },
                "needVisionPings": 0,
                "neutralMinionsKilled": 0,
                "nexusKills": 0,
                "nexusLost": 0,
                "nexusTakedowns": 0,
                "objectivesStolen": 0,
                "objectivesStolenAssists": 0,
                "onMyWayPings": 9,
                "participantId": 1,
                "pentaKills": 0,
                "perks": {
                    "statPerks": {
                        "defense": 5001,
                        "flex": 5008,
                        "offense": 5008
                    },
                    "styles": [
                        {
                            "description": "primaryStyle",
                            "selections": [
                                {
                                    "perk": 8230,
                                    "var1": 14,
                                    "var2": 0,
                                    "var3": 0
                                },
                                {
                                    "perk": 8226,
                                    "var1": 250,
                                    "var2": 736,
                                    "var3": 0
                                },
                                {
                                    "perk": 8233,
                                    "var1": 13,
                                    "var2": 40,
                                    "var3": 0
                                },
                                {
                                    "perk": 8236,
                                    "var1": 14,
                                    "var2": 0,
                                    "var3": 0
                                }
                            ],
                            "style": 8200
                        },
                        {
                            "description": "subStyle",
                            "selections": [
                                {
                                    "perk": 8345,
                                    "var1": 3,
                                    "var2": 0,
                                    "var3": 0
                                },
                                {
                                    "perk": 8304,
                                    "var1": 9,
                                    "var2": 0,
                                    "var3": 0
                                }
                            ],
                            "style": 8300
                        }
                    ]
                },
                # AD딜
                "physicalDamageDealt": 90436,
                # 챔피언에게 가한 AD딜
                "physicalDamageDealtToChampions": 16411,
                "physicalDamageTaken": 10849,
                "placement": 0,
                "playerAugment1": 0,
                "playerAugment2": 0,
                "playerAugment3": 0,
                "playerAugment4": 0,
                "playerScore0": 0,
                "playerScore1": 0,
                "playerScore10": 0,
                "playerScore11": 0,
                "playerScore2": 0,
                "playerScore3": 0,
                "playerScore4": 0,
                "playerScore5": 0,
                "playerScore6": 0,
                "playerScore7": 0,
                "playerScore8": 0,
                "playerScore9": 0,
                "playerSubteamId": 0,
                "profileIcon": 5634,
                "pushPings": 0,
                "puuid": "onzpaKK-V4BWINOlxzE6UmOjE13H1SlUXJabHDI4E1SYmNH_DkC65uWUzedqjqPyrF7KSK-kXN9i8g",
                "quadraKills": 0,
                "riotIdGameName": "\uc5c4\ub3c4\ub0a0\ub4dc",
                "riotIdTagline": "KR1",
                "role": "DUO",
                "sightWardsBoughtInGame": 0,
                "spell1Casts": 87,
                "spell2Casts": 51,
                "spell3Casts": 53,
                "spell4Casts": 77,
                "subteamPlacement": 0,
                "summoner1Casts": 4,
                "summoner1Id": 12,
                "summoner2Casts": 3,
                "summoner2Id": 4,
                "summonerId": "K4p6x2KSZJZB6TMV57fmMOg5OEjeONKZo0H4w7uVRP-DE6g",
                "summonerLevel": 214,
                "summonerName": "\uc5c4\ub3c4\ub0a0\ub4dc",
                "teamEarlySurrendered": false,
                "teamId": 100,
                "teamPosition": "TOP",
                # cc건 시간 (초)
                "timeCCingOthers": 15,
                "timePlayed": 1410,
                "totalAllyJungleMinionsKilled": 0,
                "totalDamageDealt": 101372,
                "totalDamageDealtToChampions": 20335,
                "totalDamageShieldedOnTeammates": 0,
                "totalDamageTaken": 22304,
                "totalEnemyJungleMinionsKilled": 0,
                "totalHeal": 860,
                "totalHealsOnTeammates": 0,
                "totalMinionsKilled": 177,
                "totalTimeCCDealt": 108,
                "totalTimeSpentDead": 282,
                "totalUnitsHealed": 1,
                "tripleKills": 0,
                "trueDamageDealt": 263,
                "trueDamageDealtToChampions": 0,
                "trueDamageTaken": 782,
                "turretKills": 0,
                "turretTakedowns": 0,
                "turretsLost": 6,
                "unrealKills": 0,
                "visionClearedPings": 0,
                "visionScore": 20,
                "visionWardsBoughtInGame": 1,
                "wardsKilled": 3,
                "wardsPlaced": 9,
                "win": false
            },

이러한 데이터가 * 10명 만큼 넘어온다....