Lina's Toolbox

[RIOT API] 5. 유저네임으로 매치정보(선택 포지션, 팀 포지션, 킬 수, 데스수, 기여도, 선호 포지션 등) 조회하기 (match-v5) 본문

스파르타 내일 배움 캠프 AI 웹개발 과정/python

[RIOT API] 5. 유저네임으로 매치정보(선택 포지션, 팀 포지션, 킬 수, 데스수, 기여도, 선호 포지션 등) 조회하기 (match-v5)

Woolina 2024. 10. 12. 07:07

 

1. puuid로 matchId 구하기

나는 소환사가 주로 플레이하는, 선호하는 포지션(라인) 정보를 가져오기를 원했다.

그런데 지금 Secret Client를 발급을 못받았기 때문에 RSO가 불가능한 상황인데,

 

이상하게 지금 공식 docs에는 매치정보는 RSO로 조회하는 것밖에 없다..ㅠㅠ

 

그래서 포기해야하나.. 하다가 그냥 Endpoint를 내맘대로 작성해봤는데,

ㅋㅋㅋㅋㅋ아닠ㅋㅋ

혹시나 해서 https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{puuid}/ids?api_key={api_key} 

이렇게 해봤더니 진짜 된다!!!

그래서 신나게 이걸 이용했다!

 

파이썬 코드

def get_match_ids(api_key, puuid):
    """PUUID로부터 유저의 매치 ID 목록을 조회합니다."""
    url_match_ids = f"https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/{puuid}/ids?api_key={api_key}"

    try:
        response = requests.get(url_match_ids, timeout=10)
        response.raise_for_status()  # HTTPError가 발생하면 예외 발생
        return response.json()

    except requests.exceptions.RequestException as e:
        print(f"Error fetching match IDs: {e}")
        return None

 

 

2. matchId로 매치 정보 불러오기

매치정보 불러오는 것도 지금은 공식문서에 RSO밖에 없어서

이것도 그냥 끝에 ?api_key를 붙여서 Query param 형식으로 해봤는데 이것도 진짜 된다 ㅋㅋㅋ

https://asia.api.riotgames.com/lol/match/v5/matches/%7Bmatch_id%7D?api_key={api_key}

 

파이썬 코드

def get_match_info(api_key, match_id):
    """매치 ID로부터 매치 정보를 조회합니다."""
    url_match_info = f"https://asia.api.riotgames.com/lol/match/v5/matches/{match_id}?api_key={api_key}"

    try:
        response = requests.get(url_match_info, timeout=10)
        response.raise_for_status()  # HTTPError가 발생하면 예외 발생
        return response.json()

    except requests.exceptions.RequestException as e:
        print(f"Error fetching match info: {e}")
        return None

이렇게 하면 많은 정보가 조회된다.

나는 이 유저가 선호하는, 많이 픽하는 포지션(라인)이 어디인지 조회하는 API를 만들고 싶어서

선호 포지션을 구하는 로직을 따로 추가해봤다.

 

3. 매치 정보 이용하여 선호 포지션 구하기

def get_user_preferred_position(api_key, puuid):
    """PUUID로부터 유저의 선호 포지션을 조회합니다."""
    positions = []
    
    match_ids = get_match_ids(api_key, puuid)
    if not match_ids:
        return "해당 유저의 매치 기록이 없습니다."

    last_match_id = match_ids[0]  # 가장 최근 매치 ID
    match_info = get_match_info(api_key, last_match_id)

    if not match_info:
        return "매치 정보 조회 실패."

    participants = match_info['info']['participants']
    for player in participants:
        if player['puuid'] == puuid:
            positions.append(player['individualPosition'])
            

    # 가장 많이 등장한 포지션 반환 (선호 포지션)
    if positions:
        return max(set(positions), key=positions.count)
    
    return "포지션 정보 없음"

'participants' 은 해당 게임에 참가한 참가자들인데,

거기서 이 유저에 대한 정보일 경우, 'individualPosition'(유저 선택 포지션) 값들을 리스트에 넣은 뒤.

가장 많이 선택된 것으로 선호 포지션을 정했다.

 

리턴 값

{'preferredPosition': 'JUNGLE'}