리얼월드 (Real world)

컴퓨터공학과 새내기가 수강신청하는 법

2020. 2. 25. 02:03

 

현대건설힐스테이트배구단 레프트 고예림

 

 아래의 내용은 20학번 새내기로서 경희대학교 수강신청 올클리어에 성공하기 위해서 고군분투한 내용을 기록한 것이다.

1. 특정키 입력 금지 메커니즘 우회 🛰

 요즘은 거의 모든 학교가 수강신청 사이트에서 특정 키 입력을 금지하고 있다. F5, 스페이스바, 엔터키 같이 빠르게 무언가 수행할 수 있도록 도와주거나, 팝업창을 마우스를 이용하는 것보다 빠르게 닫도록 도와주는 역할을 하는데, 이런 Functional key가 허용된다면 경쟁자들보다 높은 시간적 우위를 점할 수 있을 것이라고 생각해서 구현하기 시작했다.

 

 

몬쥬알지 다들?

 

 

function noKeyCheck(){	
	if (event.keyCode == 116) {
		alert("F5키를 사용 할 수 없습니다.");
		event.preventDefault();
        return false;
    } else if(event.ctrlKey && (event.keyCode == 78 || event.keyCode == 82)) {
        return false;
     // 엔터키, 스페이스 키 막기    
    } else if (event.keyCode === 13 || event.keyCode === 32) {
    	alert("매크로 방지를 위해 엔터키와 스페이스바 키는 사용하실 수 없습니다.");
        event.preventDefault();
        return false;
    }
}
$(document).on("contextmenu",function(e){
	//alert("매크로 방지를 위해 마우스 오른클릭은 사용하실 수 없습니다.");
    return false;
});
document.onkeydown = noKeyCheck;

 

 물론 특정 키 입력 금지 메커니즘을 구현한 코드는 바로 찾기 쉽다. 보통은 Chrome 개발자 도구의 'Source' 탭에서 해당 소스를 수정하여 무력화시키고 [ctrl + s]를 통해 적용하면 빠르게 우회할 수 있다. 하지만, 경희대학교 수강신청 사이트의 경우에는 하나의 큰 Main content가 있고 버튼을 누르면서 Main content가 iframe 을 이용하여 src에 특정 경로를 적용시키는 방식으로 구현되어 있었기 때문에 이 방법은 사용할 수 없었다. 그래서 메인페이지에서 DOM을 사용하여 아래 frame에 접근하는 방식으로 인증을 무효화 했다. 

 

document.getElementById('Main').contentDocument.getElementById('coreMain').contentWindow.event = null

 

 대충 이렇게 우회하면 성공따리 😀 ! 하지만 이 방법을 사용할 때마다 개발자 도구를 열고 Console 탭에 들어가서 소스를 붙여넣기 할 수 있는 상황이 아니기 때문에 Chrome Extension 으로 제작하였다. Chrome Extension 을 제작할 때 가장 힘들었던 부분은 Extension과 Main page가 서로 다른 Scope를 갖는다는 것이었다. 그래서 'content_script'를 사용해도 무효화 코드가 Main page에 제대로 적용되지 않았는데 이 경우에 location.href = "javascript:function_to_call()" 과 같은 식으로 Main page에 적용할 수 있었다.

 

 이렇게 만든 Chrome extension은 아래 링크에서 오픈소스로 확인해 볼 수 있다. 😈

 

ch4n3-yoon/KyungHeeUniv-Sugang

경희대학교 수강신청 시스템 키 입력 금지 무효화 및 자동화 프로젝트. Contribute to ch4n3-yoon/KyungHeeUniv-Sugang development by creating an account on GitHub.

github.com

 

2. 붙여넣기를 더 빠르게 🏎🏁

 동아리 선배들이 알려주시길, 아래 사진처럼 수강신청을 한다고 그러셨다.

 

 

모니터를 3부분으로 사용, 1.수강신청시스템 2. 네이비즘 서버시간 3. 학수번호 코드

 

 그래서 어떤 과목을 신청하기 위해서는 마우스를 신나게 움직여야 하는 것이다. 만약에 다중클립보드 복사가 되는 프로그램이 있다면? 그건 대박일 것이라고 생각하고 이 것을 구현해보았다. C언어에는 자신이 매우 없었지만 대충 Win API를 사용해서 keyboard event를 통해서 [ctrl + c + 1], [ctrl + c + 2] 등의 단축키를 감지하면 클립보드에 저장하고 붙여넣기 할 때도 WinAPI를 사용해서 특정 단축키가 입력되면 몇번째에 저장된 클립보드를 붙여넣기 하는 식으로 더 효율적으로 개선할 있을 것이라고 생각했다. 

 

 

Using the Clipboard - Win32 apps

This section has code samples for the following tasks

docs.microsoft.com

 

 그런데 이 기능을 구현하기 위해서 구글링을 하던 도중 이미 이 concept를 구현한 프로그램을 알게 되었고 수강신청할 때는 이 프로그램을 사용하였다. 나는 내가 만든 프로그램을 믿을 수가 없기 때문에.. 😅 이 프로그램을 이용해서, 더이상 마우스가 브라우저와 메모장 사이를 번거롭게 왔다갔다거리는 비효율적인 액션을 개선할 수 있었다. 나중에 이 프로그램은 한 번 만들어봐야겠다.

 

 내가 사용한 프로그램은 MultiClipBoardSlots 이라는 프로그램이다. 이 프로그램을 실행시키면 다중복사가 가능해지는데 수강신청 서비스가 시작되기 3분 전 정도에 [ctrl + 1], [ctrl + 2], ... ,[ctrl + 6]를 사용해서 내가 수강신청할 과목들을 미리 로드시켜 놓았기 때문에, 마우스로 메모장과 브라우저 사이를 이동하는 데에 소모되는 불필요한 시간을 없앨 수 있었다. 내가 수강신청을 성공하는 데에 있어서 가장 큰 기여를 한 것이 이게 아닌가 싶다. 👏

 

 

Download MultiClipBoardSlots 1.59

Download MultiClipBoardSlots - Improve your Windows experience by adding 10 extra memory slots to your operating system's clipboard with this tiny and easy-to-use app

www.softpedia.com

 

3. '네이비즘 서버시간'의 작동법에 대한 의문? 🤔

 올해 1월 초부터 도드람 V리그 19-20 시즌의 현대건설, GS칼텍스 배구 경기를 조금이나마 앞쪽에서 응원하려고 티켓팅을 해왔는데 그 때마다 네이비즘을 이용했다. 하지만 정시가 됐을 때 이미 앞 좌석들이 팔려나간 상황을 보고 의문이 들었다. 그래서 간단한 비교를 해보았다.

 

네이비즘 서버시간과 실제 서버시간이 3~4초 정도 차이가 나는 현상을 볼 수 있다.

 동영상과 같이 약 3~4초 정도 시간이 차이가 나는 에바참치꽁치(이하 에참꽁)인 것을 확인할 수 있다. 이러한 에참꽁인 부분에 대한 의문을 확인하기 위해 네이비즘 서버시간의 동작원리를 찾으려고 해봤다. 아니ㅋㅋ 근데 진짜 골때리는 상황에 직면했다.

 

https://blog.naver.com/navyism/220923214811

 

네이비즘 서버시간이 정확한 시간을 알려주는 원리

서버시간 네이비즘은 인터파크티켓이나 멜론티켓 등 콘서트 티켓팅과 각종 선착순 이벤트 그리고 대학교 수...

blog.naver.com

 

띠용?ㅋㅋ 영업비밀이라니 😥

 

 

 네이비즘 측에서도 서버시간 측정 원리를 공식적으로 알려주지 않기 때문에 왜 약 4초 간의 시간 차이가 발생하는지는 알 수 없지만 확실한 것은 네이비즘의 신뢰성이 낮다는 것이다. 서버는 정확한 정보를 주고있는데도. 그래서 내가 직접 서버시간 추출기를 만들어보았다.

 

 

 

 

 

 일단 내가 추측하는 네이비즘의 원리는 다음과 같다. 웹서버로 HTTP Request를 보내면 Response로 Date가 딸려오는데 이를 가져와서 서버시간으로 인식하는 것이다.

 

 

 

 그래서 나도 HTTP header 중 Date를 파싱하여 시간을 알려주는 사이트를 제작하고자 하였다. 그랬더니 네이비즘처럼 3~4초 정도 갭이 발생했다. 왜 그런지는 모르겠다. 그래도 초가 넘어가는 타이밍?이라고 그러나? 숫자가 바뀌는 타이밍? 이 똑같아서 +3 해서 하드코딩했더니 서버시간과 똑같아져서 그냥 이대로 사용했다.

 

 

<?php

function make_curl($url){
    $request_timeout = 10;
    $request = curl_init();
    curl_setopt($request, CURLOPT_URL, $url);
    curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($request, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($request, CURLOPT_TIMEOUT, $request_timeout);
    curl_setopt($request, CURLOPT_CONNECTTIMEOUT, $request_timeout);
    curl_setopt($request, CURLOPT_HEADER, 1);
    curl_setopt($request, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'Connection: Close'));
    $result = curl_exec($request);
    return $result;
}


$curl_result = make_curl('http://sugang.khu.ac.kr/');
if ($curl_result !== '') {
    $split_result = explode("\r\n\r\n", $curl_result, 2);
    $header = $split_result[0];
    $headers = array();

    foreach (explode("\r\n", $header) as $i => $line) {
        if ($i === 0)
            $headers['http_code'] = $line;
        else
        {
            list ($key, $value) = explode(': ', $line);

            $headers[$key] = $value;
        }
    }
}

echo $headers['Date'];

 

 getServerTime.php 에 20 밀리초마다 한 번씩 요청을 주고 받은 response를 DOM을 이용해 출력해주도록 코딩하였다.

 

4. 그리고 결과

 

 

 

 내가 짠 시간표대로 수강신청 🎉올클리어🎉

 공강이 없다는 점이 아쉽긴 하지만 우리 과는 1학년 필수교양 시간표가 공강을 만들지 못하도록 나와서 어쩔 수 없는 선택이었지만 나름 만족한다