Skip to content

Instantly share code, notes, and snippets.

@HelloWorld017
Last active March 14, 2024 14:26
Show Gist options
  • Save HelloWorld017/2f4e43dac04998f91a1d21339d9d3fb9 to your computer and use it in GitHub Desktop.
Save HelloWorld017/2f4e43dac04998f91a1d21339d9d3fb9 to your computer and use it in GitHub Desktop.
카이스트 수강신청 뽀개기

카이스트 수강신청

NetFunnel

  • 트래픽을 관리하기 위한 하나의 솔루션, 흔히 보는 접속자 대기가 그것
  • https://traffic.kaist.ac.kr/ 에서 동작 중
    • 혹시 모르지만 서버 시간을 여기서 제공해준다.

GET https://traffic.kaist.ac.kr/ts.wseq

Global Params:

  • opcode: 실행할 명령어 이름 (Opcode Table 참고)
  • nfid: 0
  • prefix: Response 맨 앞에 붙음
  • sid: service_1
  • js: yes
  • user_data: 카이스트 UID
  • 1550417639182 (timestamp로 생각됨)

Opcode Table:

opcode 이름
5101 getTidchkEnter
5002 chkEnter
5003 aliveNotice
5004 setComplete

5101 getTidchkEnter

  • 처음에 요청할 시 호출
  • 이를 통해 Key를 받아오는 것으로 추정
  • getTid와 chkEnter 두개의 함수를 스까 해놓은 것인데, Tid가 Ticket ID 라는 뜻이다.

Params:

  • aid: act_03 (뭔지 모름)

Response:

NetFunnel.gRtype=5101;
NetFunnel.gControl.result='5002:200:key=[0-9A-F]{254}\
&nwait=0&nnext=0&tps=0&ttl=0&ip=traffic.kaist.ac.kr&port=443';

NetFunnel.gControl._showResult();
  • key를 /key=([0-9A-F]+)/ 를 통해 얻어내자
  • NetFunnel.gControl.result도 /gControl\.result='[^\r\n]+?';/를 통해 얻어내자
  • 저기서 200 (result.substr(5, 3)) 이 retCode이다.
  • 200이 뜨면 개이득이고, 201이 뜨면 계속 chkEnter로 순번이 왔나 체크를 해줘야 한다.

5002 chkEnter

  • 일단 티켓을 받긴 했는데 들어갈 수 있는지를 체크하는 명령어 같다.

5004 setComplete

요청을 받은 후 보내는 답장 요청

Params:

  • key: 받은 key

Response:

  • 별 거 없다

netfunnel.js

주소

  • 설정 제외하고는 uglify 돼있다 짜증
  • 다행히도 변수명은 다 살아있다.
  • NetFunnel.TsClient 가 실제 요청 관련된 곳인 듯 하다.
  • Tampermonkey 등을 통해 NetFunnel.TS_DEBUG_MODE = true; 로 바꿔주자

NetFunnel MProtect (매크로 감지)

카이스트에서 사용하지 않음!!

  1. 표준편차가 작을 경우에 (요청과 요청 사이의 시간 간격이 일정할 경우)
  2. 단위 시간 당 요청량 높을 경우 (기본값: 20초 당 18개 요청)
  3. 완료 요청이 없는 요청 (기본값: 최대 10개, opcode 5004로 추정)

courseRegistration

NetFunnel을 통해서 Key를 가져왔다면 이를 사용해야 한다.

Cookie NetFunnel_ID를 NetFunnel.gControl.key로 설정해야 한다.

POST https://ssogw6.kaist.ac.kr/courseRegistration

수강신청을 변경하기 위한 요청이다.

Body:

  • processType: registrationSave
  • affairId: 33
  • affairName: 수강신청 변경
  • hid_year: 2019 (연도)
  • hid_term: 1 (아마 봄학기를 의미하는 듯)
  • hid_subjectNo: 10.009 (과목의 전산코드)
  • hid_subjectTitle: Intermediate English Reading & Writing (과목명)
  • hid_lectureClass: D (분반)
  • hid_deptId: 4424 (인문사회과학부)
  • hid_credit: 2.0 (학점)
  • hid_subjectId: 36 (과목 ID라고는 돼있는데 무엇을 암시하는 거지?)

그 외에도 이런 필드 들이 있다.

hid_reattend: N
hid_mngFlag: 1
hid_termFlag: NULL
hid_rowNo: 4
hid_re_year:
hid_re_term:
hid_re_subjectNo:
hid_re_class:
hid_re_score:

결론: 그냥 직접 요청해보고 Request를 적당한 json 같은 데에 베껴두자


이걸로 간단한 매크로를 짜는 건 이걸 읽는 사람에게 맡겨둔다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment