League of Legends 챔피언 데이터 가져오기

최석우·2022년 5월 6일
1

league

목록 보기
2/2

시작하기 전에 ..

롤 api로 데이터를 가져오게 되면 "소환사 명", "챔피언 명"보다는 각각에 붙어있는 고유 번호를 통해 정보를 얻게 된다. 따라서 롤 api를 사용하기 전에 우리는 League of legends의 static 데이터를 미리 저장해두고 사용해야 한다.

League of Legends의 static 데이터 가져오기

League of legends는 개발자 사이트에서 api 전반에 사용되는 데이터의 docs를 제공하고 있다.

https://developer.riotgames.com/docs/lol

해당 사이트에서는 리그오브레전드의 버전, 맵 이름, 매치 정보, 게임 모드, 지역명, 언어명 등을 표현하는 json파일들과 해당 패치마다 챔피언 데이터들을 모아서 파일로 제공한다.

각각 파일을 직접 사용해도 되지만 우리는 중간에 Data Dragon이라는 파일을 활용할 예정이다.

스크롤을 1/4쯤 내리면 아래 사진과 같은 페이지를 볼 수 있다.

작성일 기준 최신 버전의 링크는 다음과 같다.

https://ddragon.leagueoflegends.com/cdn/dragontail-12.8.1.tgz

알집 프로그램이 있다면 압축해제를 하면 되고, 없다면 cmd창에서 .tgz파일을 다운로드 한 경로로 이동한 뒤 압축이 풀릴 빈 폴더를 하나 생성하고 아래 명령어를 사용하면 된다.

$tar -zxvf [압축파일이름] -C [해제폴더이름]

필자는 dragontail이라는 폴더에 압축을 풀었으며 압축을 풀면 다음과 같은 폴더들이 보인다.

dragontail/
    dragonhead.js
    languages.js
    languages.json
    lolpatch_12.8/
    	manifest.js
        manifest.json
    img/
        bg/
        champion/
        global/
        perk-images/
    12.8.1/
    	css/
        data/
        img/
        js/
        manifest.js
        manifest.json

표시된 폴더들 밑에 데이터들이 더 존재하고 있다. 우리가 주로 필요로 할 정보는 주로 12.8.1/data/ 폴더의 하위에 들어있고, 나머지 폴더들 중 img파일들은 스킬이나 룬, 챔피언들의 사진이 필요하다면 때에 따라 사용하면 된다.

불러온 데이터 살펴보기

dragontail/12.8.1/data/ko_KR/ 폴더로 들어가보자.

dragontail/12.8.1/data/ko_KR/
    champion/
	champion.json
    championFull.json
    item.json
    language.json
    map.json
    mission-assets.json
    profileicon.json
    runesReforged.json
    sticker.json
    summoner.json

이 폴더에 한국어로 리그오브레전드 전반에 사용되는 데이터들이 모두 들어있다. 각 파일들 중 주요한 파일과 내용은 다음과 같다.

  • champion.json, championFull.json : 챔피언 데이터(Full 파일은 더 자세한 정보)
  • item.json : 아이템 데이터
  • runesReforged.sjon : 룬 데이터
  • summoner.json : 소환사주문 데이터

나머지 파일들도 읽어보면 어떤 내용들인지 금방 확인할 수 있다. 아래는 item.json의 BF대검에 대한 정보이다.

{
	"1038" : {
      "name":"B.F. 대검",
      "description":"<mainText><stats>공격력 <attention>40</attention></stats></mainText><br>",
      "colloq":";bf;절친;sword",
      "plaintext":"공격력이 대폭 증가합니다.",
      "into":["3026","3031","3072","3095","4403"],
      "image":{"full":"1038.png","sprite":"item0.png","group":"item","x":192,"y":48,"w":48,"h":48},
      "gold":{"base":1300,"purchasable":true,"total":1300,"sell":910},
      "tags":["Damage"],
      "maps":{"11":true,"12":true,"21":true,"22":false}
}

재밌게도 아이템창에 "절친"이라고 검색하면 BF대검이 뜬다는 것을 확인할 수 있다. (colloq)

챔피언 데이터 ER diagram

우리는 해당 정보들 중 가장 규모가 크고 양이 많은 챔피언 데이터를 정리하고 sqlite3 db에 넣고자 한다. 기본적으로 게임사에서 데이터를 제공할 때 id와 같은 key들로 정규화를 해두었기 때문에, 우리는 해당 json파일을 토대로 ER diagram을 그려서 django models.py에 작성해보자.

데이터를 정리하기 전에 먼저 데이터를 한번 훑어보자. championFull.json에는 각 챔피언들의 모든 정보가 들어있다.

//chapionFull.json
{
	"type" : "champion",
    "format" : "full",
    "version" : "12.8.1",
    "data" : {
    	"Aatrox" : {
        	"id" : "Aatrox",
            "key" : "266",
            "name" : "아트록스",
            "title" : "다르킨의 검",
            "image": {"full":"Aatrox.png","sprite":"champion0.png","group":"champion","x":0,"y":0,"w":48,"h":48},
            "skins":[{"id":"266000","num":0,"name":"default","chromas":false},{"id":"266001","num":1,"name":"정의의 아트록스","chromas":false},{"id":"266002","num":2,"name":"메카 아트록스","chromas":true},{"id":"266003","num":3,"name":"바다 사냥꾼 아트록스","chromas":false},{"id":"266007","num":7,"name":"불의 축제 아트록스","chromas":false},{"id":"266008","num":8,"name":"프레스티지 불의 축제 아트록스","chromas":false},{"id":"266009","num":9,"name":"승리의 아트록스","chromas":true},{"id":"266011","num":11,"name":"오디세이 아트록스","chromas":true},{"id":"266020","num":20,"name":"프레스티지 불의 축제 아트록스 (2022)","chromas":false},{"id":"266021","num":21,"name":"달을 삼킨 아트록스","chromas":true}],
            "lore":"한때는 공허에 맞서 싸웠던 슈리마의 명예로운 수호자 아트록스와 그의 종족은 결국 공허보다 위험한 존재가 되어 룬테라의 존속을 위협했지만, 교활한 필멸자의 마법에 속아넘어가 패배하게 되었다. 수백 년에 걸친 봉인 끝에, 아트록스는 자신의 정기가 깃든 마법 무기를 휘두르는 어리석은 자들을 타락시키고 육신을 바꾸는 것으로 다시 한번 자유의 길을 찾아내었다. 이제 이전의 잔혹한 모습을 닮은 육체를 차지한 아트록스는 세상의 종말과 오랫동안 기다려온 복수를 열망한다.",
            "blurb":"한때는 공허에 맞서 싸웠던 슈리마의 명예로운 수호자 아트록스와 그의 종족은 결국 공허보다 위험한 존재가 되어 룬테라의 존속을 위협했지만, 교활한 필멸자의 마법에 속아넘어가 패배하게 되었다. 수백 년에 걸친 봉인 끝에, 아트록스는 자신의 정기가 깃든 마법 무기를 휘두르는 어리석은 자들을 타락시키고 육신을 바꾸는 것으로 다시 한번 자유의 길을 찾아내었다. 이제 이전의 잔혹한 모습을 닮은 육체를 차지한 아트록스는 세상의 종말과 오랫동안 기다려온 복수를...",
            "allytips":["공격 성공률을 높이려면 다르킨의 검을 사용하는 동안 파멸의 돌진을 사용하세요.","지옥사슬 같은 군중 제어 스킬이나 아군의 이동 불가 효과를 통해 다르킨의 검을 쉽게 적중시킬 수 있습니다.","전투를 시작할 준비가 되면 세계의 종결자를 사용하세요."],
            "enemytips":["아트록스의 공격은 미리 표시되므로 공격이 예상되는 지역에서 벗어나세요.","아트록스를 향해 이동하거나 양옆으로 이동하면 지옥사슬에서 더 쉽게 벗어날 수 있습니다.","아트록스가 궁극기를 사용하면 부활하지 못하도록 거리를 유지하세요."],
            "tags":["Fighter","Tank"],
            "partype":"피의 샘",
            "info":{"attack":8,"defense":4,"magic":3,"difficulty":4},
            "stats":{"hp":580,"hpperlevel":90,"mp":0,"mpperlevel":0,"movespeed":345,"armor":38,"armorperlevel":3.25,"spellblock":32,"spellblockperlevel":1.25,"attackrange":175,"hpregen":3,"hpregenperlevel":1,"mpregen":0,"mpregenperlevel":0,"crit":0,"critperlevel":0,"attackdamage":60,"attackdamageperlevel":5,"attackspeedperlevel":2.5,"attackspeed":0.651},
            "spells":[{"id":"AatroxQ","name":"다르킨의 검","description":"아트록스가 대검을 내리쳐 물리 피해를 줍니다. 세 번까지 휘두를 수 있으며 각 공격은 피해 범위가 다릅니다.","tooltip":"아트록스가 대검을 내리쳐 <physicalDamage>{{ qdamage }}의 물리 피해</physicalDamage>를 입힙니다. 끝에 적중한 적을 잠깐 <status>공중으로</status> 띄워 올리고 <physicalDamage>{{ qedgedamage }}</physicalDamage>의 피해를 입힙니다. 이 스킬은 두 번 <recast>재사용</recast>할 수 있으며 다시 사용할 때마다 범위 모양이 변하고 이전보다 25% 더 많은 피해를 입힙니다.","leveltip":{"label":["재사용 대기시간","피해량","총 공격력 %"],"effect":["{{ cooldown }} -> {{ cooldownNL }}","{{ qbasedamage }} -> {{ qbasedamageNL }}","{{ qtotaladratio*100.000000 }}% -> {{ qtotaladrationl*100.000000 }}%"]},"maxrank":5,"cooldown":[14,12,10,8,6],"cooldownBurn":"14/12/10/8/6","cost":[0,0,0,0,0],"costBurn":"0","datavalues":{},"effect":[null,[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]],"effectBurn":[null,"0","0","0","0","0","0","0","0","0","0"],"vars":[],"costType":"소모값 없음","maxammo":"-1","range":[25000,25000,25000,25000,25000],"rangeBurn":"25000","image":{"full":"AatroxQ.png","sprite":"spell0.png","group":"spell","x":288,"y":48,"w":48,"h":48},"resource":"소모값 없음"},{"id":"AatroxW","name":"지옥사슬","description":"아트록스가 지면을 내리쳐 처음 맞힌 적에게 피해를 줍니다. 대상이 챔피언 또는 대형 몬스터인 경우 일정 시간 안에 해당 지역을 벗어나지 않으면 중앙으로 끌려가 다시 피해를 받습니다.","tooltip":"아트록스가 사슬을 발사하여 처음 적중한 적을 {{ wslowduration }}초 동안 {{ wslowpercentage*-100 }}%만큼 <status>둔화</status>시키고 <physicalDamage>{{ wdamage }}의 물리 피해</physicalDamage>를 입힙니다. 챔피언과 대형 정글 몬스터는 {{ wslowduration }}초 안에 해당 지역을 벗어나지 않으면 중심으로 <status>끌려가</status> 다시 같은 양의 피해를 입습니다.","leveltip":{"label":["재사용 대기시간","피해량"],"effect":["{{ cooldown }} -> {{ cooldownNL }}","{{ wbasedamage }} -> {{ wbasedamageNL }}"]},"maxrank":5,"cooldown":[20,18.5,17,15.5,14],"cooldownBurn":"20/18.5/17/15.5/14","cost":[0,0,0,0,0],"costBurn":"0","datavalues":{},"effect":[null,[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]],"effectBurn":[null,"0","0","0","0","0","0","0","0","0","0"],"vars":[],"costType":"소모값 없음","maxammo":"-1","range":[825,825,825,825,825],"rangeBurn":"825","image":{"full":"AatroxW.png","sprite":"spell0.png","group":"spell","x":336,"y":48,"w":48,"h":48},"resource":"소모값 없음"},{"id":"AatroxE","name":"파멸의 돌진","description":"기본 지속 효과로 아트록스가 적 챔피언에게 피해를 입히면 체력을 회복합니다. 사용 시, 아트록스가 지정한 방향으로 돌진합니다.","tooltip":"<spellPassive>기본 지속 효과:</spellPassive> 아트록스가 챔피언을 상대로 <lifeSteal>{{ espellvamp }}%의 모든 피해 흡혈</lifeSteal>을 얻고 <keywordMajor>세계의 종결자</keywordMajor> 사용 중에 <lifeSteal>{{ espellvampempowered }}%의 모든 피해 흡혈</lifeSteal>을 얻습니다.<br /><br /><spellActive>사용 시:</spellActive> 아트록스가 돌진합니다. 이 스킬은 다른 스킬이 진행되는 동안 사용할 수 있습니다.","leveltip":{"label":["재사용 대기시간","회복량 %","세계의 종결자 중 회복량 %"],"effect":["{{ cooldown }} -> {{ cooldownNL }}","{{ espellvamp }}% -> {{ espellvampNL }}%","{{ espellvampempowered }}% -> {{ espellvampempoweredNL }}%"]},"maxrank":5,"cooldown":[9,8,7,6,5],"cooldownBurn":"9/8/7/6/5","cost":[0,0,0,0,0],"costBurn":"0","datavalues":{},"effect":[null,[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]],"effectBurn":[null,"0","0","0","0","0","0","0","0","0","0"],"vars":[],"costType":"소모값 없음","maxammo":"1","range":[25000,25000,25000,25000,25000],"rangeBurn":"25000","image":{"full":"AatroxE.png","sprite":"spell0.png","group":"spell","x":384,"y":48,"w":48,"h":48},"resource":"소모값 없음"},{"id":"AatroxR","name":"세계의 종결자","description":"아트록스가 악마의 힘을 해방하여 근처 적 미니언에게 공포를 주고 자신의 공격력과 체력 회복량, 이동 속도가 증가합니다. 아트록스가 챔피언 처치에 관여하면 이 효과의 지속시간이 연장됩니다.","tooltip":"아트록스가 진정한 악마의 모습을 드러내 근처 미니언이 {{ rminionfearduration }}초 동안 <status>공포</status>에 떨게 하고 <speed>이동 속도가 {{ rmovementspeedbonus*100 }}%</speed> 증가했다가 {{ rduration }}초에 걸쳐 원래대로 돌아옵니다. 지속시간 동안 <scaleAD>공격력이 {{ rtotaladamp*100 }}%</scaleAD>, <healing>자신에 대한 체력 회복 효과가 {{ rhealingamp*100 }}%</healing> 증가합니다.<br /><br />챔피언 처치 관여 시 이 효과의 지속시간이 {{ rextension }}초 늘어나고 <speed>이동 속도</speed> 효과가 초기화됩니다.","leveltip":{"label":["총 공격력 증가","회복량 증가","이동 속도","재사용 대기시간"],"effect":["{{ rtotaladamp*100.000000 }}% -> {{ rtotaladampnl*100.000000 }}%","{{ rhealingamp*100.000000 }}% -> {{ rhealingampnl*100.000000 }}%","{{ rmovementspeedbonus*100.000000 }}% -> {{ rmovementspeedbonusnl*100.000000 }}%","{{ cooldown }} -> {{ cooldownNL }}"]},"maxrank":3,"cooldown":[120,100,80],"cooldownBurn":"120/100/80","cost":[0,0,0],"costBurn":"0","datavalues":{},"effect":[null,[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]],"effectBurn":[null,"0","0","0","0","0","0","0","0","0","0"],"vars":[],"costType":"소모값 없음","maxammo":"-1","range":[25000,25000,25000],"rangeBurn":"25000","image":{"full":"AatroxR.png","sprite":"spell0.png","group":"spell","x":432,"y":48,"w":48,"h":48},"resource":"소모값 없음"}],
            "passive":{"name":"사신 태세","description":"주기적으로 아트록스의 기본 공격이 대상 최대 체력에 비례하여 추가 <physicalDamage>물리 피해</physicalDamage>를 입히고 자신의 체력을 회복합니다. ",
            "image":{"full":"Aatrox_Passive.png","sprite":"passive0.png","group":"passive","x":0,"y":0,"w":48,"h":48}},
            "recommended":[]
        },
        "Ahri" : {
          //...
        },
        //...
    }

}

json 파일의 data에 해당하는 각 항목이 champion의 한 row가 되도록 champion의 column들을 정의해주어야 한다. 또한 image, skins, info, stats와 같은 dictionary 형태의 항목들은 ForeignKey를 활용해서 다른 테이블에 저장해주도록 한다. 아래의 사진을 클릭하면 자세한 ER diagram을 볼 수 있다.

해당 diagram을 django class로 작성한 것은 아래의 깃헙 링크에서 확인할 수 있다.

https://github.com/poding84/league/blob/master/model_champion/models.py

Django DB에 데이터 삽입하기

model을 완성한 뒤 django가 해당 모델을 db에 적용할 수 있도록 아래의 코드를 실행시켜주자.

$python manage.py makemigrations
$python manage.py migrate

코드를 실행한 뒤 db.sqlite3파일을 확인해보면 우리가 선언한 class들이 table로 정의되어 들어가있을 것이다. 이제 championFull.json을 python으로 파싱하여 db에 삽입하면 모든 챔피언정보를 미리 저장하고 추후의 api정보들을 다룰때 요긴하게 사용할 수 있을 것이다.

https://github.com/poding84/league/blob/master/model_champion/tools/initial_setting.py

해당 링크를 보면 putChampions() 함수를 통해 모든 chapion데이터를 db에 넣는 과정을 확인할 수 있다.

profile
SNU computer science & engineering

0개의 댓글