본문 바로가기

[Riot API] 0. API Key 발급과 기본 데이터 수집

Python/API by Mandarim_ 2024. 6. 20.

본 게시글은 Riot API를 처음 사용하는 사람을 위해 Riot API 사용법과 어떤 데이터가 있는지 구조를 소개하고자 한다.
Riot API는 롤 API라고도 많이 부르는데, OP.GG와 같이 게임 League of legends의 전적 검색 사이트를 만드는 데 사용되는 데이터를 불러올 수 있는 API이다.
이는 Riot Games에서 사용할 수 있게 제공하고 있다.
 

1. API Key 발급받기

이를 사용하기 위해선 Riot Developer 홈페이지에 회원가입해야 한다.
https://developer.riotgames.com/

 

Riot Developer Portal

About the Riot Games API With this site we hope to provide the League of Legends developer community with access to game data in a secure and reliable way. This is just part of our ongoing effort to respond to players' and developers' requests for data and

developer.riotgames.com

 
회원가입을 했거나, 이미 League of Legends 계정이 있다면 그 계정을 사용해도 된다.
그 이후엔 아래 [DashBoard] > [로봇이 아닙니다] > [REGISTER API KEY] > [COPY] 순서를 통해 API를 사용가능한 KEY를 발급받을 수 있다.
 
일반적으로 제품 등록을 하지 않고 무료로 사용하는 경우엔 1초에 20회, 120초에 100회로 API 호출 제한이 있으니, 코드를 짤 때 주의해야 한다. 
 

RIOT Developer 페이지

 

2. 데이터 불러오기

RIOT GAMES API는 한 번에 원하는 데이터를 불러오는 것이 아니라, 
원하는 정보를 찾기 위해 구조적으로 한 단계씩 파고들어야 한다.

(0) Header

import requests
import json
from urllib import parse # 한글

api_key = "RGAPI-..." # 새로 발급받은 api_key
REQUEST_HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
    "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
    "Accept-Charset": "application/x-www-form-urlencoded; charset=UTF-8",
    "Origin": "https://developer.riotgames.com",
    "X-Riot-Token": api_key
}

 

(1)  소환사 정보 (SUMMONER-V4)

소환사 정보 url

 
과거엔 SUMMONER-v4에서 by-name으로도 검색이 가능했는데,
지금 작성하고 있는 시간을 기준으로 by-name으로 검색하면 'Forbidden'으로 뜬다.
다시 확인해보니 제공하는 서비스에서 by-name 기준 검색이 사라진 것을 확인할 수 있었다.
 
대신에, accounts 통해, puuid 를 찾을 수 있다.
예시로 요즘 티모장인으로 활약하고 있는 운타라님 아이디를 검색해 봤다.
한국어 계정의 경우 parse.quote() 함수를 사용하여 encoding을 진행해주어야 한다. 
 
전적 검색하고 싶은 사람의 puuid는 아래와 같이 확인이 가능하다.

userNickname="96년생 티모장인"
tagLine="9202"
encodedName = parse.quote(userNickname)
print(encodedName)
url = f"https://asia.api.riotgames.com/riot/account/v1/accounts/by-riot-id/{encodedName}/{tagLine}"

player_id = requests.get(url, headers=REQUEST_HEADERS).json()

# player_id
# {'puuid': 'MSAtTIHSUgLee-eSOBqa9kzg--UHKgi083trROsPHVGRRYtGRqGGpyXnE-akvJC2HGDsCMcW6bIGEA',
#  'gameName': '96년생 티모장인',
#  'tagLine': '9202'}

 
뒤에 리그 정보나 매치 정보를 불러올 때, encyrpted~ id 혹은 account id이 필요한 경우가 있기 때문에 (1)의 소환사 정보 불러오기는 모든 데이터를 사용하기 위해 필수적으로 가지고 와야 하는 정보이다.
이는 riot이 랜덤 하게 암호화처리 해둔 것이기 때문에 API를 통해서만 확인 가능하다.

puuid = player_id['puuid']
url = f"https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-puuid/{puuid}"
player = requests.get(url, headers=REQUEST_HEADERS).json()

# player
# {'id': 'UUc0mk0pk8Uu-bwls-nzJVB_k90XqMm9H_LsuYTkXjdC764',
#  'accountId': 'Msu1Z9GXgXi9r4l7Q42STeo0owpTmSnQN-1A70O-o2YZ6sE',
#  'puuid': 'MSAtTIHSUgLee-eSOBqa9kzg--UHKgi083trROsPHVGRRYtGRqGGpyXnE-akvJC2HGDsCMcW6bIGEA',
#  'profileIconId': 6637,
#  'revisionDate': 1718379690572,
#  'summonerLevel': 380}

 

(2) 리그 정보 (LEAGUE-V4)

리그 정보 url

 
(1)에서 불러온 player의 암호화된 id를 사용하여 리그 정보를 불러올 수 있다.
기본적으로 '현 시즌'의 티어와 플레이 수, 이긴 게임과 진 게임 수를 알려준다. 

playerInfo = requests.get("https://kr.api.riotgames.com/lol/league/v4/entries/by-summoner/"+player['id'], headers = REQUEST_HEADERS).json();

# playerInfo
# [{'leagueId': '64de9d2d-89e0-3698-a7cd-a9b7e04ef3b6',
#   'queueType': 'RANKED_SOLO_5x5',
#   'tier': 'MASTER',
#   'rank': 'I',
#   'summonerId': 'UUc0mk0pk8Uu-bwls-nzJVB_k90XqMm9H_LsuYTkXjdC764',
#   'leaguePoints': 307,
#   'wins': 120,
#   'losses': 108,
#   'veteran': True,
#   'inactive': False,
#   'freshBlood': False,
#   'hotStreak': False}]

 

(3) 매치 정보 (MATCH-V5)

매치 정보 url

 
현 시즌의 모든 플레이한 게임을 불러오기 위해서 각 게임에 대한 MATCH ID 정보가 필요하다.
MATCH ID는 한 번에 100개씩만 불러올 수 있기 때문에 모든 MATCH ID들을 불러오기 위해 다음과 같이 코드를 작성했다.

n_wins = playerInfo[0]['wins']
n_losses = playerInfo[0]['losses']
n_total = n_wins + n_losses;
print(n_wins); print(n_losses); print(n_total)

r = n_total // 100
other = n_total % 100

all_gamesID = []
for i in range(r+1):
  start = i*100
  if i != r :
    tmp_gamesID = requests.get(f"https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{player['puuid']}/ids?type=ranked&start={start}&count={100}", headers = REQUEST_HEADERS).json();
  else :
    tmp_gamesID = requests.get(f"https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{player['puuid']}/ids?type=ranked&start={start}&count={other}", headers = REQUEST_HEADERS).json();

  all_gamesID.extend(tmp_gamesID)

 
MATCH ID를 다 가지고 왔다면, 아래와 같은 코드로 하나씩 가져올 수 있다.
매치 정보의 경우, 정보가 너무 방대하기 때문에 다음 포스팅에서 다루겠다.

gameInfo =  requests.get("https://asia.api.riotgames.com/lol/match/v5/matches/"+all_gamesID[0], headers = REQUEST_HEADERS).json();
반응형