롤 게임관련 디스코드 봇 기능을 추가하기 위해 RIOT API를 이용해서 데이터를 얻어보자
✨1. DEVELOPMENT API KEY 얻기
우선 https://developer.riotgames.com/에 접속하여 로그인후 자신의 API 키를 얻자.
해당페이지에서 얻을수있는 API KEY는 기간이 하루이기 때문에
영구적으로 쓸수있는 키를 얻기위해서는 우측 상단 REGISTER PRODUCT를 눌러서 영구 API KEY를 발급받자
✨2. API 목록
https://developer.riotgames.com/apis에 들어가면 RIOT API를 얻을수있다.
✨2. 닉네임으로 정보얻기
우측칸에서 SUMMEONER-V4를 찾아서 GET /lol/summoner/v4/summoners/by-name/{summonerName}를 선택하여
EXECUTE REQUEST를 누르고 아래 RESPONSE CODE가 200이면 성공이다.
summonerName 찾고싶은 닉네임 SELECT REGION TO EXECUTE AGAINST 서버나라 SELECT APP TO EXECUTE AGAINST API키 선택 INCLUDE API KEY (?) 키를 포함시킬 방법
내가 여기서 필요한 데이터는 게임매칭 데이터를 얻기위해 필요한 puuid 이므로 이 데이터를 얻어보자.
✨3.Python으로 puuid 얻기
import requests
import json
api를 얻기위해 파이썬에서 HTTP를 사용하기 위해 쓰여지는 requests 라이브러리 와
json 형식을 처리하기위해 json 라이브러리를 사용하였다.
key_lol='여기에 API KEY를 작성하세요'
headers_lol= {"X-Riot-Token":key_lol}
nickname_lol="hide on bush"
url_lol='https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/'+nickname
r= requests.get(url_lol,headers=headers_lol)
print(r.json()['puuid'])
requests 라이브러리로 위에서 키를 포함시킬 방식을 Header Param했으므로 다음과같은 방법으로 헤더를 포함하여
url의 데이터를 requests한다.
그후 json 라이브러리를 이용하여 puuid의 값을 얻는다.
✨3.매칭데이터얻기
우측에서 MATCH-V5를 고르고 GET /lol/match/v5/matches/by-puuid/{puuid}/ids란에 들어간다.
나는 puuid 란에 방금 얻는 puuid 를 입력하여 데이터를 얻어보자
now = time.time()
diff=43200
start_time=now-diff #12시간전
r=requests.get('https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/'+lol_puuid+'/ids?startTime='+str(int(start_time))+'&start=0&count=20',headers=headers_lol)
print(r.json()) #게임 기록들
나의 경우엔 12시간 이내의 게임들을 얻기위해 time 라이브러리를 이용하여 위의 startTime칸 또한 활용하였다.
이때 시간은 timestamp형식이므로 이에 유의하여 작성하자.
✨3.게임내부데이터얻기
방금과 동일하게 MATCH-V5에서 이번에는 GET /lol/match/v5/matches/{matchId}란에 들어간다.
이곳에서 방금얻은 알고싶은 매칭의 id를 입력한다.
r=requests.get('https://asia.api.riotgames.com/lol/match/v5/matches/'+lol_match,headers=headers_lol)
game_duration=r.json()['info']['gameDuration'] #게임길이(초시간)
game_creation=r.json()['info']['gameCreation'] #게임시작시간(타임스탬프)
game_Mode=r.json()['info']['gameMode'] #게임맵
for i in range(10):#총 플레이어 10명
game_nickname=r.json()['info']['participants'][i]['summonerName'] #플레이어 이름
game_champion=r.json()['info']['participants'][i]['championName'] #챔프이름
game_kills=r.json()['info']['participants'][i]['kills'] #킬
game_deaths=r.json()['info']['participants'][i]['deaths'] #데스
game_assists=r.json()['info']['participants'][i]['assists'] #어시스트
game_win=r.json()['info']['participants'][i]['win'] #승패 bool 형식
game_dead_time=r.json()['info']['participants'][i]['totalTimeSpentDead'] #죽어있던 시간(초시간)
game_total_damage=r.json()['info']['participants'][i]['totalDamageDealtToChampions'] #딜량
game_total_taken_damage=r.json()['info']['participants'][i]['totalDamageTaken'] #받은 피해량
python을 통해 다음과같은 데이터를 얻어왔다.
from head import *
key_lol='라이엇 키를 입력해주세요'
headers_lol= {"X-Riot-Token":key_lol}
nickname_lol="검색할 닉네임을 검색해주세요"
match_list=[]
core_nick_list=["매칭내부에 들어가야하는 인원적어주세요"]
#매치 클래스
class match():
#생성
def __init__(self,game_duration,game_creation,game_Mode,player):
self.duration=str(datetime.timedelta(seconds=game_duration)) #매치 플레이시간
self.creation=str((dt.fromtimestamp(game_creation/1000)).strftime('%Y/%m/%d %H시 %M분 %S초')) #게임시작시간
self.mode=game_Mode #맵
self.players=player #플레이어 리스트
self.core_players=[]
#내가알고싶은애들 넣기
def set_core_player(self):
list1=[]
for i in self.players:
if (i.nickname in core_nick_list): self.core_players.append(i)
#출력
def print_data(self):
print("닉네임:"+str(self.players[0].nickname))
print("게임길이:"+str(self.duration))
print("챔피언:"+str(self.players[0].champion))
print("킬:"+str(self.players[0].kills))
print("데스:"+str(self.players[0].deaths))
print("어시:"+str(self.players[0].assists))
print("죽어있던시간:"+str(self.players[0].dead_time))
print("딜량:"+str(self.players[0].total_damage))
print("받은딜량:"+str(self.players[0].total_taken_damgage))
#알고싶은 애들 출력
def print_core_data(self):
print("게임길이:"+str(self.duration))
print("게임형식:"+self.mode)
print("게임시작시간:"+self.creation)
for player in self.core_players:
print("닉네임:"+str(player.nickname))
print("승리?:"+str(player.win))
print("챔피언:"+str(player.champion))
print("킬:"+str(player.kills))
print("데스:"+str(player.deaths))
print("어시:"+str(player.assists))
print("죽어있던시간:"+str(player.dead_time))
print("딜량:"+str(player.total_damage))
print("받은딜량:"+str(player.total_taken_damgage))
#디코출력용
def discord_print_lol(self):
body1=[]
win_game=""
output=""
for player_core in self.core_players:
body1.append([str(player_core.nickname),str(player_core.champion),str(player_core.kills)+"/"+str(player_core.deaths)+"/"+str(player_core.assists),str(player_core.total_damage),str(player_core.dead_time)])
win_game=player_core.win
head_print="["+str(self.creation)+"]"+win_game+"\t"+str(self.duration)+"\n"
output = t2a(
header=["닉네임", "챔프", "킬뎃", "딜량", "죽은시간"],
body=body1,
style=PresetStyle.thin_compact
)
output=head_print+output
print(output)
return output
#닉,딜같은 게임의 플레이어정보
class player():
def __init__(self,nickname,champion,kills,deaths,assists,win,dead_time,total_damage,total_taken_damage):
self.nickname=nickname
self.champion=champion
self.kills=kills
self.deaths=deaths
self.assists=assists
if win=="True": self.win="승리"
else: self.win="패배"
self.dead_time=str(datetime.timedelta(seconds=dead_time))
self.total_damage=total_damage
self.total_taken_damgage=total_taken_damage
#api 데이터 크롤링
class crol_lol():
#puuid 얻기
def get_puuid(nickname):
url_lol='https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/'+nickname
r= requests.get(url_lol,headers=headers_lol)
return r.json()['puuid'] #고유 puuid
#게임기록들얻기
def get_matchs(nickname):
lol_puuid=crol_lol.get_puuid(nickname)
r=requests.get('https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/'+lol_puuid+'/ids?start=0&count=20',headers=headers_lol)
now = time.time()
diff=43200+1000000
start_time=now-diff #12시간전
r=requests.get('https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/'+lol_puuid+'/ids?startTime='+str(int(start_time))+'&start=0&count=20',headers=headers_lol)
return r.json() #게임 기록들
#게임 세부사항얻기
def get_gamedata(nickname):
lol_matchs=crol_lol.get_matchs(nickname_lol) #12시간 내부의 게임 매치들
for lol_match in lol_matchs:
player_list=[]
r=requests.get('https://asia.api.riotgames.com/lol/match/v5/matches/'+lol_match,headers=headers_lol)
game_duration=r.json()['info']['gameDuration'] #게임길이(초시간)
game_creation=r.json()['info']['gameCreation'] #게임시작시간(타임스탬프)
game_Mode=r.json()['info']['gameMode'] #게임맵
for i in range(10):
game_nickname=r.json()['info']['participants'][i]['summonerName'] #플레이어 이름
game_champion=r.json()['info']['participants'][i]['championName'] #챔프이름
game_kills=r.json()['info']['participants'][i]['kills'] #킬
game_deaths=r.json()['info']['participants'][i]['deaths'] #데스
game_assists=r.json()['info']['participants'][i]['assists'] #어시스트
game_win=r.json()['info']['participants'][i]['win'] #승패 bool 형식
game_dead_time=r.json()['info']['participants'][i]['totalTimeSpentDead'] #뒤져있던 시간(초시간)
game_total_damage=r.json()['info']['participants'][i]['totalDamageDealtToChampions'] #딜량
game_total_taken_damage=r.json()['info']['participants'][i]['totalDamageTaken'] #받은 피해량
player_list.append(player(game_nickname,game_champion,game_kills,game_deaths,game_assists,game_win,game_dead_time,game_total_damage,game_total_taken_damage))#플레이어 10명데이터
match_list.append(match(game_duration,game_creation,game_Mode,player_list))
print("게임데이터 불러오기 완료")
print("게임데이터 불러오기 모두 완료")
'Language > Python' 카테고리의 다른 글
[Python] 말버릇 분석 프로그램 만들기 계획 (0) | 2024.05.09 |
---|---|
[Python] 리스트 컴프리헨션(Comprehension) (0) | 2024.04.05 |
[Python] 치지직 방송 라이브 여부를 확인해보자 (0) | 2024.03.20 |