본문 바로가기
프로그래밍

[코딩] Riot API에서 정보 가져오기 1

by 기이한날개 2021. 12. 21.

Riot API에서 정보를 가져와보려고 한다. 

 

API Documentation 을 통해 제공되는 정보의 종류에 대해 알아볼 수 있었다.

https://developer.riotgames.com/apis

 

Riot Developer Portal

 

developer.riotgames.com

 

닉네임을 주었을 때, 각 경기에서 그 유저가 얻은 시야점수, 구매한 와드 수, 박은 와드 수, 지운 와드 수를 구해오고 그걸 토대로 각 라인별 시야 기여도를 시각화해보기로 했다.

 

API 사용법을 보니 url의 형태로 request를 하면 json 데이터를 돌려주는 것 같다.

header의 X-Riot-Token에 api_key를 줘야 에러가 뜨지 않고 값을 반환해준다. api key는 매일 새로 발급해줘야 한다.

 

request는 나중에 같은 형식을 자주 써야 할 것 같으니 함수로 만들어둔다. 

import requests
from urllib import parse

api_key = "API_KEY"

def create_request(url, headers=None, params=None):
    if headers is None:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 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
        }
    res = requests.get(url, headers=headers, params=params)
    if res.status_code == 200:
        return res.json()
    else:
        print(res.status_code, "error from create_request")
        return res.json()

 

Riot API에서 제공하는 다음의 정보를 받아올 수 있다.

1. 닉네임으로 유저 정보 받아오기(고유 id인 puuid, 소환사 레벨 등)

2. 유저가 플레이한 게임의 match_id

3. match_id로 검색한 경기별 세부정보

 

def search_summoner_by_name(nickname):
    encoding = parse.quote(nickname)
    url = f"https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+encoding
    res = create_request(url)
    return res

def get_matchid_by_puuid(puuid, start=0, count=None, startTime=None, endTime=None, queue=None, type=None):
    params = {'type':type, 'start':start, 'count':count, 'startTime':startTime, 'endTime':endTime, 'queue':queue}
    url = f"https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{puuid}/ids"
    res = create_request(url, params=params)
    return res

def get_match_data(match_id):
    url = f"https://asia.api.riotgames.com/lol/match/v5/matches/{match_id}"
    return create_request(url)

 

search_summoner_by_name 함수를 통해 닉네임으로 유저 puuid를 받아온 다음, get_matchid_by_puuid 함수로 유저가 플레이한 경기의 match_id를 받아오고, 마지막으로 get_match_data 함수로 각각의 경기 데이터를 불러오면 그 경기에서 플레이어별 시야 관련 점수를 받아올 수 있다.

 

get_match_data로는 경기의 데이터가 자세하게 json으로 반환되고, 그 데이터 안에는 경기 자체의 데이터(시작시각, 경기시간, 맵, 모드 등) 뿐만 아니라 각각의 플레이어에 대한 데이터(챔피언, 킬 수, 어시스트 수, 넣은 딜량, 받은 딜량, 시야 점수, 구매한 아이템,  처치한 미니언 수 등)도 들어 있다.

 

계속해서 request를 하다보니 횟수 제한이 있다는 것을 알게 되었다.

개발자 문서를 읽어보니 1초에 20번, 2분에 100번 이상 조회할 수 없다고 한다.

 

너무 많은 request를 한 번에 할 수 없기 때문에 여러 데이터가 한번에 필요할 때를 대비해 미리 데이터를 받아 저장해둘 필요가 있다고 느꼈다. 또 시야 관련 데이터 말고도 다른 데이터도 사용할 수 있기 때문에 따로 가공하거나 필요한 부분만 저장하기보다는 받은 정보를 통째로 데이터베이스에 저장해놓고, 나중에 거기에서 필요한 데이터를 뽑아 사용하는 것이 낫다고 생각했다.

 

다음에는 API에서 불러 온 정보를 DB에 저장하는 것을 해보려고 한다.

 

 

정리하고 보니 정말 간단하지만 여기까지 만드는데도 정말 오래 걸렸다. API와 json 자료형식을 다루어본 적이 없어서 관련 개념과 자료들을 보면서 익히느라 시간이 많이 걸렸던 것 같다.