Lina's Toolbox

[RIOT API] 4. 유저네임으로 소환사 리그정보(랭크,티어 등) 조회하기 (league-v4) 본문

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

[RIOT API] 4. 유저네임으로 소환사 리그정보(랭크,티어 등) 조회하기 (league-v4)

Woolina 2024. 10. 12. 06:47

 

 

 

SummonerID로 소환사의 리그 관련 정보 불러오기

 

https://developer.riotgames.com/apis#league-v4/GET_getLeagueEntriesForSummoner

 

 

Riot Developer Portal

 

developer.riotgames.com

 

/lol/league/v4/entries/by-summoner/{encryptedSummonerId} 을 이용해보겠다.

 

Return Value

이 전 포스팅까지 썼던 api에 비해, 리턴 밸류가 많은 편인 걸 볼 수 있다.

 

  • queueType
    솔로랭크인지, 자유 랭크인지 등의 랭크 타입을 나타낸다.
  • hotSteak
    해당 유저가 최근에 연승 중일 경우 True
  • veteran
    이 값은 소환사가 얼마나 많은 게임을 플레이했는지.
    일반적으로 많은 게임을 플레이한 소환사는 더 높은 경험치를 가진 것으로 간주되고 True
  • inactive
    소환사가 일정 기간 동안 게임에 접속하지 않았음을 의미. 해당 소환사가 현재 비활성 상태이면 True
  • freshBlood
    신규 유저일 경우 True

인코딩된 summonerId를 패러미터에 입력하고 EXCUTE REQUEST를 누르면

[
    {
        "leagueId": "ce5149f6-59b4-47ae-80b1-dfdfaf590",
        "queueType": "RANKED_SOLO_5x5",
        "tier": "GOLD",
        "rank": "IV",
        "summonerId": "xGPNo8_SJPROdfsgEtidf_HjaajwqAFAv6VAzrCgMNL0q3rlSQ",
        "leaguePoints": 40,
        "wins": 10,
        "losses": 8,
        "veteran": false,
        "inactive": false,
        "freshBlood": false,
        "hotStreak": false
    },
    {
        "leagueId": "ce5149f6-59b4-47ae-80b1-dfdfsdf590",
        "queueType": "RANKED_FLEX_SR",
        "tier": "SILVER",
        "rank": "III",
        "summonerId": "xGPNo8_SJPROZavhFDFogjxD7TRDp_HjaajwqAFAv6VAzrCgMNL0q3rlSQ",
        "leaguePoints": 48,
        "wins": 3,
        "losses": 3,
        "veteran": false,
        "inactive": false,
        "freshBlood": false,
        "hotStreak": false
    }
]

이런 식으로 호출된다. 처음엔 왜 두개가 나오나 했는데,

솔로랭크 하나, 자유랭크 하나 이렇게 두개가 나왔던 것!

 

파이썬 코드

def get_user_league(api_key, summoner_id):
    """소환사 ID로부터 유저의 리그 정보를 조회합니다."""
    url_league = f"https://kr.api.riotgames.com/lol/league/v4/entries/by-summoner/{summoner_id}?api_key={api_key}"

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

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

 

전체 파이썬 코드

import sys
import os
import requests
from urllib.parse import quote

# 현재 파일의 경로를 기준으로 상위 디렉토리(프로젝트 루트)를 PYTHONPATH에 추가
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/..")

from 앱이름.settings import RIOT_API_KEY

# API 키 설정
api_key = RIOT_API_KEY

# 유저네임과 태그로 유저 존재 여부 확인 후 프로필과 리그 정보를 얻는 함수
def get_user_info(api_key, riot_id, tag_line):
    encoded_riot_id = quote(riot_id)
    encoded_tag_line = quote(tag_line)

    # 아시아 서버 URL 설정 (유저 존재 여부 확인)
    url_puuid = f"https://asia.api.riotgames.com/riot/account/v1/accounts/by-riot-id/{encoded_riot_id}/{encoded_tag_line}?api_key={api_key}"

    try:
        # 유저 PUUID 조회
        response_puuid = requests.get(url_puuid, timeout=10)
        if response_puuid.status_code == 404:
            return {"error": "해당 유저는 존재하지 않습니다."}

        if response_puuid.status_code != 200:
            return {"error": f"Error: Status Code {response_puuid.status_code}"}

        # 유저가 존재하는 경우 PUUID를 얻음
        data_puuid = response_puuid.json()
        puuid = data_puuid['puuid']

        # 한국 서버 프로필 정보 조회
        url_profile = f"https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-puuid/{puuid}?api_key={api_key}"
        response_profile = requests.get(url_profile, timeout=10)

        if response_profile.status_code != 200:
            return {"error": f"Error: Status Code {response_profile.status_code}"}

        data_profile = response_profile.json()
        summoner_id = data_profile['id']  # 리그 정보 조회를 위한 소환사 ID

        # profileIconId를 기반으로 프로필 아이콘 URL 생성
        profile_icon_link = f"https://raw.communitydragon.org/latest/game/assets/ux/summonericons/profileicon{data_profile['profileIconId']}.png"

        # 한국 서버 리그 정보 조회
        url_league = f"https://kr.api.riotgames.com/lol/league/v4/entries/by-summoner/{summoner_id}?api_key={api_key}"
        response_league = requests.get(url_league, timeout=10)

        if response_league.status_code != 200:
            return {"error": f"Error: Status Code {response_league.status_code}"}

        data_league = response_league.json()

        # 리턴할 정보 구성
        user_info = {
            "profileIconId": data_profile['profileIconId'],
            "profileIconLink": profile_icon_link,  # 프로필 아이콘 URL 추가
            "summonerLevel": data_profile['summonerLevel'],
            "revisionDate": data_profile['revisionDate'],
            "league": []
        }

        # 리그 정보에서 'RANKED_SOLO_5x5' 큐 타입만 필터링하여 추가
        for entry in data_league:
            if entry['queueType'] == 'RANKED_SOLO_5x5':
                league_info = {
                    "tier": entry['tier'],
                    "rank": entry['rank'],
                    "leaguePoints": entry['leaguePoints'],
                    "wins": entry['wins'],
                    "losses": entry['losses'],
                    "veteran": entry['veteran'],
                    "inactive": entry['inactive'],
                    "freshBlood": entry['freshBlood'],
                    "hotStreak": entry['hotStreak']
                }
                user_info["league"].append(league_info)

        return user_info

    except requests.exceptions.Timeout:
        return {"error": "Request timed out"}
    except requests.exceptions.RequestException as e:
        return {"error": f"Request failed: {e}"}

유저네임과 태그를 가지고 리그정보까지 구하는 함수이다.

나는 솔로 랭크 관련한 정보만 가져오고 싶어서 if entry['queueType'] == 'RANKED_SOLO_5x5': 를 해줬다!