Created
May 15, 2020 12:57
-
-
Save zeroday0619/c81f6d8b38b64d1881bf3b1b0f6bdfef to your computer and use it in GitHub Desktop.
EBS ONLINE CLASS - SCHEDULED MACRO
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- coding: utf-8 -*- | |
| from __future__ import print_function, unicode_literals | |
| from selenium import webdriver | |
| from bs4 import BeautifulSoup | |
| from PyInquirer import prompt, print_json | |
| from datetime import datetime, time | |
| from time import sleep | |
| import getpass | |
| driver = webdriver.Chrome('chromedriver.exe') | |
| driver.implicitly_wait(3) | |
| main_window = driver.current_window_handle | |
| periods = [ | |
| {'seq': 1, 'start': '08:40', 'end': '09:30', 'finished': False}, | |
| {'seq': 2, 'start': '09:40', 'end': '10:30', 'finished': False}, | |
| {'seq': 3, 'start': '10:40', 'end': '11:30', 'finished': False}, | |
| {'seq': 4, 'start': '11:40', 'end': '12:30', 'finished': False}, | |
| {'seq': 5, 'start': '13:20', 'end': '14:10', 'finished': False}, | |
| {'seq': 6, 'start': '14:20', 'end': '15:10', 'finished': False}, | |
| {'seq': 7, 'start': '15:20', 'end': '16:10', 'finished': False}, | |
| ] | |
| subject_titles = [] | |
| lecture_titles = [] | |
| subjects = [] | |
| lectures = [] | |
| schedule = [] | |
| def find_subject(subject_name): | |
| for subject in subjects: | |
| if subject['title'] == subject_name: | |
| return subject | |
| def find_lecture(lecture_name): | |
| for lecture in lectures: | |
| if lecture['title'] == lecture_name: | |
| return lecture | |
| def is_time_between(begin_time, end_time, check_time=None): | |
| check_time = check_time or datetime.now().time() | |
| if begin_time < end_time: | |
| return check_time >= begin_time and check_time <= end_time | |
| else: | |
| return check_time >= begin_time or check_time <= end_time | |
| def get_current_period(): | |
| for period in periods: | |
| start_time = period['start'].split(':') | |
| end_time = period['end'].split(':') | |
| if is_time_between(time(int(start_time[0]), int(start_time[1])), time(int(end_time[0]), int(end_time[1]))): | |
| return period | |
| def get_current_lecture(): | |
| current_period = get_current_period() | |
| return schedule[current_period['seq'] - 1] | |
| def sustain_session(): | |
| driver.switch_to.window(driver.window_handles[0]) | |
| driver.refresh() | |
| print('[!] SESSION 유지') | |
| sleep(20) | |
| def connect_web(): | |
| print('[ STEP1 ] CONNECT_WEB') | |
| print('[ STEP1 ] GATE_PAGE') | |
| driver.get('https://oc.ebssw.kr') | |
| sleep(0.3) | |
| print('[ STEP1 ] CHECK_SCHOOL') | |
| driver.get( | |
| 'https://hoc2.ebssw.kr/onlineClass/search/onlineClassSearchView.do?schulCcode=03008&schCssTyp=online_high') | |
| sleep(0.3) | |
| print('[ STEP1 ] LOGIN_PAGE') | |
| driver.get('https://hoc2.ebssw.kr/sso/loginView.do?loginType=onlineClass') | |
| print('[ STEP1 ] CLEAR!\n') | |
| def do_login(id: str, password: str): | |
| print('[ STEP2 ] DO_LOGIN') | |
| driver.find_element_by_css_selector( | |
| 'input[name="j_username"]').send_keys(id) | |
| driver.find_element_by_css_selector( | |
| 'input[name="j_password"]').send_keys(password) | |
| driver.execute_script('return doGroupMberCheck();') | |
| print('[ STEP2 ] CLEAR!\n') | |
| sleep(0.3) | |
| def set_class_list(): | |
| print('[ STEP3 ] SET_CLASS_LIST') | |
| driver.get( | |
| 'https://hoc2.ebssw.kr/onlineClass/reqst/onlineClassReqstInfoView.do') | |
| req = driver.page_source | |
| soup = BeautifulSoup(req, 'html.parser') | |
| classes = soup.select('.sec_class .list a') | |
| for subject in classes: | |
| title = " ".join(subject.text.strip().replace( | |
| 'keyboard_arrow_right', '').split()) | |
| subject_titles.append(title) | |
| subjects.append({ | |
| 'title': title, | |
| 'href': subject.attrs['href'] | |
| }) | |
| print('[ STEP3 ] CLEAR!\n') | |
| def set_timetable(seq: int): | |
| print(f'[ STEP4 ] SET_TIMETABLE_{seq}교시') | |
| questions = [{ | |
| 'type': 'list', | |
| 'name': 'subject', | |
| 'message': f'{seq}교시에 수강할 과목을 선택하세요.', | |
| 'choices': subject_titles | |
| }] | |
| answers = prompt(questions) | |
| subject = find_subject(answers['subject']) | |
| driver.get(subject['href']) | |
| req = driver.page_source | |
| soup = BeautifulSoup(req, 'html.parser') | |
| lecture_list = soup.select('.myclass_list li') | |
| for lecture in lecture_list: | |
| title = lecture.select('p.tit')[0].text.strip() | |
| lecture_titles.append(title) | |
| lectures.append({ | |
| 'title': title, | |
| 'href': lecture.select('a')[0].attrs['href'] | |
| }) | |
| questions = [{ | |
| 'type': 'list', | |
| 'name': 'lecture', | |
| 'message': f'{seq}교시에 수강할 강좌를 선택하세요.', | |
| 'choices': lecture_titles | |
| }] | |
| answers = prompt(questions) | |
| lecture = find_lecture(answers['lecture']) | |
| schedule.append(lecture) | |
| lecture_titles.clear() | |
| lectures.clear() | |
| def sign_up_lecture(lecture): | |
| driver.switch_to.window(driver.window_handles[0]) | |
| print(f'[수강][접속] {lecture["title"]}') | |
| driver.get(f'https://hoc2.ebssw.kr{lecture["href"]}') | |
| req = driver.page_source | |
| soup = BeautifulSoup(req, 'html.parser') | |
| alctcrSn = soup.select('input[name=alctcrSn]')[0].attrs['value'] | |
| stepSn = soup.select('input[name=stepSn]')[0].attrs['value'] | |
| try: | |
| print(f'[수강][신청] {lecture["title"]}') | |
| driver.execute_script( | |
| f'return insertAlctcrAtnlc({alctcrSn}, {stepSn}, "003");') | |
| sleep(0.25) | |
| alert = driver.switch_to.alert | |
| sleep(0.25) | |
| alert.accept() | |
| sleep(0.25) | |
| alert = driver.switch_to.alert | |
| sleep(0.25) | |
| alert.accept() | |
| except: | |
| pass | |
| def take_class(lecture): | |
| driver.execute_script('return showLrnWindow();') | |
| print(f'[수강][강의실] {lecture["title"]}') | |
| sleep(0.5) | |
| driver.switch_to.window(driver.window_handles[-1]) | |
| req = driver.page_source | |
| soup = BeautifulSoup(req, 'html.parser') | |
| steps = soup.select('.sidebar ul a') | |
| for step in steps: | |
| step_func = step.attrs['href'].replace('javascript:', '') | |
| driver.execute_script(f"return {step_func}") | |
| sleep(2) | |
| req = driver.page_source | |
| soup = BeautifulSoup(req, 'html.parser') | |
| step_type = soup.select('input[name=cntntsTyCode]')[0].attrs['value'] | |
| print(f'[수강][STEP][{step_type}] {lecture["title"]}') | |
| if str(step_type) == '014': | |
| driver.find_element_by_id('iframeYoutube').click() | |
| reviveTime = soup.select('input#revivTime')[0].attrs['value'] | |
| sleep(int(reviveTime) + 60) | |
| elif str(step_type) == '001': | |
| driver.find_element_by_css_selector('.video_wrap .video').click() | |
| reviveTime = soup.select('input#revivTime')[0].attrs['value'] | |
| sleep(int(reviveTime) + 60) | |
| else: | |
| sleep(5) | |
| driver.execute_script('return goLctrum();') | |
| connect_web() | |
| do_login(str(input('ID를 입력하세요: ')), str(getpass.getpass('PW를 입력하세요: '))) | |
| set_class_list() | |
| for period in periods: | |
| set_timetable(period['seq']) | |
| while True: | |
| sleep(0.5) | |
| current_period = get_current_period() | |
| if not current_period is None: | |
| if current_period['finished']: | |
| sustain_session() | |
| continue | |
| current_lecture = get_current_lecture() | |
| sign_up_lecture(current_lecture) | |
| take_class(current_lecture) | |
| print(f'[{current_period["seq"]}교시] {current_lecture["title"]} 수강 완료!') | |
| current_period['finished'] = True | |
| elif (current_period is None) or (current_period['finished']): | |
| sustain_session() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment