본문 바로가기
코딩/Node.js

[NodeJS] Hypixel API 를 이용해 유저의 정보 가져오기!

by KRonae 2022. 12. 16.
반응형

안녕하세요! 크로네입니다.

오늘은 Hypixel(마인크래프트서버) 를 플레이하는 유저의 정보(스텟)을 가져와보겠습니다.

 

1. 어떻게요?

우린 Hypixel 에서 제공하는 Hypixel API 라는 것을 이용해볼겁니다.

이걸 이용하면, 우리가 원하는 정보(스텟) 을 얻을 수 있습니다.

 

2. 실습 - 1

일단, Hypixel API 를 이용하려면, 웹사이트(등) 에 접속하는 모듈이 필요합니다.

그 모듈이 바로 axios 입니다.

일단, 다음의 코드를 이용해 axios 를 다운로드합니다.

npm i axios

그 다음 NodeJS 파일을 만들어주고, 다음과 같은 코드를 이용해 axios 를 requrie 합니다.

const axios = require("axios");

 

"아니... axios 뭐.. 그런건 알겠는데.. 사용법을 모르잖아요..?"

맞습니다. 그래서 Hypixel 에서는 사용법을 정리한 웹사이트를 만들었습니다.

저도 이 웹사이트에서 공부하기도 했으니, 여러분들도 잘 이해하실 수 있을겁니다.

일단 저도 설명을 드리겠지만, 혹시 추가적으로 전문적으로 보고 싶으신 부분이 있다면,

아래의 웹사이트에 접속해서 쭉 읽어보시면 될 것 같습니다.

https://api.hypixel.net/

3. 실습 - 2

일단, Hypixel API 를 사용하려면 API Key 가 필요합니다.

Hypixel에 접속해서 /api new 를 적어줍니다.

그러면  어떤 이상한 글자가 나옵니다.

하늘색 글자를 클릭해봅시다.

이제 Ctrl+A 를 누른 뒤에 Ctrl+C 로 모두 복사합니다.

그 다음 다시 파일에 가서 다음과 같은 코드를 적어줍니다.

const key = "(복사한 키)";

var response = await axios({
    "url": `https://api.hypixel.net/key?key=${key}`,
    "method": "GET",
}).data;

console.log(response);

(key 에는 복사했던 키를 적어줍니다.)

이 코드는 https://api.hypixel.net/key?key=(키) 로 요청을 보내서

응답을 response 에 저장한 후, 출력하는 코드 입니다.

 

"그런데... /key?key=(키) 라는 주소는 어떨때 쓰는건가요?"

이 키가 사용할 수 있는 키인지 확인할 때 사용합니다.

 

그럼 바로 실행시켜 볼까요?

"흠... 오류가 났어요.."

맞습니다. async 함수가 아니면, await 을 사용할 수 없습니다.

"그럼 어떻하죠...?"

Promise.prototype.then() 함수를 사용하면 됩니다. 전체 코드를 다음과 같이 바꿔보세요.

const axios = require("axios");
const key = "fbd9a554-87d9-4055-b555-427af303f372";

axios({ // key 로 GET 요청
    "url": `https://api.hypixel.net/key?key=${key}`,
    "method": "GET",
    "headers": {
        "Accept-Encoding": "utf-8"
    }
}).then(async function(res) {
    if(res.data.success) { // 사용가능한 키인지 확인
        if(res.data.record.limit <= res.data.record.queriesInPastMin) { // record.queriesInPastMin(마지막 1분동안 사용한 량) 이 record.limit(1분 최대 사용량) 보다 크면 오류
            console.error("키 사용 한도에 달했습니다! 1분안에 다시 사용할 수 있으니, 기다려주세요! (또는 다른 키를 사용해도 됩니다)");
            return;
        }
        console.log(res.data);
    } else {
        console.error("잘못된 키입니다!");
    }
});

그 다음 실행해 보면....

"응? 어.... 이게 뭐죠..? 이상한 글자만 나왔어요...."

이건 인코딩 때문에 생긴 문제인데요.

제가 이거 해결방법 찾으려고 검색도 하고 진짜 힘들었습니다.

 

어쨌든 이건 Accept-Encoding 이라는 헤더를 수정하면 되는데요,

여기에서 헤더는 요청하거나 응답할때 보낸 데이터등에 대한 정보같은 것입니다.

 

"아니 긴말 필요 없고 그래서 뭘 하면 되는데요"

아... axios 함수에서 headers 에 Accept-Encoding 이라는 것을 만들고

값에 utf-8이라고 적어주면 됩니다.

"headers": {
    "Accept-Encoding": "utf-8"
}

그럼 이제 다시한번 실행해 볼까요?

와우! 키에 대한 정보가 잘 나오는군요!

만약 success 가 false 라면, 사용할 수 없는 키라는 뜻입니다.

 

그럼, 한발 더 나아가 유저의 정보도 가져와 볼까요?

일단, 유저의 정보는 거의 다 https://api.hypixel.net/player?key=(키)&uuid=(uuid) 에서 가져올 수 있습니다.

"잠깐! uuid라고요..? 그게 뭔데요?"

UUID 란, 마인크래프트에서 유저를 구분하는 id 를 의미합니다.

 

일단, 마인크래프트 API 는 아직 사용해보지 않았기에,

https://mcuuid.net/ 이라는 웹사이트에서 닉네임을 적어서 사용하시길 바랍니다.

닉네임을 적고 검색하면...

이렇게 나옵니다. 참고로 검색하실때에는 꼭 소문자로 검색하셔야 합니다.

저는 일단 Full UUID 를 복사하겠습니다.

 

그리고 then 함수에 있는 async 함수를 다음과 같이 바꿉니다.

....생략....
.then(async function(res) { // 응답을 res 에 저장
    if(res.data.success) { // 사용가능한 키인지 확인
        if(res.data.record.limit <= res.data.record.queriesInPastMin) { // record.queriesInPastMin(마지막 1분동안 사용한 량) 이 record.limit(1분 최대 사용량) 보다 크면 오류
            console.error("키 사용 한도에 달했습니다! 1분안에 다시 사용할 수 있으니, 기다려주세요! (또는 다른 키를 사용해도 됩니다)");
            return;
        }
        var uuid = "54dc6896-4677-4488-a3f7-3c1e90f14325";
        var res2 = await axios({ // player 로 GET 요청후 응답을 res2 에 저장
            "url": `https://api.hypixel.net/player?key=${key}&uuid=${uuid}`,
            "method": "GET",
            "headers": {
                "Accept-Encoding": "utf-8"
            }
        });
        console.log(res2.data);
        console.error(res.data);
    } else {
        console.error("잘못된 키입니다!");
    }
});

그러면 다음과 같은 결과를 확인할 수 있습니다.

정말 길죠? 위에 더 많습니다.

일단 맨 위에는 success 가 있습니다.

그리고 uuid 와 displayName, firstLogin, lastLogin 등등도 있습니다.

내리다 보면

stats에 게임 스텟과

achievements 와 achievementsPoints같이 도전과제 같은것들도 있습니다.

또, lastLogout 에 마지막으로 로그아웃한 시간과,

karma에 카르마,

userLanguage에 사용중인 언어, (어느나라 사람인지 추측 가능!)

아래에는 parkourCheckpointBests 에 파쿠르 체크포인트중에 가장 빠른것들,

그리고 parkourCompletions 에 파쿠르 성공기록들,

channel 에 채팅채널, (오프라인이면 마지막 채널!)

friendRequestsUuid 에는 받은 친구추가 목록,

lastClaimedReward 에는 마지막으로 받은 reward,

newPackageRank 에는 대우받는 랭크(유튜버랭크는 이곳에 표시되지 않음)

petStats 에 펫 상태,

currentGadget 에 현재 가젯,

socialMedia 에 소셜미디어 정보,

currentClickEffect 에 현재 클릭이펙트,

mostRecentGameType 에 마지막으로 플레이한 게임 타입등

 

와..... 뭐가 이렇게 많은지... 정말 알 수 있는 정보가 많습니다.

 

"어... 그런데.. firstLogin 이랑, lastLogin, lastLogout 에는 시간이라면서 이상한 숫자만 보여요..."

아! 그건요.....

 

다음시간에..!

"ㅎ..."

반응형

댓글