0. 서론
지난 번에 이어서 Riot api를 통해 어떻게 정보를 얻는지 알아보았습니다. 이제는 그 정보를 받기위해 코드를 작성해보려고합니다.
다시한번 적지만
(1) account-v1을 통해 내가 원하는 아이디의 정보를 얻기 위해서는 게임닉네임과 태그라인을 입력해야합니다. 그러고 나면 puuid값을 얻게 됩니다.
(2) summoner-v4를 통해 그 값을 입력하고 id값을 추출합니다.
(3) league-v4를 통해 id값을 입력하면 내가 원하는 전적 데이터들을 얻게 됩니다.
이런식으로 진행이 되어야합니다.
깃허브 주소
1. account-v1
일단은 내가 원하는 계정의 puuid를 가져와야합니다. 그러므로
(1) def summoner_tier_view(request):
(2) if request.method == 'GET':
(3) form = SummonerForm(request.GET)
(4) if form.is_valid():
(5) api_key = settings.RIOT_API_KEY
(6) account_region = 'asia'
(7) region = 'kr' # 게임 서버 지역 설정
(8) game_name = form.cleaned_data['game_name']
(9) tag_line = form.cleaned_data['tag_line'] or 'KR1'
# 1. PUUID 가져오기
(10) puuid = get_puuid_by_riot_id(account_region, game_name, tag_line, api_key)
(1) 함수정의하고 request를 통해 api를 가져오도록합니다.
(2) Riot에서 요청한 GET요청일 경우에만 코드를 실행하도록합니다.
(3) SummonerForm 클래스를 이용해서 사용자가 입력한 값이 유효한지 확인합니다.
(4) 앞서 작성한 값이 올바른 형식으로 입력이 되었는지 확인합니다.True값을 반환하면 폼의 검증을 통과한 것입니다.
(5) .env에 저장한 본인의 KEY값을 가져옵니다.
(6) 해당계정의 지역을 설정해야합니다. 하지만 저는 이를 한국계정만 볼것이기때문에 asia로 고정시켰습니다.
(7) (6)과 마찬가지의 이유로 한국 서버의 계정만을 필요로 하기때문에 kr을 지정했습니다.
(8) 입력한 game_name값을 가져옵니다.
(9) 마찬가지로 입력한 tag_line값을 가져옵니다. 입력하지 않는다면 KR1값을 기본값으로 설정합니다.
(10) riot_api.py에 입력한 get_puuid_by_riot_id 함수를 호출해서 해당 계정의 puuid값을 가져오도록합니다.
2. riot_api.py
이제 puuid를 얻기위해 api를 호출하는 함수를 작성해야합니다.
(1) def get_puuid_by_riot_id(region, game_name, tag_line, api_key):
(2) url = f"https://{region}.api.riotgames.com/riot/account/v1/accounts/by-riot-id/{game_name}/{tag_line}"
(3) headers = {"X-Riot-Token": api_key}
(4) response = requests.get(url, headers=headers)
(5) if response.status_code == 200:
(6) data = response.json()
(7) return data['puuid']
else:
(8) print(f"Error fetching PUUID: {response.status_code}")
(9) return None
(1) 함수를 정의하고 Riot에서 필요로하는 값을 매개변수로 넣습니다.
(2) api를 요청을 보낼 url을 만듭니다.
# 자세한건 https://developer.riotgames.com/apis#account-v1 이곳을 참고하시면 됩니다.
(3) Riot games api에서는 X-riot_token 헤더에 api 키가 포함되어야 요청을 허용하므로 이를 통해 인증을 설정합니다.
(4) (3)에서 적은 값을 통해 url에 get요청을 보냅니다.
(5) 위 과정을 통해 HTTP 응답 코드가 200인 경우에 실행하도록 합니다.
(6) API의 응답을 json형식으로 파싱합니다.
(7) 그 받은 json 데이터에서 'puuid' 값만을 추출하여 반환합니다.
(8) 200이 아닐경우 오류메세지를 출력하고 none으로 반환합니다.
3. summoner-v4
이제 얻은 puuid값을 입력해서 얻은 데이터 값중에 필요한 id값을 얻어야합니다.
(1) summoner_info = get_summoner_by_puuid(region, puuid, api_key)
(2) if summoner_info:
(3) encrypted_summoner_id = summoner_info.get('id')
(1) get_summoner_by_puuid 함수를 호출해서 정보를 얻어야합니다.
(2) 그 값이 존재한다면
(3) id값을 새롭게 저장해줍니다.
4. riot_api.py
(1) def get_summoner_by_puuid(region, puuid, api_key):
(2) url = f"https://{region}.api.riotgames.com/lol/summoner/v4/summoners/by-puuid/{puuid}"
(3) headers = {
"X-Riot-Token": api_key
}
(4) response = requests.get(url, headers=headers)
(5) if response.status_code == 200:
(6) data = response.json()
return data # 소환사 정보를 반환
else:
(7) print(f"Error fetching summoner info: {response.status_code} - {response.text}")
return None
(1) get_summoner_by_puuid 함수를 정의합니다. 마찬가지로 api에서 요구하는 매개변수를 넣어줍니다.
(2) api요청을 보낼 url을 작성합니다.
# https://developer.riotgames.com/apis#summoner-v4/GET_getByPUUID 이 주소를 참고하시면 됩니다.
(3) 마찬가지로 api key값을 header에 저장합니다.
(4) url값과 headers를 입력한뒤에 get요청을 보내 응답을 얻습니다.
(5) 응답 코드가 200이라면 진행합니다.
(6) api을답을 json 형식으로 파싱하여 data에 저장하고 이 값을 반환합니다.
(7) 응답 코드가 200이 아니라면 에러코드를 실행하고 반환합니다.
5. league-v4
이제 앞서 받은 'id'값을 가지고 입력을 하게 된다면 해당 계정의 솔로랭크에 대한 정보가 뜨게 됩니다.
# 3. 티어 정보 가져오기
(1) if encrypted_summoner_id:
league_entries = get_league_entries_by_summoner_id(region, encrypted_summoner_id, api_key)
(2) if league_entries:
context = {
'game_name': game_name,
'tag_line': tag_line,
'puuid': puuid,
'summoner_info': summoner_info,
'league_entries': league_entries,
}
return render(request, 'riot_api/summoner_tier.html', context)
(3) else:
error_message = "티어 정보를 가져올 수 없습니다."
(4) else:
error_message = "소환사 ID를 가져올 수 없습니다."
(1) 해당 계정의 id값이 제대로 추출되고 저장되었는지 검증해야합니다.
get_league_entries_by_summoner_id 함수를 호출해서 그 계정의 정보를 가져오도록합니다.
(2) 그 정보가 성공적으로 가져(반환)왔다면 다음단계로 진행합니다. 그리고 받은 데이터를 내가 원하는 딕셔너리 형태로 전달하도록 준비합니다.
render를 통해 context에 저장된 소환사의 정보를 summoner_tier.html 탬플릿에 전달하여서 이를 화면에 표시하도록합니다.
(3) league_enries가 제대로 반환되지 않으면 다음 메세지를 출력합니다.
(4) id값이 없을경우 에러 메세지를 출력합니다.
6. riot_api.py
(1) def get_league_entries_by_summoner_id(region, encrypted_summoner_id, api_key):
(2) url = f"https://{region}.api.riotgames.com/lol/league/v4/entries/by-summoner/{encrypted_summoner_id}"
(3) headers = {
"X-Riot-Token": api_key
}
(4) response = requests.get(url, headers=headers)
(5) if response.status_code == 200:
data = response.json()
return data # 티어 정보를 포함한 리스트 반환
(6) else:
print(f"Error fetching league entries: {response.status_code} - {response.text}")
return None
(1) 함수를 정의해서 api를 통해 정보를 얻고자합니다.
(2) 위와 마찬가지로 https://developer.riotgames.com/apis#league-v4/GET_getLeagueEntriesForSummoner 해당 주소를 통해 정보를 요청합니다.
(3) api키를 headers에 입력합니다.
(4) api키와 url을 가지고 get요청을 보내 정보를 받습니다.
(5) 응답코드가 200이라면 json형태로 데이터를 파싱합니다.
(6) 아니라면 에러메세지를 출력하고 none을 리턴하도록합니다.
7. views.py 코드
from django.shortcuts import render
from django.conf import settings
from .riot_api import (
get_puuid_by_riot_id,
get_summoner_by_puuid,
get_league_entries_by_summoner_id,
)
from .forms import SummonerForm
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
@csrf_exempt
def summoner_tier_view(request):
if request.method == 'GET':
form = SummonerForm(request.GET)
if form.is_valid():
api_key = settings.RIOT_API_KEY
account_region = 'asia'
region = 'kr' # 게임 서버 지역 설정
game_name = form.cleaned_data['game_name']
tag_line = form.cleaned_data['tag_line'] or 'KR1'
# 1. PUUID 가져오기
puuid = get_puuid_by_riot_id(account_region, game_name, tag_line, api_key)
if puuid:
# 2. 소환사 정보 가져오기
summoner_info = get_summoner_by_puuid(region, puuid, api_key)
if summoner_info:
encrypted_summoner_id = summoner_info.get('id')
# 3. 티어 정보 가져오기
if encrypted_summoner_id:
league_entries = get_league_entries_by_summoner_id(region, encrypted_summoner_id, api_key)
if league_entries:
context = {
'game_name': game_name,
'tag_line': tag_line,
'puuid': puuid,
'summoner_info': summoner_info,
'league_entries': league_entries,
}
return render(request, 'riot_api/summoner_tier.html', context)
else:
error_message = "티어 정보를 가져올 수 없습니다."
else:
error_message = "소환사 ID를 가져올 수 없습니다."
else:
error_message = "소환사 정보를 가져올 수 없습니다."
else:
error_message = "PUUID를 가져올 수 없습니다. 닉네임과 태그라인을 확인하세요."
return render(request, 'riot_api/error.html', {'error_message': error_message})
else:
form = SummonerForm()
return render(request, 'riot_api/summoner_form.html', {'form': form})
8. riot_api.py 코드
import requests
def get_puuid_by_riot_id(region, game_name, tag_line, api_key):
url = f"https://{region}.api.riotgames.com/riot/account/v1/accounts/by-riot-id/{game_name}/{tag_line}"
headers = {"X-Riot-Token": api_key}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
return data['puuid']
else:
print(f"Error fetching PUUID: {response.status_code}")
return None
def get_summoner_by_puuid(region, puuid, api_key):
url = f"https://{region}.api.riotgames.com/lol/summoner/v4/summoners/by-puuid/{puuid}"
headers = {
"X-Riot-Token": api_key
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
return data # 소환사 정보를 반환
else:
print(f"Error fetching summoner info: {response.status_code} - {response.text}")
return None
def get_league_entries_by_summoner_id(region, encrypted_summoner_id, api_key):
url = f"https://{region}.api.riotgames.com/lol/league/v4/entries/by-summoner/{encrypted_summoner_id}"
headers = {
"X-Riot-Token": api_key
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
return data # 티어 정보를 포함한 리스트 반환
else:
print(f"Error fetching league entries: {response.status_code} - {response.text}")
return None
9. 테스트
실제 상위권 유저중 한명의 정보를 입력해본결과 제대로된 값이 나오게 되었습니다.
<h1>XX님의 티어 정보</h1>
<h2>소환사 정보</h2>
<ul>
<li>소환사명: XX#KR1</li>
<li>소환사 레벨: XXX</li>
</ul>
<h2>티어 정보</h2>
<ul>
<li>
큐 타입: RANKED_SOLO_5x5<br>
티어: CHALLENGER I<br>
LP: 1306<br>
승리: 163 | 패배: 111
</li>
<hr>
</ul>
포스트맨에서도 제대로 나온것을 확인하였습니다.
소환사 명은 혹시 몰라서 가려놨습니다...
10. 후기
일단은 스트리머들의 전적 정보를 저장하기 전에 전적검색 기능을 구현하였습니다. 생각보다 복잡한 방식이었고
다른 블로그들은 참고해서 django로 만드는 과정이 재미나네요
이제 다음 글에서는 내가 원하는 스트리머들의 정보를 하나씩 입력하고 저장하도록하는 기능을 넣어보려고합니다.
근데 로그인 한 사람만 가능하도록 해야할거같기도하고... 고민이네요
프론트엔드쪽은 그냥 보여주기 기능만하려고합니다...
깃허브 주소