API에 대해 공부하려고 적당한 API를 찾던 중 슈퍼셀 (supercell) 사의 모바일 게임 브롤스타즈 (brawl stars)의 공식 API를 발견해서 한 번 사용해보았다.
Brawl Stars Developer 개발자 등록
https://developer.brawlstars.com/#/ 여기에 들어가서 회원가입하고 API 키를 발급 받자. IP 주소는 인터넷에서 검색하면 자신의 IP 주소가 나올 거다. 그걸 넣으면 된다. 이렇게 하면 토큰 값이 나오게 되는데 이게 키값이다.
Brawl Stars API 사용해보기
일단 제대로 잘 되는지 테스트를 해봐야할 것이다. 상단에 Documentation에 들어가면 해당 API를 사용하는 방법이 나오는데, 이 중에 brawlers 에 대한 정보를 GET 해보자.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.Buffer; public class BrawlStarsAPI { static String MyKey = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiIsImtpZCI6IjI4YTMxOGY3LTAwMDAtYTFlYi03ZmExLTJjNzQzM2M2Y2NhNSJ9.eyJpc3MiOiJzdXBlcmNlbGwiLCJhdWQiOiJzdXBlcmNlbGw6Z2FtZWFwaSIsImp0aSI6IjA0MTU5NWY0LWYyODQtNGY5Yi1iZjhjLTg4ZTIzZmY2NWIyMyIsImlhdCI6MTU4NjUxNjMwNiwic3ViIjoiZGV2ZWxvcGVyL2U2OTYzYTM0LTJhYjktZjI1Ny0yYWVlLTZhMTc2NmE5NTJiMSIsInNjb3BlcyI6WyJicmF3bHN0YXJzIl0sImxpbWl0cyI6W3sidGllciI6ImRldmVsb3Blci9zaWx2ZXIiLCJ0eXBlIjoidGhyb3R0bGluZyJ9LHsiY2lkcnMiOlsiMjIyLjIzNy4zMy4yMzUiXSwidHlwZSI6ImNsaWVudCJ9XX0.ROrJG935BnvHUKaP6JuDfs9G5do0eUMyZ6D2ecsK03zZOyPCgDnf_2dPXvBGy7NJMlMX9g0eFxY8_4rhdvLWZQ"; static String brawlurl = "https://api.brawlstars.com/v1/brawlers"; public static void main(String[] args) { try{ String accessToken = MyKey; URL url = new URL(brawlurl); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Authorization", "Bearer " + accessToken); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); String line; while((line = in.readLine()) != null){ System.out.println(line); } } catch(Exception e){ e.printStackTrace(); } } }
MyKey는 키를 발급 받고 난 후 받은 토큰값이며, brawlurl은 해당 정보를 가져오기 위한 Request URL이다. try 문에서 Url을 위의 brawlurl로 설정해준다. 자바에서 Http의 데이터를 송, 수신 하기 위해 java.net.HttpURLConnection의 HttpURLConnection 클래스를 사용한다. 가져오고자 하는 url을 HttpURLConnection으로 변환해주고 setRequestMethod로 GET, POST, PUT 등 접근 방식을 선언해주자. brawl stars api는 Bearer Authorization 방식으로 인증하므로 setRequestProperty로 해당 인증 방식에 발급 받은 토큰 값을 넣어 전송해주자.
이제 connection의 데이터를 InputStream 형식으로 전달 받아서 BufferedReader로 가져오자. 가져온 데이터는 while문으로 처음부터 끝까지 출력해준다. 해당 데이터를 정상적으로 전달 받았을 경우 아래와 같은 결과가 출력된다.
정상적으로 출력되는가? 따로 정렬하는 알고리즘은 없이 정상적으로 접근하는지 확인하기 위해서 만든 것이기 때문에 보기가 좀 불편하다. 혹시 위와 같이 출력되지 않는다면 아마 콘솔창에 403 같은 에러 메세지가 있을 것이다. 사이트의 Documentation에 해당 오류에 대한 내용이 있으므로 자신이 해당하는 오류를 찾아 왜 발생했는지 보면 되겠다.
Brawl Stars API 활용
이런 게임 API는 보통 전적 검색 사이트 등을 만드는 데 이용된다. 자신의 아이디나 계정 태그를 적으면 해당 유저에 대한 정보를 보여주는 게 전적 검색 사이트인데, 그러기 위해 저 지저분한 데이터를 적절히 파싱해서 보여주고자 하는 데이터를 출력해줘야한다. 근데 출력 결과만 봐도 알 수 있듯이, 파싱하는 것 자체가 일이다. 예를 들어 본인 계정에 대한 정보를 출력해보았는데 한번 확인해보자.
대충 3번째 줄의 "brawlers" 부터 본인 계정의 브롤러, 즉 각 게임 캐릭터에 대한 정보이다. 게임을 해 본 사람은 알겠지만, 캐릭터 별로 점수나 등급이 다르다. 즉 저 id:16000000 부터 마지막의 id:16000032를 적절히 파싱해줘야하는 것이다.
일단 파싱하는 건 뒤로 미뤄두고, 태그를 입력했을 때 위의 데이터를 출력하는 간단한 프로그램을 만들어보자. 이것이 전적 검색 사이트의 기초 및 뼈대가 될 것이다.
import java.util.Scanner; public class testMain{ static String MyKey = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiIsImtpZCI6IjI4YTMxOGY3LTAwMDAtYTFlYi03ZmExLTJjNzQzM2M2Y2NhNSJ9.eyJpc3MiOiJzdXBlcmNlbGwiLCJhdWQiOiJzdXBlcmNlbGw6Z2FtZWFwaSIsImp0aSI6IjA0MTU5NWY0LWYyODQtNGY5Yi1iZjhjLTg4ZTIzZmY2NWIyMyIsImlhdCI6MTU4NjUxNjMwNiwic3ViIjoiZGV2ZWxvcGVyL2U2OTYzYTM0LTJhYjktZjI1Ny0yYWVlLTZhMTc2NmE5NTJiMSIsInNjb3BlcyI6WyJicmF3bHN0YXJzIl0sImxpbWl0cyI6W3sidGllciI6ImRldmVsb3Blci9zaWx2ZXIiLCJ0eXBlIjoidGhyb3R0bGluZyJ9LHsiY2lkcnMiOlsiMjIyLjIzNy4zMy4yMzUiXSwidHlwZSI6ImNsaWVudCJ9XX0.ROrJG935BnvHUKaP6JuDfs9G5do0eUMyZ6D2ecsK03zZOyPCgDnf_2dPXvBGy7NJMlMX9g0eFxY8_4rhdvLWZQ"; static String playerInfoURL = "https://api.brawlstars.com/v1/players/"; public static void main(String[] args) { System.out.println("당신의 태그를 입력해주세요.(단, #은 제외하고 입력해주세요)"); System.out.print("#"); Scanner scanner = new Scanner(System.in); String playerTag = scanner.nextLine(); BrawlStarsAPI brawlStarsAPI = new BrawlStarsAPI(); brawlStarsAPI.ShowPlayerInformation(MyKey, playerInfoURL + "%23" + playerTag); } }
맨 위에서 테스트용으로 만들었던 코드를 조금 수정해서 ShowPlayerInformation이라는 메서드로 만들고, 토큰 값과 api url을 매개변수로 보내서 출력하는 방식이다. 여기서 playerInfoURL이 players/ 까지인데, 뒤에 부분은 계정 태그가 들어가게 된다. 즉 원래대로라면 #LUPJ08LU 같은 태그가 들어가야 되는데 출력 란을 보면 #을 제외하고 입력하라고 되어있으며 매개변수로 들어가는 String은 '#' 대신 '%23'이 들어간다. 이유는 아래 링크에서 확인할 수 있다.
https://www.reddit.com/r/Brawlstars/comments/dgsiz9/brawlstars_api_players_info/
즉 웹에서 %23이 #으로 대체되어 인코딩 된다는 말이므로 playerInfoURL은 https://api.brawlstars.com/v1/players/%23LUPJ08LU와 같은 식으로 나타나야 한다는 것이다. 실제로 #으로 쓰면 FileNotFoundException이 발생하게 되며 %23으로 했을 경우 정상적으로 출력하는 것을 볼 수 있다. 별로 중요한 건 아니지만 해당 코드를 실행해보면 아래와 같은 결과를 얻을 수 있다.
이제 얻은 데이터를 보기 좋게 다듬어야 되는데, 얻은 데이터를 String에 담아 적절하게 다듬어주면 되는데 그러기 위해서 String을 파싱하는 클래스를 또 만들어야 되고 복잡해진다.. 우리는 API를 사용하는 방법을 알고 싶었던 것이지, String을 파싱하는 것을 공부하려는 것이 아니다.
다행히도 얻어온 데이터는 JSON 방식으로 다양한 파싱 라이브러리가 존재한다. 그 중 보편적으로 사용되는 json-simple을 사용해보자. jar 파일은 여기서 다운로드 할 수 있다.
https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple/1.1.1
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.nio.Buffer; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; public class BrawlStarsAPI { public void ShowPlayerInformation(String accessToken, String urls){ try{ URL url = new URL(urls); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Authorization", "Bearer " + accessToken); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); String line, data = ""; while((line = in.readLine()) != null){ data = data.concat(line); //System.out.println(line); } JSONParser jsonParser = new JSONParser(); JSONObject jsonObject = (JSONObject)jsonParser.parse(data); JSONArray myBrawler = (JSONArray) jsonObject.get("brawlers"); System.out.println("-------------------------" + jsonObject.get("name") + "-------------------------"); System.out.println("현재 트로피 : " + jsonObject.get("trophies") + " " + "최대 트로피 : " + jsonObject.get("highestTrophies")); System.out.println("3 vs 3 : " + jsonObject.get("3vs3Victories" + " " + "솔로 : " + jsonObject.get("soloVictories") + " " + "듀오 : " + jsonObject.get("duoVictories"))); System.out.println("-------------------------내 브롤러 정보-------------------------"); for(int i = 0; i < myBrawler.size(); i++){ JSONObject object = (JSONObject)myBrawler.get(i); System.out.println("-----" + object.get("name") + "-----"); System.out.println("파워 레벨 : " + object.get("power") + " " + "랭크 : " + object.get("power")); System.out.println("현재 트로피 : " + object.get("trophies") + " " + "최대 트로피 : " + object.get("highestTrophies")); System.out.println("----------\n\n"); } } catch(Exception e){ e.printStackTrace(); } } }
코드를 간략히 설명하자면, BufferedReader로 가져온 데이터를 data 라는 String에 전부 묶어주고, JSONParser를 이용해 data 스트링을 파싱해서 JSONObject로 만들어준다. 이 때 해당 JSON에 배열 형태가 존재하면 그 배열에 대한 JSONArray를 선언해준다. 물론 어떤 데이터를 사용할지는 본인 마음이기 때문에 자신이 쓰려고자 하는 데이터에 따라 코드는 달라질 수 있다.
이제 해당 데이터에 대해 특정 key에 대한 value를 가져와 출력함으로써 자신이 원하는 형태의 출력 결과를 나타낼 수 있다. 참고로 JSONArray 같은 경우는 해당 Array에 대한 JSONObject를 선언해줌으로써 (코드에서 object로 선언) 배열에 들어 있는 데이터를 사용할 수 있다.
마치며..
물론 다른 전적 검색 사이트를 구경해보면 이렇게 간단한 형태는 아니지만 기본적으로 위의 형태가 다른 사이트의 뼈대가 된다고 생각한다. 참고로 이미 브롤스타즈에 대한 전적 검색 사이트가 존재한다. 링크 : https://brawlstats.com/
혹시 전적 검색 사이트를 만들고 싶다면 해당 사이트를 구경하면서 어떤 형태로 만들어야할지, 어떤 기능이 필요하고 어떤 정보를 보여줘야 하는지 참고하면서 만들어보면 좋겠다. 저 brawlstats가 오픈소스였을텐데, 찾아서 코드를 사용해도 될 것 같다. 혹시 여기서 보여준 코드가 필요하다면 보잘 것 없지만
https://github.com/betterafter/BrawlKat_test 여기에서 참고하면 되겠다.
오
답글삭제