한줄요약:

API에 문제 없음



7cf3c028e2f206a26d81f6e24e817c65


넥슨은 이렇게 메이플스토리 API를 제공하고 있는데 이걸로 캐릭터의 변경사항을 확인할수 있고 이걸 주간 인구수 통계에 활용함


근데 메지지에서 접속조차 안한 캐릭터가 1일전 접속으로 뜬다고 하는 경우가 있어서 API를 전부 호출해서 변경된 사항이 있나 코딩으로 알아보기로 함


방법은 간단함, X일과 X+n일(28일과 29일) 사이에 API를 호출해서 두 데이터간 변경사항이 있는지 확인 해보면 됨


나는 28일 데이터 결과를 저장하고 29일 데이터와 비교한 후, 다른게 있다면 콘솔에 다름이 뜨게 코딩했음. 결과는?


7ff3c028e2f206a26d81f6e645827c6e


다른게 없었음


리부트갤러리에 미접속인데 접속됐다고 올라온 닉네임들 5개를 검색해봤는데 단 하나도 다르다고 안뜸 (최근 접속일에 맞게 날은 다 변경 함)


기간이 문젠가 해서 간격을 더 늘리기도, 좁히기도 해 봤는데 그래도 API상 데이터가 서로 틀린게 안나옴


그럼 왜 메이플지지는 접속 안했는데 접속했다고 뜨냐? 이건 추측인데


메이플지지는 공식API가 제공되기 전부터 운영됐던 사이트기 때문에 최근 접속에 공식 API이외의 데이터를 활용하는데 여기서 찐빠가 났다 같은 경우를 생각해 볼수 있음


이전 데이터도 싹 변경한거 아니냐? 할수 있는데 이건 있을수 없는 일임 그랬으면



7ef3c028e2f206a26d81f6e44788766b


이런 내부 데이터가 수정됐다는 건데 메이플지지에 접속일자만 다를게 아니라 랭킹정보, 이외 다른 데이터들 그리고 메이플 랭킹 사이트에서도 변화가 일어났어야함



아래는 내가 사용한 C# 코드 전문임 자신의 API키/캐릭터 이름을 넣고 실행하면 아무 캐릭이나 자유롭게 테스트 가능함


밑에 수정 주석 달린걸 수정하면 기준일도 변경 가능함



const string baseUrl = "https://open.api.nexon.com/maplestory/v1/"; var client = new HttpClient(); client.DefaultRequestHeaders.Add("X-Nxopen-Api-Key", "YOUR_API_KEY"); var characterName = "CHARACTER_NAME"; var url = $"{baseUrl}id?character_name={Uri.EscapeDataString(characterName)}"; var response = await client.GetAsync(url); var ocid = JsonDocument.Parse(await response.Content.ReadAsStringAsync()).RootElement.GetProperty("ocid").GetString(); var endpoints = new List<string> { $"{baseUrl}character/basic", $"{baseUrl}character/popularity", $"{baseUrl}character/stat", $"{baseUrl}character/hyper-stat", $"{baseUrl}character/propensity", $"{baseUrl}character/ability", $"{baseUrl}character/item-equipment", $"{baseUrl}character/cashitem-equipment", $"{baseUrl}character/symbol-equipment", $"{baseUrl}character/set-effect", $"{baseUrl}character/beauty-equipment", $"{baseUrl}character/android-equipment", $"{baseUrl}character/pet-equipment", $"{baseUrl}character/link-skill", $"{baseUrl}character/vmatrix", $"{baseUrl}character/hexamatrix", $"{baseUrl}character/hexamatrix-stat", $"{baseUrl}character/dojang", $"{baseUrl}user/union", $"{baseUrl}user/union-raider", $"{baseUrl}user/union-artifact" }; foreach (var endpoint in endpoints) { var data = string.Empty; Console.WriteLine($"Requesting endpoint: {endpoint}"); //수정 for (int j = 28; j <= 29; j += 1) { url = $"{endpoint}?ocid={ocid}&date=2024-06-{j}"; var rawData = await client.GetStringAsync(url); if (j == 29) { //수정 rawData = rawData.Replace("2024-06-29", "2024-06-28"); if (data != rawData) { Console.WriteLine("다름"); } } data = rawData; } Thread.Sleep(2000); } var skillList = new List<string> { "0", "1", "1.5", "2", "2.5", "3", "4", "hyperpassive", "hyperactive", "5", "6" }; var skillUrl = $"{baseUrl}character/skill"; foreach (var skill in skillList) { var data = string.Empty; Console.WriteLine($"Requesting endpoint: {skill}"); //수정 for (int j = 28; j <= 29; j += 1) { url = $"{skillUrl}?ocid={ocid}&date=2024-06-{j}&character_skill_grade={skill}"; var rawData = await client.GetStringAsync(url); if (j == 29) { //수정 rawData = rawData.Replace("2024-06-29", "2024-06-28"); if (data != rawData) { Console.WriteLine("다름"); } } data = rawData; } Thread.Sleep(2000); } Console.WriteLine("Finished");