[파이썬] 코로나 자동 자가진단 (리눅스 오픈소스)Python2021. 12. 1. 16:00
Table of Contents
개발 날짜 : 2021.03.31 ~
리눅스 서버에서 돌아가는 코드입니다.
권장 사항 :
이 프로그램은
코로나 19 자가진단을 무증상으로 제출하는 프로그램입니다.
증상이 있을 시 스스로 해당하는 증상에 유증상으로 체크하시기 바랍니다.
프로젝트 관련 추천글
리눅스 설치 필요 모듈
schedule
selenium
selenium-webdriver
개발 일지
1.1.0
이제 원하는 시간에 자가진단을 진행할 수 있습니다.
기본 설정은 08시(오전 8시)입니다.
1.1.1
인터넷 속도에 따라 입력 오류가 날 수 있는 점을 보완했습니다.
1.2.0
- 보안 키패드 입력 기능
비밀번호에 맞는 버튼을 순서대로 눌러 입력해줍니다.
- html의 변경값을 맞게 변경
- 최적화, 안정화
1.2.1
- 가끔 버튼이 클릭되지 않던 버그 수정
1.3.0
- - 프로그램 관리 최적화
- - Schedule 모듈 기능 추가
- - 설문 추가로 인한 코드 멈춤 수정
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
import datetime
import schedule
print("START")
today = datetime.datetime.now()
today = today.strftime('%Y/%m/%d')
today_Check = False
print(str(today)+"일자, 프로그램 가동")
print('')
print('')
def job():
today_date = datetime.datetime.now()
today_date = today_date.strftime('%Y/%m/%d %H:%M')
print(' [자가진단] 날짜가 바뀌었습니다. 자가진단을 시작합니다.')
print(' [자가진단] 오늘 날짜 : ' + str(today_date))
print('')
print('')
f = open("/root/Your_Privacy.txt", 'r', encoding='UTF8')
txtfile = f.readlines() # 메모장 읽어오기
for read in txtfile:
for x in range(1, 6):
try:
Your_Privacy = read.split(" ") # 아이디들을 리스트에 저장
# 서울특별시, 부산광역시, 대구광역시, 인천광역시, 광주광역시, 대전광역시, 울산광역시, 세종특별자치시, 경기도,강원도, 충청북도, 충청남도, 전라북도, 전라남도, 경상북도, 경상남도, 제주특별자치도
Your_Area = Your_Privacy[0]
Your_Class = Your_Privacy[1] # 유치원, 초등학교, 중학교, 고등학교, 특수학교등
Your_School = Your_Privacy[2]
Your_Name = Your_Privacy[3]
Your_Date = Your_Privacy[4]
Your_Pass = Your_Privacy[5]
Your_Pass.rstrip('\n')
# Your_area 설정
Areas = ["", "", "서울특별시", "부산광역시", "대구광역시", "인천광역시", "광주광역시", "대전광역시", "울산광역시", "세종특별자치시",
"경기도", "강원도", "충청북도", "충청남도", "전라북도", "전라남도", "경상북도", "경상남도", "제주특별자치도"]
for Area_index in range(0, len(Areas)):
if Your_Area == Areas[Area_index]:
Your_Area = Area_index
break
state = '[자가진단] 지역 설정완료'
# Your_Class 설정
Classes = ["", "유치원", "초등학교", "중학교", "고등학교", "특수학교등"]
for Class_index in range(0, len(Classes)):
if Your_Class == Classes[Class_index]:
Your_Class = Class_index + 1
break
state = '[자가진단] 학급 설정완료'
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(
ChromeDriverManager().install(), chrome_options=chrome_options)
# driver = webdriver.Chrome(executable_path=r'/root/chromedriver')
state = '[자가진단] 크롬 켜기'
driver.get("https://hcs.eduro.go.kr/#/loginHome")
driver.find_element_by_id('btnConfirm2').click()
driver.find_element_by_xpath(
'//*[@id="WriteInfoForm"]/table/tbody/tr[1]/td/button').click()
driver.find_element_by_id('sidolabel').click()
# 시/도 설정 메뉴 * 반드시 코드 사용할 것 *
driver.find_element_by_xpath(
'//*[@id="sidolabel"]/option[' + str(Your_Area) + ']').click()
driver.find_element_by_xpath(
'//*[@id="crseScCode"]/option[' + str(Your_Class) + ']').click()
elem = driver.find_element_by_xpath('//*[@id="orgname"]')
elem.send_keys(str(Your_School))
elem.send_keys(Keys.ENTER)
state = '[자가진단] 이용자 학교 입력'
time.sleep(2)
driver.find_element_by_xpath(
'//*[@id="softBoardListLayer"]/div[2]/div[1]/ul').click() # 학교선택
driver.find_element_by_xpath(
'//*[@id="softBoardListLayer"]/div[2]/div[2]/input').click()
elem = driver.find_element_by_xpath(
'//*[@id="user_name_input"]')
elem.send_keys(Your_Name)
time.sleep(1)
state = '[자가진단] 이용자 이름 입력'
elem = driver.find_element_by_xpath(
'//*[@id="birthday_input"]')
elem.send_keys(Your_Date)
state = '[자가진단] 이용자 생일 입력'
time.sleep(1)
driver.find_element_by_xpath(
'//*[@id="btnConfirm"]').click()
state = '[자가진단] 이용자의 기본 정보 입력 후 버튼 클릭'
driver.implicitly_wait(10)
Join_Error = False
while Join_Error == False:
try:
time.sleep(1)
driver.find_element_by_xpath(
'//*[@id="password"]').click()
Join_Error = True
except:
driver.find_element_by_xpath(
'//*[@id="btnConfirm"]').click()
time.sleep(1)
Your_Passes = list(Your_Pass)
# transkey_div_3_2 : 9, 0, 1, 2, 3, 빈칸
# transkey_div_3_3 : 4, 5, 6, 7, 8, 빈칸
keys = []
elem = driver.find_element_by_xpath(
'//*[@id="password_mainDiv"]/div[4]/a')
val = elem.get_attribute("aria-label")
keys.append(val)
for x in range(1, 5):
elem = driver.find_element_by_xpath(
'//*[@id="password_mainDiv"]/div[5]/a['+str(x)+']')
val = elem.get_attribute("aria-label")
keys.append(val)
elem = driver.find_element_by_xpath(
'//*[@id="password_mainDiv"]/div[6]/a')
val = elem.get_attribute("aria-label")
keys.append(val)
elem = driver.find_element_by_xpath(
'//*[@id="password_mainDiv"]/div[7]/a')
val = elem.get_attribute("aria-label")
keys.append(val)
for x in range(1, 5):
elem = driver.find_element_by_xpath(
'//*[@id="password_mainDiv"]/div[8]/a['+str(x)+']')
val = elem.get_attribute("aria-label")
keys.append(val)
elem = driver.find_element_by_xpath(
'//*[@id="password_mainDiv"]/div[9]/a')
val = elem.get_attribute("aria-label")
keys.append(val)
# 리스트 아닌 인덱스 : 0-11 중 0,1,7,6
# //*[@id="password_mainDiv"]/div[4]/a # 3_2
# //*[@id="password_mainDiv"]/div[9]/a # 3_2
# print(keys)
elems = ['//*[@id="password_mainDiv"]/div[4]/a', '//*[@id="password_mainDiv"]/div[5]/a[1]', '//*[@id="password_mainDiv"]/div[5]/a[2]', '//*[@id="password_mainDiv"]/div[5]/a[3]', '//*[@id="password_mainDiv"]/div[5]/a[4]',
'//*[@id="password_mainDiv"]/div[6]/a', '//*[@id="password_mainDiv"]/div[7]/a', '//*[@id="password_mainDiv"]/div[8]/a[1]', '//*[@id="password_mainDiv"]/div[8]/a[2]', '//*[@id="password_mainDiv"]/div[8]/a[3]', '//*[@id="password_mainDiv"]/div[8]/a[4]', '//*[@id="password_mainDiv"]/div[9]/a']
# print(str(Your_Passes))
for Pass in Your_Passes:
if Pass == "\n":
pass
else:
index = keys.index(Pass)
driver.find_element_by_xpath(elems[index]).click()
time.sleep(0.5)
time.sleep(1)
state = '[자가진단] 비밀번호 입력'
driver.find_element_by_xpath(
'//*[@id="btnConfirm"]').click()
state = '[자가진단] 비밀번호 보내기 버튼 클릭'
driver.implicitly_wait(10)
Join_Error = False
while Join_Error == False:
try:
time.sleep(1)
driver.find_element_by_xpath(
'//*[@id="container"]/div/section[2]/div[2]/ul/li/a/em').click()
Join_Error = True
except:
driver.find_element_by_xpath(
'//*[@id="btnConfirm"]').click()
state = '[자가진단] 설문 시작'
time.sleep(1)
driver.find_element_by_xpath(
'//*[@id="container"]/div/div[2]/div[2]/div[2]/dl[1]/dd/ul/li[1]/label').click()
state = '[자가진단] 설문 1'
time.sleep(0.5)
driver.find_element_by_xpath(
'//*[@id="container"]/div/div[2]/div[2]/div[2]/dl[2]/dd/ul/li[1]/label').click()
state = '[자가진단] 설문 2'
time.sleep(0.5)
driver.find_element_by_xpath(
'//*[@id="container"]/div/div[2]/div[2]/div[2]/dl[3]/dd/ul/li[1]/label').click()
state = '[자가진단] 설문 3'
time.sleep(0.5)
driver.find_element_by_xpath(
'//*[@id="container"]/div/div[2]/div[2]/div[2]/dl[4]/dd/ul/li[1]/label').click()
time.sleep(0.5)
state = '[자가진단] 설문 5'
driver.find_element_by_xpath(
'//*[@id="btnConfirm"]').click()
state = '[자가진단] 설문 완료 버튼 클릭'
time.sleep(1)
driver.close()
print(" [자가진단] 사용자 "+Your_Name+"님의 자가진단이 정상적으로 마무리 되었습니다.")
break
except:
print('[오류]', str(state))
print('[오류]', '오류 발생으로 인해 사용자'+Your_Name+'님의 자가진단을 다시 시작합니다.')
print('[오류] 현', str(x)+'번째 반복중')
f.close() # 메모장 닫기
print(" [자가진단] "+str(today_date)+"일자, 모든 사용자의 자가진단이 종료되었습니다.")
print('')
print('')
schedule.every().day.at("07:00").do(job)
print('루프문 이전에 테스트를 시작합니다.')
job()
while True:
schedule.run_pending()
time.sleep(1)
'Python' 카테고리의 다른 글
[파이썬] zip, Unzip 함수 설명 (0) | 2021.12.04 |
---|---|
[파이썬] filter, map, lambda 함수 설명 (0) | 2021.12.03 |
[파이썬 모듈] 스케줄 모듈 schedule (0) | 2021.11.30 |
리눅스 백그라운드 파이썬 실행하는 법 (0) | 2021.11.29 |
[백준 2217] 로프 해설 및 풀이 (파이썬) (0) | 2021.11.27 |
@임채성 :: 푸르고 개발 블로그
글 내용 중 잘못되거나 이해되지 않는 부분은 댓글을 달아주세요! 감사합니다! 문의: puleugo@gmail.com