Python brawlstats으로 브롤 스타즈 전투 기록 수집하기
- 마침 Python의
brawlstats
라이브러리가 브롤 스타즈 API wrapper를 제공하고 있어 전투 기록을 모으는 게 가능해졌습니다. 따라서 이 포스팅에서는 다음과 같이 전투 기록을 주기적으로 모으는 방법에 대해 설명하고자 합니다. - 관련 코드는 이 곳에서 확인하실 수 있습니다.
Introduction
이 맵은 이 조합 (ex. 탱, 딜, 힐)이다!
이 브롤러의 스타 파워 or 가젯은 이 맵에서 매우 강력하다 / 미약하다!
플레이 시간이 길수록 이길 확률은 낮아진다!
게임을 오래 하다 보면 위와 같이 가설을 갖곤 합니다. 브롤 스타즈 장기 유저 & 나름의 데이터 분석가로서 이런 가설들을 실제로 검증하고 싶다는 생각을 항상 해왔습니다.
마침 Python의 brawlstats
라이브러리가 브롤 스타즈 API wrapper를 제공하고 있어 전투 기록을 모으는 게 가능해졌습니다. 따라서 이 포스팅에서는 다음과 같이 전투 기록을 주기적으로 모으는 방법에 대해 설명하고자 합니다.
- Brawl Stars API 토큰 발급받기 & Python
brawlstats
설치하기 - AWS EC2 가상환경에서 전투기록 파싱하기
- AWS EC2 가상환경에서 crontab으로 주기적으로 전투기록 저장하기
본격적으로 들어가기 전에 설명드릴 개념은 다음과 같습니다.
- 젬 그랩(Gem Grab): 3 대 3으로 팀을 이루고, 팀 총합 보석을 10개 이상 얻고 카운트다운이 종료될 때까지 버틴 팀이 승리하는 게임
- 맵: 젬 그랩에서 싸우는 장소, 하루 정도 지나면 맵이 바뀌고, 맵에 따라 맞는 브롤러들이 다름
- 브롤러: 젬 그랩에서 싸우는 캐릭터, 유저 별로 가진 브롤러 중 하나를 택해 젬 그랩에 참여할 수 있음
- 트로피: 게임에서 이길 때마다 브롤러 트로피가 8씩 더해지고, 지면 브롤러의 랭크에 따라 감소됨
- 스타파워 & 가젯
- 스타 파워는 브롤러 파워레벨이 10일 때 가지는 추가 능력 (패시브 스킬)
- 가젯은 브롤러 파워레벨이 7 이상일 때 가지는 추가 능력이고 게임 당 2~3번씩 발동 가능. 보통은 스타 파워에 비해 미미하나 브롤러에 따라 매우 강력할 수 있음
토큰 발급 및 Python brawlstats
설치
브롤스타즈가 기존에는 공식 API와 비공식 API를 둘 다 제공했는데 이제 공식 API로 통합되었습니다. 토큰이란 파이썬 brawlstats
모듈에서 API에 접속하기 위한 비밀번호와 같은 것입니다. 자세한 과정은 다음과 같습니다.
-
브롤스타즈 공식 API에 접속하고 가입합니다.
-
My Keys > Create New Key를 클릭합니다.
-
KEY NAME과 DESCRIPTION은 적당히 적으시면 되고, ALLOWED IP ADDRESS에는 브롤 스타즈 API에 접속할 때 사용하는 IP 주소를 적어줍니다. 이 주소 외에 다른 IP로 접속할 수 없습니다. 네이버에서 "내 IP 주소"라 검색하면 쉽게 현재 접속하고 있는 IP 주소를 알 수 있습니다.
-
Create Key를 클릭하면 토큰이 발급됩니다. 이 토큰은 외부에 공개하지 않도록 주의합시다. 이제 이 토큰을 텍스트 파일로 적당한 곳에 저장해놓습니다.
-
리눅스 커맨드 창에 다음과 같이
brawlstats
모듈을 설치합니다.1
pip install brawlstats
AWS EC2 가상환경에서 전투기록 파싱하기
Python의 brawlstats
라이브러리에 대한 공식 문서는 이 곳에서 찾을 수 있습니다.
전투 기록을 파싱하려면 앞서 발급받은 토큰과 내 게임 태그가 필요합니다. 게임 태그는 브롤 스타즈에 접속해서 좌측 상단의 제 닉네임을 클릭하시면 확인할 수 있습니다.
아래 사진에서 #URC00YYV
가 제 게임 태그입니다.
전투 기록을 불러오려면 태그 가장 앞에 있는 #
을 제외하고 입력하셔야 합니다. 다음 코드에서 tag
에 해당합니다.
1 | import brawlstats |
제 경우 위에서 발급받은 토큰을 Downloads
폴더에 token.txt
텍스트 형태로 넣어놓고 불러왔습니다.
get_battle_logs
: 최근 25건의 전투 기록 불러오기
brawlstats
의 get_battle_logs
함수를 이용하면 위와 같은 최근 25건의 전투 기록을 로그 형태로 불러올 수 있습니다.
1 | battles=client.get_battle_logs(tag) |
client
에 get_battle_logs
함수를 적용하면 해당 tag
를 가진 유저의 최근 25 건의 전투 기록을 불러옵니다. battles
를 출력하면 <brawlstats.models.BattleLog at 0x1633c36f408>
라 클래스 정보가 나오고, battles[0]
로 가장 최근 게임 정보를 확인하면 다음과 같이 Box 형태로 출력됩니다. (하필 또 진 기록이네요…하핫)
펼쳐 보기
1 | <Box: |
이 기록은 브롤 스타즈 전투 기록의 첫 번째에 대응됩니다. <Box>
형태로 되어 있는 전투 기록을 살펴보면 다음의 내용을 포함하고 있습니다.
- battle_time: 전투 시간 (UTC +0:00)
- event: 게임 모드의 정보
- id: 게임 모드의 id
- mode: 게임 모드
- map: 젬 그랩의 맵
- battle: 전투 기록
- mode: 게임 모드
- type: 게임 타입
- result: victory (승)/defeat (패)
- duration: 게임 지속 시간 (초)
- trophy_change: 게임 결과로 인한 내 캐릭터의 트로피 변화
- star_player: 스타플레이어, 이긴 팀에서 1명 뽑힘
- tag: 스타플레이어의 태그
- name: 스타플레이어의 이름
- brawler: 스타플레이어의 브롤러
- teams: 팀 정보
- 우리 팀
- 팀원 1
- 팀원 2
- 팀원 3
- 상대 팀
- 팀원 4
- 팀원 5
- 팀원 6
- 우리 팀
의 정보들을 담고 있습니다.
get_profile
: 유저 정보 불러오기
brawlstats
의 get_profile
함수를 이용하면 위와 같이 모드별 승리 횟수나 브롤러 보유 정보에 대해 불러올 수 있습니다.
1 | profile = client.get_profile(tag) |
profile
을 출력하면 <Player object name='응찌' tag='#URC00YYV'>
라 나오고, profile.raw_data
라 입력하면 다음과 같이 제 모든 게임 정보들이 나옵니다.
펼쳐 보기
1 | {'tag': '#URC00YYV', |
Python으로 전투 기록 파싱하기
따라서 이를 이용해 젬 그랩의 전투 기록을 파싱하는 함수는 다음과 같습니다.
1 |
|
이렇게 저장된 정보는 총 17개의 변수를 가지고, 유저 당 최대 150개 (25번의 전투 6명)의 행을 갖게 됩니다.
이를 확장해 여러 유저의 전투 기록을 파싱하는 코드를 다음과 같이 작성했습니다.
1 | def parse_all_users(self,tags): |
가끔 로그를 모으다 오류가 나는 경우가 있어 그 경우는 try
와 except
구문으로 for
문을 멈추지 않고 다음 유저로 넘어가도록 했습니다.
AWS EC2 가상환경에서 crontab으로 주기적으로 전투기록 저장하기
윈도우에서도 작업 스케줄러나 cron으로 원하는 시간마다 파이썬 코드가 실행되도록 예약 작업을 할 수 있지만 (참조), 항상 컴퓨터를 켜놓아야 되는 부담 때문에 AWS EC2 가상환경에서 crontab을 이용하기로 했습니다. crontab에 대한 자세한 설명과 사용 방법은 이 포스팅을 참조하시면 됩니다. crontab을 이용해 주기적으로 전투기록을 저장하는 방법은 다음과 같습니다.
-
위의 함수들을
brawlparser
라는Class
에 저장해놓고bsparser.py
로 저장 -
main.py
에crontab
을 실행할 파서 작성 -
AWS EC2 커맨드 창에서
crontab -e
로 crontab에 진입 -
Shift + G
,i
를 차례대로 누름 다음과 같이 작성Esc
,:wq
차례대로 눌러 crontab 저장1
20 17 * * * sudo python3 main.py --token_path token --output_dir ./rankers-data --tag URC00YYV --tag_path rankers.csv
0 17 * * * sudo python3 main.py --token_path token --output_dir ./my-data --tag URC00YYV -
데이터를 저장할 경로인
output_dir
로 rankers-data 폴더와 my-data 폴더 생성
main.py
는 다음과 같이 argument로 4개를 입력하도록 만들었습니다.
1 | import argparse |
token_path
: 앞서 발급받은 토큰의 경로output_dir
: 데이터를 저장하는 경로tag_path
: 태그가 있는 경로. 저는 상위 200명의 랭커들의 태그를rankers.csv
에 저장해놓고, 이를tags
로 불러왔습니다.tag
: Python 브롤 스타즈 API에 접속할 태그. 저는 제 태그인URC00YYV
를 넣었습니다.
만약 제 전투기록만 불러오고 싶다면 tag_path
의 flag를 쓰지 않으면 됩니다! 이 후 crontab에는 매일 오후 5시 (젬그랩 맵이 바뀌는 시간)에 저장하도록 했습니다.
전체 코드는 이 곳에서 확인하실 수 있습니다. 이렇게 한 열흘 간 데이터를 모아서 여러 주제로 분석해볼 예정입니다. 재밌는 인사이트가 나오면 좋겠군요!