안녕하세요! 크로네입니다.
오늘은 Hypixel(마인크래프트서버) 를 플레이하는 유저의 정보(스텟)을 가져와보겠습니다.
1. 어떻게요?
우린 Hypixel 에서 제공하는 Hypixel API 라는 것을 이용해볼겁니다.
이걸 이용하면, 우리가 원하는 정보(스텟) 을 얻을 수 있습니다.
2. 실습 - 1
일단, Hypixel API 를 이용하려면, 웹사이트(등) 에 접속하는 모듈이 필요합니다.
그 모듈이 바로 axios 입니다.
일단, 다음의 코드를 이용해 axios 를 다운로드합니다.
npm i axios
그 다음 NodeJS 파일을 만들어주고, 다음과 같은 코드를 이용해 axios 를 requrie 합니다.
const axios = require("axios");
"아니... axios 뭐.. 그런건 알겠는데.. 사용법을 모르잖아요..?"
맞습니다. 그래서 Hypixel 에서는 사용법을 정리한 웹사이트를 만들었습니다.
저도 이 웹사이트에서 공부하기도 했으니, 여러분들도 잘 이해하실 수 있을겁니다.
일단 저도 설명을 드리겠지만, 혹시 추가적으로 전문적으로 보고 싶으신 부분이 있다면,
아래의 웹사이트에 접속해서 쭉 읽어보시면 될 것 같습니다.
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 에는 시간이라면서 이상한 숫자만 보여요..."
아! 그건요.....
다음시간에..!
"ㅎ..."
댓글