3.파이썬을 이용한 디스코드 봇 만들기: 리그 오브 레전드 API (1)
리그 오브 레전드 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
의 경우 발급 요청시 라이엇 게임즈에서 직접 해당 요청을 검사해야 하기 때문에 발급까지 한 달 정도의 시간이 소요됩니다.
먼저, 라이엇 게임즈 개발자 홈페이지에 접속하셔서 자신의 라이엇 계정으로 로그인 하시면 됩니다.
홈페이지 메인 하단에서 쉽게 개발용 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
에서 모두 확인이 가능하며 요청을 해볼 수도 있습니다.
-
SUMMONER-V4
가장 먼저 리그 오브 레전드의 소환사 정보에 대한 API를 사용해보겠습니다.
위와 같이
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 와 같은 데이터도 포함되므로 자신의 원하는 데이터를 사용하시면 됩니다. - 실행 결과
-
MATCH-V4
MATCH-V4
는 리그 오브 레전드의 각각의 매치 정보를 받아올 수 있는 API입니다. 위처럼 매치 정보를 얻어오기 위해서는matchId
또는encryptedAccountId
값이 필요합니다. 저희는 이전에SUMMONER-V4
에서 받은accountId
값을 이용하여 API에 요청을 해보겠습니다.저희가 사용할 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
를 이용하여 자신이 원하는 값만을 얻어보세요! - 실행 결과
-
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"]))
댓글남기기