3.파이썬을 이용한 디스코드 봇 만들기: 리그 오브 레전드 API (1)

4 분 소요

리그 오브 레전드 API에 대해

이번에는 저희가 개발하는 봇의 핵심이라고 할 수 있는 리그 오브 레전드 API(Riot API)에 대해 알아보겠습니다.

1. API 키 발급

대부분의 API 통신은 HTTP의 POST, GET을 통해 이루어집니다. 이때 Riot Games의 리그 오브 레전드 API 에서는 간단하게 API 키를 받아서 자유롭게 리그 오브 레전드 API에 접근할 수 있습니다. 이때 API 키는 DEVELOPMENT API KEYS, PERSONAL API KEYS 두가지로 나뉩니다. 저희는 간단하게 개발용 API 키를 받아서 개발을 진행해보겠습니다.

PERSONAL KEY의 경우 발급 요청시 라이엇 게임즈에서 직접 해당 요청을 검사해야 하기 때문에 발급까지 한 달 정도의 시간이 소요됩니다.

먼저, 라이엇 게임즈 개발자 홈페이지에 접속하셔서 자신의 라이엇 계정으로 로그인 하시면 됩니다.

r1

홈페이지 메인 하단에서 쉽게 개발용 API 키를 받으실 수 있습니다.
주의) 개발용 API의 경우 하루가 지나면 만료되며 같은 방법으로 다시 발급받으실 수 있습니다.

2. API REQUEST

이제 리그 오브 레전드 API에 접근할 수 있는 개발용 키도 얻었으니 파이썬을 통하여 직접 API에 접근해보겠습니다! 먼저 HTTP 요청을 위한 파이썬 라이브러리인 requests를 설치해야 합니다.

pip install requests 

requests 라이브러리는 사용법이 간단하며 내장된 json 라이브러리 또한 리그 오브 레전드 API를 이용하는데 큰 도움이 됩니다.

  • 임의의 .py 파일 생성
import requests

token = '(자신의 개발용 API 키)'
url = "https://kr.api.riotgames.com/lol/status/v4/platform-data"

response = requests.get(url, headers={'X-Riot-Token': token})

print("status_code: {}".format(response.status_code))
if response.status_code == 200:
    print(response.json())
  • 실행 결과

    status_code: 200
    {‘id’: ‘KR’, ‘name’: ‘Korea’, ‘locales’: [‘ko_KR’], ‘maintenances’: [], ‘incidents’: []}

리그 오브 레전드 API중 LOL-STATUS-V4를 이용하여 값을 요청하였습니다.
이때 HTTP 상태 코드 200은 성공을 의미합니다.

다음으로는 리그 오브 레전드의 API 종류에 대해 몇가지만 사용해보겠습니다. 라이엇에서 제공하는 API들은 라이엇 게임즈 개발자 홈페이지APIS에서 모두 확인이 가능하며 요청을 해볼 수도 있습니다.

  1. SUMMONER-V4

    가장 먼저 리그 오브 레전드의 소환사 정보에 대한 API를 사용해보겠습니다. r2

    위와 같이 SUMMONER-V4 API 에서도 여러가지 값으로 소환사의 정보를 요청할 수 있습니다. 이때 저희는 소환사의 이름인 by-name을 통하여 API 요청을 해보겠습니다.

    import requests
    
    token = '(자신의 개발용 API 키)'
    name = 'Hide on bush'
    url = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+name
    
    response = requests.get(url, headers={"X-Riot-Token": token})
    
    print("status_code: {}".format(response.status_code))
    if response.status_code == 200:
        print("{}의 소환사 레벨: {}".format(
            response.json()["name"], response.json()["summonerLevel"]))
    
    • 실행 결과

      status_code: 200
      Hide on bush의 소환사 레벨: 417

    HTTP 통신에서의 데이터는 모두 JSON 형식으로 전송됩니다. 따라서, response.json()을 통하여 해당 JSON 데이터를 파이썬의 딕셔너리로 변환하여 인덱스가 가능합니다!

    이때 저는 name과 summonerLevel의 데이터만을 이용했지만, SUMMONER-4 by-name 을 통하여 accountid, profileIconId, id, puuid 와 같은 데이터도 포함되므로 자신의 원하는 데이터를 사용하시면 됩니다.

  2. MATCH-V4

    r3

    MATCH-V4는 리그 오브 레전드의 각각의 매치 정보를 받아올 수 있는 API입니다. 위처럼 매치 정보를 얻어오기 위해서는 matchId 또는 encryptedAccountId 값이 필요합니다. 저희는 이전에 SUMMONER-V4에서 받은 accountId 값을 이용하여 API에 요청을 해보겠습니다.

    r4

    저희가 사용할 HTTP를 클릭하시면 위처럼 요청의 내용을 세분화할 수 있도록 QUERY PARAMETERS를 지원합니다. 이러한 파라미터들은 저희가 사용하는 requests 라이브러리에서 HTTP 요청시에 params 매개변수를 통해 쉽게 요청이 가능합니다.

    import requests
    
    token = '(자신의 개발용 API 키)'
    name = 'Hide on bush'
    url = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+name
    
    response = requests.get(url, headers={"X-Riot-Token": token})
    acid = response.json()["accountId"] # encryptedAccountId
    
    url = "https://kr.api.riotgames.com/lol/match/v4/matchlists/by-account/"+acid
    
    response = requests.get(url, 
                            headers={"X-Riot-Token": token}, 
                            params={"beginIndex": "0", 
                                    "endIndex": "1"})
    print("status_code: {}".format(response.status_code))
    print(response.json())
    
    • 실행 결과

      status_code: 200
      {‘matches’: [{‘platformId’: ‘KR’, ‘gameId’: 5019145431, ‘champion’: 876, ‘queue’: 420, ‘season’: 13, ‘timestamp’: 1613848052009, ‘role’: ‘NONE’, ‘lane’: ‘JUNGLE’}], ‘startIndex’: 0, ‘endIndex’: 1, ‘totalGames’: 118}

    QUERY PARAMETERS를 이용하여 자신이 원하는 값만을 얻어보세요!

  3. SPECTATOR-V4

    마지막으로 알아볼 SPECTATOR-V4는 현재 진행중인 게임에 대한 정보를 받아올 수 있는 API 입니다. 이를 응용하여 소환사가 현재 리그 오브 레전드 게임을 플레이하고 있는지 확인할 수 있습니다! 이때 앞서 입력했던 accountId가 아닌 summonerId임을 주의하셔야 합니다.

    import requests
    
    token = '(자신의 개발용 API 키)'
    name = 'Hide on bush'
    url = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+name
    
    response = requests.get(url, headers={"X-Riot-Token": token})
    suid = response.json()["id"] # encryptedSummonerId
    
    url = "https://kr.api.riotgames.com/lol/spectator/v4/active-games/by-summoner/"+suid
    
    response = requests.get(url, headers={"X-Riot-Token": token})
    print("status_code: {}".format(response.status_code))
    print(response.json())
    
    • 실행 결과

      status_code: 404
      {‘status’: {‘message’: ‘Data not found’, ‘status_code’: 404}}

    404의 경우 데이터가 발견되지 않음을 의미합니다. 현재 게임중이 아니군요. 만약 현재 게임중인 소환사에 대해 API 요청을 할 경우 아래와 같은 JSON 데이터를 받을 수 있습니다.

    • 게임중인 소환사의 경우

      status_code: 200
      {‘gameId’: 5019898968, ‘mapId’: 11, ‘gameMode’: ‘CLASSIC’, ‘gameType’: ‘MATCHED_GAME’, ‘gameQueueConfigId’: 420, ‘participants’: [{‘teamId’: …생략

    이처럼 현재 진행중인 게임의 정보, 게임에 참여중인 소환사들의 정보, 게임의 진행 정도 등 모든 데이터를 다 확인할 수 있습니다! 여기까지로 마무리하고 다음 글에서는 해당 API를 저희가 만들었던 디스코드 봇에 결합해보겠습니다. 감사합니다!

부록.

1. HTTP 요청 시 데이터 타입

리그 오브 레전드 API를 찾다 보면 해당 HTTP 요청에 필요한 데이터의 타입이 string, int, long 처럼 다양함을 알 수 있습니다.
하지만 필요한 데이터 타입과 별개로 requests 라이브러리의 HTTP 통신에서는 오로지 Byte, String 타입만을 전송할 수 있습니다. 이는 requests 라이브러리만의 특징이 아니라 모든 HTTP 통신이 Byte 타입으로 이루어지기 때문입니다. (String 타입의 경우 Byte로 변환 후 전송)

따라서 API에서 필요로 하는 데이터에 알맞은 타입을 전송한다는 의미는 실제 타입의 값을 의미하는 것이 아닌 byte 파일로 encode 되어 API 서버로 전송된 데이터가 서버에서 decode 하게 될 때의 데이터 타입을 의미하는 것입니다!

예를 들어 API 서버에서 Integer 타입의 데이터를 요구할 경우 사용자는 1 이라는 Integer 타입을 전송하는 것이 아닌 '1' 이라는 String 타입을 Byte 타입으로 변환하여 전송하는 것입니다. 이후 서버에서는 해당 Byte 데이터를 decode 하여 1이라는 Integer 값을 얻게 되는것이죠.

2. RiotWatcher 라이브러리

이번 글에서 설명한 모든 API 데이터 요청은 requests 라이브러리를 통한 HTTP 통신으로 이루어집니다. 이때 requests를 사용하지 않고 간단하게 API 요청을 할 수 있는 라이엇 게임즈 API Wrapper 라이브러리가 있어서 소개하려고합니다.

(GitHub) Riot Watcher GitHub 홈페이지를 직접 참고하세요!

해당 라이브러리를 이용하면 기존의 SUMMONER-V4 API 요청을 다음과 같이 간결한 코드로 표현할 수 있습니다.

  • 기존 코드
import requests

token = '(자신의 개발용 API 키)'
name = 'Hide on bush'
url = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+name

response = requests.get(url, headers={"X-Riot-Token": token})

print("status_code: {}".format(response.status_code))
if response.status_code == 200:
    print("{}의 소환사 레벨: {}".format(
        response.json()["name"], response.json()["summonerLevel"]))
  • Riot Watcher
from riotwatcher import LolWatcher, ApiError

token = '(자신의 개발용 API 키)'
name = 'Hide on bush'
region = 'kr'
lol_watcher = LolWatcher(token)

response = lol_watcher.summoner.by_name(region, name)
print("{}의 소환사 레벨: {}".format(
        response["name"], response["summonerLevel"]))

댓글남기기