이번 추석에 본가에 내려갈 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이 종료되도록 코드를 짜는 것이 베스트인것 같은데 이를 위해선 사이트의 통신 방법을 알아야하고 그에 따라 코드도 더 복잡해질것 같기에 일단 여기서 마친다.
내년 설에 코드를 다시 한번 실험해보는 걸로.