Skip to content

Instantly share code, notes, and snippets.

@zeroday0619
Created May 15, 2020 12:57
Show Gist options
  • Select an option

  • Save zeroday0619/c81f6d8b38b64d1881bf3b1b0f6bdfef to your computer and use it in GitHub Desktop.

Select an option

Save zeroday0619/c81f6d8b38b64d1881bf3b1b0f6bdfef to your computer and use it in GitHub Desktop.
EBS ONLINE CLASS - SCHEDULED MACRO
# -*- 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