팁과 노하우

전체보기

모바일 상단 메뉴

본문 페이지

[기타] 넥슨캐시 사용내역 저장

하수
댓글: 9 개
조회: 8654
2024-02-15 03:03:12

대충 작성해봤어요

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

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

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');

Lv51 하수

해방 전에는 모두 메린이다

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징

최근 HOT한 콘텐츠

  • 메이플
  • 게임
  • IT
  • 유머
  • 연예