대충 작성해봤어요

넥슨 로그인하고 낵슨캐시 사용내역 페이지 들어가서 콘솔에 아래 코드 붙여넣으면 엑셀로 저장해줍니다

이전에 내가 얼마 썼는지 알려주는 코드? 비슷하게 쓰면 됩니다

startYear, startMonth, endYear, endMonth는 적당히 고쳐쓰면 되는데 내역 제공기간이 5년인건 체크하고 쓰면 됩니다


(주의) eval 이라는 코드가 있는데 위험한 코드도 실행할 수 있는 함수니까 이상한 데서 수정된 코드 쓰지 않기 바람

현재 사용된 부분은 sheetJS, fileSaver 라는 패키지를 불러오는 부분입니다


(유감) 이메일 계정밖에 없어서 이메일 계정 아닌건 테스트 못함


안되면... 누군가 능력자분이 적당히 수정할 부분 알려주세요


-----아래부터 코드-----


const startYear = 2019;

const startMonth = 3;

const endYear = 2021;

const endMonth = 3;


const resultArray = [];


const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));


const columnParser = (target) => {

  const tds = target.querySelectorAll('td');

  return {

    num: tds[0].textContent,

    date: tds[1].textContent,

    cash: tds[2].textContent,

    service: tds[3].textContent,

    item: tds[4].textContent,

    state: tds[5].textContent,

  };

};


const fetchData = async () => {

  for (let year = startYear; year <= endYear; year++) {

    if (year > endYear) break;

    for (let month = 1; month <= 12; month++) {

      if (year === startYear && month < startMonth) continue;

      if (year === endYear && month > endMonth) break;


      let pageNo = 0;


      while (++pageNo) {

        const params = new URLSearchParams({ pageno: pageNo, pagecode: 2, year, month });

        const url = 'https://member.nexon.com/cash/chargelist.aspx?' + params.toString();


        try {

          const response = await fetch(url).catch((reason) => {

            console.log(url, reason);

          });

          const data = await response.text();

          const parser = new DOMParser();

          const doc = parser.parseFromString(data, 'text/html');


          const noListCheck = doc.querySelectorAll('table.cashList tbody tr td.noList').length;

          if (noListCheck > 0) break;


          const items = doc.querySelectorAll('table.cashList tbody tr');


          const parse = Array.from(items).map((item) => columnParser(item));


          resultArray.push(...parse);

        } catch (e) {

          console.log(e);

          throw e;

        }


        console.log('current length : ', resultArray.length);

        await sleep(3000);

      }

    }

  }

};


await fetchData().then(() => { console.log("DONE") });


const sheetJS = await (await fetch('https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.3/xlsx.full.min.js')).text();

eval(sheetJS);

const fileSaver = await (await fetch('https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js')).text();

eval(fileSaver);


let wb = XLSX.utils.book_new();

wb.SheetNames.push("넥슨캐시 사용내역");


let ws_data = [["번호", "날짜", "캐시", "서비스타입", "내역", "상태"], ...resultArray.map((result) => Object.values(result))];

let ws = XLSX.utils.aoa_to_sheet(ws_data);


wb.Sheets["넥슨캐시 사용내역"] = ws;


let wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'binary'});


function s2ab(s) {

  var buf = new ArrayBuffer(s.length);

  var view = new Uint8Array(buf);

  for (var i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;

  return buf;

}


saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), 'result.xlsx');