본문 바로가기
카테고리 없음

메크로로 코레일 예매하기

by 샤샤샤샤 2023. 8. 31.

이번 추석에 본가에 내려갈 ktx표를 예매하기 위해 간단한 메크로를 만들어 봤다.

// 누르고 싶은 버튼
let btn = document.getElementsByName("menu1")[0];

function printTime(date) {
  let hour = date.getHours();
  let min = date.getMinutes();
  let sec = date.getSeconds();
  let milli = date.getMilliseconds();
  if (("" + min).length == 1) {
    min = "0" + min;
  }
  if (("" + sec).length == 1) {
    sec = "0" + sec;
  }
  if (("" + milli).length == 1) {
    sec = "00" + sec;
  } else if (("" + milli).length == 2) {
    sec = "0" + sec;
  }
  return "" + hour + min + sec + milli;
}

function clickBtn() {
  console.log(document.getElementById("NetFunnel_Skin_Top"));
  if (printTime(new Date()) >= "65958600") {
    console.log("작동");
    btn.click();
  }
}

let interval = setInterval(() => {
  clickBtn();
}, 10);

 

 

자바스크립트로 작성했다.

 

결론은 실패.

원인은 코레일의 대기열 처리 방식을 고려하기 못한데 있었다.

 

코레일은 예매하기 버튼을 클릭할 시 새로운 창으로 넘어가지 않고 기존 창에 팝업같은 html태그를 새롭게 띄우는데,  여기에 나온 대기자 숫자가 다 사라져야 예매 페이지로 넘어간다.

 

한데 내가 짠 코드는 정상적으로 대기열에 들어가도 0.01초 간격으로 계속 버튼을 클릭하기 때문에 계속해서 새로고침되는 현상이 발생했다.

 

이 때문에 30초 이상 늦게 대기열에 들어가게 됐고, 내 앞에는 이미 21000명의 대기자가....;;

 

// 누르고 싶은 버튼
let btn = document.getElementsByName("menu1")[0]; // 클릭하고자 하는 버튼의 name값

function printTime(date) {
  let hour = date.getHours();
  let min = date.getMinutes();
  let sec = date.getSeconds();
  let milli = date.getMilliseconds();
  if (("" + min).length == 1) {
    min = "0" + min;
  }
  if (("" + sec).length == 1) {
    sec = "0" + sec;
  }
  if (("" + milli).length == 1) {
    sec = "00" + sec;
  } else if (("" + milli).length == 2) {
    sec = "0" + sec;
  }
  return "" + hour + min + sec + milli;
}

function clickBtn() {
  console.log(document.getElementById("NetFunnel_Skin_Top"));
  if (printTime(new Date()) >= "65959600") { // 설정된 시간. 자바스크립트와 서버와의 시간차이 0.4초
    console.log("작동");
    btn.click();
  }
}

let interval = setInterval(() => {
  clickBtn();
  if (document.getElementById("NetFunnel_Skin_Top") != null) { // 특정 html태그가 나타날시 중단
    clearInterval(interval);
  }
}, 10);

 

 

중지 조건을 추가한 메크로는 위와 같다.

 

그러나 이것 역시도 정상작동 하리라고 확신은 못하겠다.

내가 예매하기 버튼을 클릭한 시점에서 팝업 html 태그가 뜨기까지 시간이 0.01초 이상이라면, 클릭이 한번 더 발생하여 서버로 통신이 한번 이상 더 이뤄질 것이고, 이로 인해 새로고침되며 대기열 뒤로 밀릴 가능성이 존재하기 때문이다.

 

aletr창이 뜰 경우 자동적으로 확인버튼을 클릭하도록 만들기위해 조사해봤으나 보안 관련 문제로 웹 브라우져에서 alert창을 제어할수 없다고 한다.

 

클릭하여 정상적으로 통신이 전송된 순간 interval이 종료되도록 코드를 짜는 것이 베스트인것 같은데 이를 위해선 사이트의 통신 방법을 알아야하고 그에 따라 코드도 더 복잡해질것 같기에 일단 여기서 마친다.

 

내년 설에 코드를 다시 한번 실험해보는 걸로.