Project/LOATODO

[LOATODO] 로스트아크 오픈 API - 내 캐릭터 정보 불러오기

마볼링 2023. 5. 13. 10:29

1. 서론

본격적인 로아 숙제 관리 사이트 개발전 연습

2. 개발

2 - 1. 대표 캐릭터 이름을 입력하여 관련된 전체 캐릭터 불러오기

public JSONArray Characters(String characterName) {
    try {
        characterName = URLEncoder.encode(characterName, "UTF-8");
        URL url = new URL("https://developer-lostark.game.onstove.com/characters/"+characterName+"/siblings");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestMethod("GET");
        httpURLConnection.setRequestProperty("authorization", "Bearer "+ LostarkApiKey);
        httpURLConnection.setRequestProperty("accept","application/json");
        httpURLConnection.setRequestProperty("content-Type","application/json");
        httpURLConnection.setDoOutput(true);

        int result = httpURLConnection.getResponseCode();
        InputStream inputStream;
        if(result == 200) {
            inputStream = httpURLConnection.getInputStream();
        } else {
            inputStream = httpURLConnection.getErrorStream();
        }
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

        JSONParser parser = new JSONParser();
        JSONArray array = (JSONArray) parser.parse(inputStreamReader);
        return array;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
  • characterName을 변수로 받아서 관련된 캐릭터들의 정보를 JSONArray로 받는다
  • 받아오는 데이터 : 캐릭터 이름, 클래스, 아이템 레벨 등
  • REST API를 연결하는 부분은 여러군대서 쓰여서 통합된 코드로 만드는게 나을 거 같은데... 시간이 없어서 일단 복붙중...

 

2 - 2. 추가로 캐릭터 이미지 불러오기

[Controller]

@GetMapping("/lostark/character")
public String character(Model model) {
    String mainCharacter = "마볼링";
    JSONArray character = characterApiService.Characters(mainCharacter);
    String mainServer = "루페온";
    ArrayList characters = new ArrayList();
    for (Object object : character) {
        JSONObject jsonObject = (JSONObject) object;
        if (jsonObject.get("ServerName").equals(mainServer)) {
            JSONObject characterName = characterApiService.characterProfiles((String) jsonObject.get("CharacterName"));
            LostarkCharacterProfileDto dto = new LostarkCharacterProfileDto();
            dto.setCharacterName((String) jsonObject.get("CharacterName"));
            dto.setCharacterImage((String) characterName.get("CharacterImage"));
            dto.setCharacterClassName((String) characterName.get("CharacterClassName"));
            dto.setItemMaxLevel(characterName.get("ItemMaxLevel"));
            dto = setContent(dto);
            characters.add(dto);
        }
    }

    // dto안에 ItemMaxLevel순으로 정렬
    Comparator<LostarkCharacterProfileDto> itemMaxLevelComparator = Comparator.comparingDouble(dto -> dto.getItemMaxLevel());
    characters.sort(itemMaxLevelComparator.reversed());
    model.addAttribute("characters", characters);
    model.addAttribute("mainCharacter", mainCharacter);
    return "lostark/lostarkCharacter";
}

 

[Service]

public JSONObject characterProfiles(String characterName) {
    try {
        characterName = URLEncoder.encode(characterName, "UTF-8");
        URL url = new URL("https://developer-lostark.game.onstove.com/armories/characters/"+characterName+"/profiles");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
        httpURLConnection.setRequestMethod("GET");
        httpURLConnection.setRequestProperty("authorization", "Bearer "+ LostarkApiKey);
        httpURLConnection.setRequestProperty("accept","application/json");
        httpURLConnection.setRequestProperty("content-Type","application/json");
        httpURLConnection.setDoOutput(true);

        int result = httpURLConnection.getResponseCode();
        InputStream inputStream;
        if(result == 200) {
            inputStream = httpURLConnection.getInputStream();
        } else {
            inputStream = httpURLConnection.getErrorStream();
        }
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

        JSONParser parser = new JSONParser();
        JSONObject object = (JSONObject) parser.parse(inputStreamReader);
        return object;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
  • armories/characters/{characterName}/profiles에서 캐릭터의 자세한 정보와 이미지 url을 얻을 수 있다.
  • 얻어온 데이터들에서 필요한 정보만 dto에 담는다. (캐릭터 이름, 클래스, 이미지, 아이템 레벨)

 

2 - 3. 레벨별 일일 컨텐츠 이름

private LostarkCharacterProfileDto setContent(LostarkCharacterProfileDto dto) {
    double level = dto.getItemMaxLevel();
    if (level < 1415) {
        dto.setChaosName("X");
        dto.setGuardianName("X");
    } else if (level >= 1415 && level < 1445) {
        dto.setChaosName("타락 1");
        dto.setGuardianName("데스칼루다");
    } else if (level >= 1445 && level < 1460) {
        dto.setChaosName("타락 2");
        dto.setGuardianName("데스칼루다");
    } else if (level >= 1460 && level < 1475) {
        dto.setChaosName("타락 2");
        dto.setGuardianName("쿤겔라니움");
    } else if (level >= 1475 && level < 1490) {
        dto.setChaosName("타락 3");
        dto.setGuardianName("쿤겔라니움");
    } else if (level >= 1490 && level < 1520) {
        dto.setChaosName("공허 1");
        dto.setGuardianName("칼엘리고스");
    } else if (level >= 1520 && level < 1540) {
        dto.setChaosName("공허 2");
        dto.setGuardianName("칼엘리고스");
    } else if (level >= 1540 && level < 1560) {
        dto.setChaosName("절망 1");
        dto.setGuardianName("하누마탄");
    } else if (level >= 1560 && level < 1580) {
        dto.setChaosName("절망 2");
        dto.setGuardianName("하누마탄");
    } else if (level >= 1580 && level < 1600) {
        dto.setChaosName("천공 1");
        dto.setGuardianName("소나벨");
    } else if (level >= 1600 && level < 1610) {
        dto.setChaosName("천공 2");
        dto.setGuardianName("소나벨");
    } else if (level >= 1610) {
        dto.setChaosName("계몽 1");
        dto.setGuardianName("가르가디스");
    }
    return dto;
}
  • 캐릭터의 아이템 레벨에 맞는 일일 컨텐츠(카오스 던전, 가디언 토벌) 이름을 dto에 저장한다
  • 마음에 안드는 코드여서 리팩토링 생각중...

 

2 - 4. 결과

 

Spring + JSP 사이트에 출력

 

3. 정리 및 후기

개발 계획 확립

  • 로그인/회원가입 + API Key 입력 => 다른 사람도 쓸 수 있게
  • api로 바로 불러오는 것이 아닌 따로 DB에 저장해서 불러오기 => 점검시간에도 사용할 수 있게
  • 휴식게이지 설정과 사용
  • 기존에 만들어둔 일일컨텐츠 수익과 연동하여 숙제 추천