사용방법은 맨 밑에 있습니다.
깃허브 주소 : https://github.com/J-hoplin1/League-Of-Legend-Search-Bot/tree/master/Riot%20API%20Version
약 1년 전에 롤 전적검색 디스코드 봇을 만들었습니다.(아래링크)
https://jhoplin7259.tistory.com/92?category=927506
1년 전에 만들었던 디스코드 봇은 op.gg라는 전적사이트에서 Web Scraping(크롤링)을 사용하여 작동되는 봇이었습니다. 이 외에도 다른 봇들을 만들었었는데, 초기에는 Papago Translate Bot을 제외하고는 모두 크롤링을 이용하였습니다. 크롤링, 즉 비정형데이터를 사용하는것도 애플리케이션에 데이터를 공급하는 방법중 하나가 될 수 있지만, 크롤링은 어디까지나 한계가 있었습니다.
당연한거기도 하지만, 제가 느낀 크롤링의 한계점은 아래와 같습니다.
<크롤링의 한계점>
1. issue발생시 문제를 해결하기 어려울 수 있다.
가장 큰 문제점이 발생한것은 Rainbow Six Siege 봇이었습니다. r6stats라는 사이트에서 크롤링을 통해 가져오는 방식이었지만, r6stats의 사이트 가 웹페이지 개편을 하게되어, 유지보수 수준이 아니라 아예 다시 만들어야되는 수준이 되어버렸었습니다.(결국에는 봇 자체를 폐쇠하였습니다.) 이 외에도 웹 구조가 바뀌게 되면 이에 따라 일일히 대응을 해줘야하는 어려움이 있었습니다
2. 코드가 매우 난잡하다. 이에따른 유지보수 어려움
처음으로 유지보수를 한게 제작 후 6개월 후였습니다.(사실 신경을 못씀...) 그때 느꼈던 큰 문제점은 코드가 매우 난잡하다는 것입니다. 더군다나 주석처리를 제대로 안한탓에 결국에는 op.gg사이트를 뜯어보며 다시 코드를 해석하는수 밖에 없었습니다.
가장 크게 느낀 크롤링을 통한 봇의 문제점은 위 두가지였습니다. 그러면 반대로 API(Application Programming Interface)를 사용하면 뭐가 좋을까요?
<API를 활용하면 얻는 장점>
1. 개발 기간이 매우 단축됩니다.
실제로도 웹 크롤링을 통해 만든 버전은 버그를 수정하고, 테스트 하는데까지 완전히 하루(일어나서부터 잘때까지)였던것으로 기억합니다. 반면에 API를 사용한 버전은 새로운 명령어 하나를 추가했음에도 약 4시간 정도밖에 걸리지 않았습니다.(이 이유는 두번째 이유와 연관있습니다)
2. 직접 복잡한 코드를 작성하지 않아도 API Request에 따른 Response로 들어오는 데이터만 가지고 활용하면 됩니다.
첫번째 이유 설명 마지막에서 말했듯이 하루가 걸리던게 4시간 밖에 걸리지 않았습니다. 시간 단축의 큰 부분은 바로 데이터 추출 과정을 일일히 구현할 필요가 없었기 때문입니다. 크롤링 같은 경우에는 HTML구조 파악, X-Path(혹은 HTML 레이아웃 범위지정)지정 등으로 인해 시간이 많이 걸립니다.하지만 API를 사용하면 단지 API EndPoint에 Request를 하고 그에 돌아오는 Response를 가지고만 만들 수 있기때문입니다.
3. 유지보수가 훨씬 편해진다
두번째 이유 설명과 이어지지만 크롤링은 직접 데이터 추출과정을 구현해야됩니다. 그리고 웹사이트를 만든것은 사용자에게 데이터를 시각화 제공을 위한것이지 데이터 제공을 목적으로 하는것이 아니기 때문에, 웹 관리자가 웹 구조를 바뀌면 어쩔 수 없이 그때 그때 유지보수를 해야하는 불편함이 발생합니다. 반면에 API는 데이터를 제공하는것이 목표입니다. 그렇기에 기존 인터페이스에서 큰 변화를 주는 경우는 많지 않습니다. 그만큼 유지보수를 해야하는 횟수도 많이 줄어들고, 만약 API Version이 변경되면 그에따른 대응만 해주면 되는것입니다.
<Riot API분석하기>
본격적으로 들어가기 앞서서 Riot API분석을 해봅시다. 우선 Riot API에는 Data Dragon이라는것이 있고, API가 존재합니다.
Riot API에서는 Data Dragon에 대해서 이렇게 명시하고 있습니다.
https://developer.riotgames.com/docs/lol
Data Dragon은 챔피언, 아이템, 룬, 소환사 주문, 프로필 아이콘 등 리그 오브 레전드 게임 데이터와 자산을 중앙 집중화하는 방법입니다. 이 모든 것을 Third Party Application 개발자가 사용할 수 있습니다. 각 패치에 대해 압축된 tarball(.tgz)을 다운로드할 수 있으며, 해당 패치에 대한 모든 자산이 포함됩니다. 각 리그 오브 레전드 패치 이후에 Data Dragon을 업데이트하는 작업은 수동 프로세스이므로 패치 후 즉시 업데이트되는 것이 아닙니다.
Data Dragon은 보다싶이 많은 데이터를 제공하는 데이터 셋입니다. 하지만 여기서 제공하는 모든것을 사용할 필요는 없습니다. 우선 저는 이번 작업에서 두가지를 원합니다
1. 개인 전적 : 티어 문양, 계정의 Solo Rank, Flex Rank전적, Most챔피언
2. Most Used Champion : Most챔피언 사진, Most챔피언 숙련도
여기서 사용되는 것들만 가져오면 되는것입니다.
(API Token과정은 생략하겠습니다)
<티어 문양>
우선 티어 문양은 아래와 같이 이미지 파일로 제공을 합니다.
여기에 있는 zip파일을 다운로드해서 사용하면 됩니다.
<챔피언 관련 정보>
챔피언 관련 데이터는 위와 같이 두개가 있습니다. 위쪽 JSON은 각 챔피언에 대한 정보가 담겨있는거고 아래쪽 JSON은 각 챔피언의 레벨/스킬레벨에 따른 스탯 변화를 정리해놓은 것입니다. 당연히 여기서 저는 위쪽 정보가 필요합니다.
위쪽 JSON링크를 보면 알겠지만 이와같이 난해한 JSON이 있는것을 볼 수 있습니다. 그리고 잘 보면 절대 사용할 일 없을것같은 불필요데이터도 있습니다. 저는 이 JSON을 prettify한 다음 분석하였고, 전처리 코드를 작성하여 제가 필요하게끔 전처리 했습니다.
전처리 코드는 아래와 같습니다.
제가 전처리한 결과를 보면 Key값이 모두 숫자로 되어있는것을 볼 수 있는데, 이유는 API에서 챔피언을 이름으로 제공하지 않고, 숫자코드로 제공하기 때문에, 이와같이 전처리 하였습니다.
자 이제 챔피언의 프로필 사진을 가져와야합니다.
챔피언 프로필은 위와 같이 "http://ddragon.leagueoflegends.com/cdn/11.13.1/img/champion/" 뒤에 (챔피언이름).png를 붙여주면 됩니다. 챔피언 이름.png같은 경우에는 위쪽 JSON에서 제공을 하고, 저 또한 그에 맞게 전처리를 해주었습니다.
<API 분석하기>
이제 기본적으로 필요한 정보들을 얻고, 전처리를 완료했습니다. 다음 단계는 API를 분석하는 것입니다. 우선 알아야할 것은 라이엇 API에는 각 서버별로 Routing Value를 제공합니다.
우리는 한국 서버에 대한 Routing Value를 사용하면 되기 때문에 https://kr.api.riotgames.com 를 End Point로 사용해주면 됩니다. 그리고 이 URL과 다른 각기다른 기능을 가진 API의 End Point를 조합하여 API Request를 하면 되는것입니다.
API를 보면 이와같이 목록들이 있는것을 알 수 있습니다. API를 분석하면서 알 수 있는것은 가장 중요한 Key값들이 있습니다.
1. puuid 값
2. encrypted id value
이 두가지를 활용해서 API Request문을 만들어야 합니다.
우선 이 puuid, encrypted id를 얻기위해서는 'SUMMONER V4' 의 /lol/summoner/v4/summoners/by-name/{summonerName} 를 활용하면 됩니다. 이는 소환사의 닉네임에 따라 puuid, encrypted id를 제공합니다.
그 다음 개인 전적을 얻기 위해서는 'LEAGUE V4'의 /lol/league/v4/entries/by-summoner/{encryptedSummonerId}를 사용해주면 됩니다. 이 API는 encrypted id를 활용하여 소환사의 기본적인 전적을 검색할 수 있습니다. 만약 솔로랭크, 자유랭크가 없으면 반환하는것이 없고, 둘중 하나가 없는경우에는 없는것은 데이터에 표시되지 않습니다. 아래 예시에서도 Faker선수는 자유랭크 기록이 없기때문에 Solo Rank기록만 나오는 것입니다. 여기서도 모든 데이터가 필요한것은 아니기 때문에 제가 사용하는 데이터만 추출하여 전처리해줍니다.
그 다음 Most 챔피언 관련 데이터입니다. Most챔피언 데이터를 얻기 위해서는 'CHAMPION-MASTERY-V4'의 /lol/champion-mastery/v4/champion-masteries/by-summoner/{encryptedSummonerId} 를 사용하면 됩니다. 이는 encrypted id를 통해서 소환사가 플레이한 모든 챔피언에대한 숙련도와, 챔피언 포인트를 반환합니다.
챔피언 마스테리 관련해서는 두가지 메소드를 만들었습니다. getPersonalChampionMastery()는 !롤전적 명령어에 사용되는 Most챔피언 하나추출을 위한것이고, getPersonalChampionMasteries()는 !롤모스트 명령어에 사용되는 Most 3 챔피언 추출을 위한 것입니다.
Riot API를 사용하여 재구현한 봇은 아래와 같이 작동합니다.
사용방법은 다음과 같습니다.
Riot API Version은 다음과 같은 디렉토리 구조를 가지고 있습니다. 여기서 README.md를 제외하고는 모두 필요한 파일입니다.
사용방법은 config.yml파일에서 discordAPIToken과 riotAPIToken을 넣어준 다음 lolSearcbotAPIVersion.py를 실행시켜주면 됩니다.
'Discord Bot' 카테고리의 다른 글
디스코드 웹훅 봇 : 날씨/대기 정보 웹훅(webhook) 봇(feat. Slack 웹훅) (0) | 2022.08.06 |
---|---|
디스코드 봇(Discord Bot) : 전략적 팀 전투(TFT, Team Fight Tactics) 디스코드 전적검색 봇 (0) | 2020.04.26 |
디스코드봇(Discord Bot) : 레인보우 식스 시즈(Rainbow Six Siege, R6) 전적검색 봇 (5) | 2020.04.08 |
디스코드봇(Discord Bot) : 코로나바이러스 한국상황 정보봇(Covid-19 Korea Status Bot) (3) | 2020.04.08 |
디스코드봇(Discord Bot) : 파파고 번역봇(Papago Translation Bot) (41) | 2020.04.08 |