유승훈

Riot API 사용하기 - (1) 최상위티어 유저 가져오기. 본문

languages/Python

Riot API 사용하기 - (1) 최상위티어 유저 가져오기.

seunghuni96 2021. 10. 7. 02:14

안녕하세요. 이번 글에서는 Riot API를 사용하는 것에 대해서 정리해보고자 합니다.

앞서 LCK스프링 벤픽 데이터를 가지고 연관규칙 분석을 하는 글을 올렸었는데, 이번에는 최상위 티어 유저들의 데이터를 분석해보고자 합니다. 이와 관련해서 Riot API를 사용한 것에 대해 작성한 글입니다.

 

Riot Developer Portal

라이엇 게임즈에서 제공하는 Developer Portal입니다. 라이엇은 리그오브레전드(LOL)외에도 전략적 팀 전투(TFT), 레전드오브 룬테라, 발로란트와 같은 게임들을 서비스하고 있는데요. 그 게임들과 관련된 API들을 이 포털에서 접할 수 있습니다. 라이엇의 게임을 하시는 분들은 라이엇 ID를 가지고 있을 것이고, 그 ID로 로그인해서 API Key를 발급받을 수 있습니다. 자세히 보면 1초에 최대 20개, 2분에 최대 100개의 요청을 보낼 수 있다고 되어있습니다. 

 

APIS탭에 들어가면 보이는 화면입니다. 왼쪽에 일종의 태그별로 API들이 분리되어 있고, 그 태그별로 여러 API들을 가지고 있습니다. 

 

유저목록

먼저 최상위티어(마스터, 그랜드마스터, 챌린저 티어)의 유저 목록을 가져오는 API를 사용했습니다.

https://kr.api.riotgames.com/lol/league-exp/v4/entries/{queue}/{tier}/{division}

각 티어별 유저 리스트를 가져오는 API입니다. 최상위티어 3개는 각 티어별로 유저 목록을 가져오는 API가 따로 만들어져 있습니다. 하지만 리그아이디, 리그명(세 티어는 각자 고유의 리그명을 갖습니다)과 같은 의미없는 데이터들을 처리할 필요가 없는 이 API를 사용했습니다. 

 

https://kr.api.riotgames.com/lol/league-exp/v4/entries/RANKED_SOLO_5x5/{}/I?page={}&api_key={}

위와 같이 문자열을 Formatting하여 URL을 만듭니다. 첫번째 인자는 티어명, 두번째는 API key입니다. 세 티어 모두 1,2,3,4없이 하나의 티어로 되어있기 때문에 division은 I로 고정입니다.

 

tiers = ['CHALLENGER','GRANDMASTER','MASTER']

user_tier = []
for tier in tiers: 
    for page_num in range(1,20):
        # url formatting
        url_now = user_url.format(tier,page_num,my_api_key)
        
        # request
        reqq =  requests.get(url_now).text
        
        if reqq == '[]':
            pass
        else:
            df = json.loads(reqq)
            user_tier.append(pd.DataFrame(df))

이렇게 티어명과 Page number로 반복문을 돌려줍니다. 전체 유저 페이지 이상으로 넘어간 경우 '[]'로 되어있기 때문에 관련된 조건을 걸어줍니다.

 

API를 통해 가져온 유저 리스트는 다음과 같습니다. 하지만 이 소환사명(summonerName)으로는 전적을 검색해올 수 없습니다. puuid라는 코드화된 id를 가져와서 match id를 조회하는 API에 활용하고, 그 match id를 통해 게임별 상세전적을 가져올 수 있습니다.

 

세 티어의 유저가 총 4369명이 있는 것을 알 수 있습니다. 

 

puuid 가져오기

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{summonerName}

일종의 유저 상세정보(?)를 가져오는 API의 원형은 다음과 같습니다.

 

https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/{}?api_key={}

API는 이런식으로 활용됩니다. 첫번째 포맷에는 인코딩된 유저명이, 두번째는 앞서 사용한 API와 같이 API key가 들어갑니다. 

 

puid_list = []
i = 0
iter_time = datetime.now() + timedelta(minutes=2)
for roww in tqdm(user_df.iterrows()):
    
    summoner = urllib.parse.quote(roww[1]['summonerName'])
    urll = puid_url.format(summoner,my_api_key)
    
    if i == 100:
        time.sleep(120)
    
        reqq = requests.get(urll)
        dff = pd.DataFrame(json.loads(reqq.text),index=[0])
        puid_list.append(dff)
        
        i = 0
        
    else:
        reqq = requests.get(urll)
        dff = pd.DataFrame(json.loads(reqq.text),index=[0])
        puid_list.append(dff)
        
        i += 1

이렇게 코드를 작성했습니다. 4300여명 되는 유저들에 대한 요청을 보내야 하기에 무작정 요청을 보내다 보면 2분에 최대 100개의 요청제한에 걸리기 때문에, 100회마다 2분씩 쉬고 다시 요청을 진행하는 식으로 반복문을 작성했습니다. 이 때문에 시간이 좀 오래 걸립니다.

 

계정 관련 이슈

API를 통해 가져온 데이터입니다. 다음 글 부터는 이 puuid를 통해 유저들의 전적을 가져오는 것에 대해 작성해보도록 하겠습니다.

 

처음 썼던 유저목록 데이터와 puuid 데이터를 유저명을 기준으로 join 하면, 완벽하게 join되지 않는 현상이 발생했습니다. 매칭되지 않는 유저 몇명을 OPGG에 검색해본 결과, OPGG가 가지고 있는 유저 데이터에는 있지만 전적은 검색되지 않았습니다. 추측컨데 캐릭터 삭제나 닉네임 변경과 같은 이슈가 있을 것으로 생각해볼 수 있습니다. 일단 코드 전체를 다시 돌리는 방향으로 해결 방향을 보고 있습니다.

 

EDA

유저 목록 데이터에 승리수, 패배수, 리그포인트와 같은 컬럼들이 있는데요, 이를 활용하여 간단한 시각화를 해봤습니다.

적은 판수로 높은 승률을 유지하는 유저들도 보이고, 판수가 점점 많아질수록 전반적인 승률이 낮아지는 것을 볼 수 있습니다. 티어별로 나눠서 살펴보면, 

티어가 높아질수록 평균 판수가 많아지네요. 평균 승률은 비슷해보입니다. 티어가 낮을수록 유저가 많아지기 때문에 그래프의 양 끝에 해당하는, 그러니까 판수는 적고 승률은 매우 높은 사람과 반대 끝인 타 유저들에 비해 판수가 어마어마하게 많은 사람이 많습니다.

 

 

Comments