새로운 이벤트가 생겼다. 엑셀 파일로 온 명단의 주소를 업데이트하는 일이다.
총동창회에서는 매달 회보를 우편으로 발송하는데, DB 수정일자가 최신인 사람을 우선 순으로 발송하기 때문에 DB 수정일자가 오래된 사람은 발송을 원하는데도 받지 못하는 경우가 생긴다. 또 발송 신청을 하지 않았는데도 그 정보가 입력되지 않아 발송되는 경우도 있다.
이러한 상황이기 때문에 위처럼 엑셀 파일로 온 정보를 익스플로러 DB에 입력해 주어야 한다. 문제는 인원이 12,000명에 육박한다는 것이다. 역시 파이썬으로 매크로 프로그램을 만들기로 했다.
프로그램의 조건은 다음과 같다.
DB 주소 업데이트 프로그램 제작
1. 휴대폰 번호가 016, 017, 011... 으로 시작하거거나 발송구분이 '발송無'일 경우: 주소 구분을 '주소불명'으로 처리
2. 이외의 경우: '저장'버튼만 누름
1. 케이스 나누기
1. Case 01: SendCase
휴대폰 번호가 010으로 시작하면서+발송 구분이 '발송無'가 아닐 경우. SendCase일 경우에는 '저장'버튼만 누른다.
2. Case 02: SendNONOCase
SendCase가 아닐 경우. 이 경우 '주소 불명'처리를 해 줘야 한다.
2. 위치값 좌표 추출하기
import pyautogui
pyautogui.mouseInfo()
pyautogui 모듈의 mouseInfo()는 현재 마우스 커서가 가리키는 픽셀의 정보를 추출하는 함수이다. 이걸 사용해 필요한 좌표값을 저장한다.
3. Case별 함수 만들기
def is_010(numString):
subString=numString[0:2]
if(int(subString)==10):return True
else:return False
argument로 받은 000-0000-0000이 010으로 시작하는지 판단하는 함수. 010으로 시작할 경우 true를 반환하고 아닐 경우 false를 반환한다.
def sendNONO():
pyautogui.doubleClick(box_send)
pyautogui.typewrite("발송無")
발송무 처리를 하는 함수.
def searchStdnt(ID):
pyautogui.click(btn_search, duration=durSec)
pyautogui.click(box_ID, duration=durSec)
pyautogui.typewrite(ID)
pyautogui.doubleClick(box_student, duration=durSec)
argument로 받은 학번에 해당하는 학생을 검색해 창에 띄우는 함수.
def getPhoneNum():
pyautogui.click(box_phoneNum)
pyautogui.drag(-200, 0)
pyautogui.hotkey('ctrl','x')
pyautogui.hotkey('ctrl','v')
return(clipboard.paste())
동창회 DB가 ctrl+c는 막아놨는데 왜인지 ctrl+x는 안 막아놨다. 잘라내기 한 후 붙여넣기도 해 준다. clipboard 모듈의 paste()함수는 클립보드에 있는 내용을 뱉어내는 함수이다. 반대로 copy()는 인자로 받은 값을 클립보드에 복사해 넣는 함수이다.
iStream=open(isrc, 'r')
def getNextID():
return(iStream.readline())
def getCounter():
return(len(open(isrc, 'r').readlines()))
iStream을 함수 안에 집어 넣으면 스코프 문제가 생길 것 같아서 바깥에 iSteram을 불러와 줬다. 전역변수를 쓰려니 뭔가 찜찜하다. 다른 방법이 있을 텐데 잘 모르겠다.
def printRes(i, ID, phoneNum):
res="주소불명 처리"
if(is_010):res="날짜만 업데이트"
oStream.write("["+str(i)+"/"+str(getCounter())+"]\n"
+"학번: "+str(ID)+"\n"
+"휴대폰번호: "+str(phoneNum)+"\n"
+"처리: "+res+"\n\n")
print("["+str(i)+"/"+str(getCounter())+"]\n"
+"학번: "+str(ID)+"\n"
+"휴대폰번호: "+str(phoneNum)+"\n"
+"처리: "+res+"\n\n")
결과를 콘솔에도 치고 메모장 파일로도 출력하도록 했다.
def timeCal(timeS):
return((1+timeS)*getCounter())
남은 시간을 계산하는 함수. 기본적으로 1초 정도 걸린다고 치고 중간중간 sleep할 시간을 더했다. sleep할 시간은 사용자에게 입력받는다.
def StM(sec):
h:int=int(sec/3600)
sec:int=int(sec%3600)
m:int=int(sec/60)
sec:int=sec%60
print(str(h)+"시간 "+str(m)+"분 "+str(sec)+"초",end="")
초단위 시간을 시/분/초 단위로 바꾸는 함수. 세 개를 return하는 대신 그냥 출력하도록 했다.
4. 실행 코드 짜기
timeS=int(input("건 당 대기 간격을 입력하세요.\n[입력] "))
print("총 "+str(wholeCntr)+"건에 대한 업데이트를 진행합니다.\n예상 소요 시간은 ", end="")
StM(timeCalc(timeS))
print("입니다.")
time.sleep(2)
for(i) in range(wholeCntr):
time.sleep(timeS)
ID=getNextID()
searchStdnt(ID)
phoneNum=getPhoneNum()
flag010=True
flagSendYES=True
if(is_010(phoneNum)==False):
sendNONO()
flag010=False
else:
if(is_sendNONO()):
sendNONO()
flagSendYES=False
pyautogui.click(btn_save, duration=durSec)
pyautogui.press('enter')
pyautogui.press('enter')
printRes(i+1, ID, phoneNum, (flagSendYES==True)and(flag010==True))
실행 코드
'기타 프로젝트' 카테고리의 다른 글
[학식왕 김인하] 인하대학교 학식 메뉴 알리미 제작기(feat. AWS lambda, PDF 파일 파싱) (1) | 2023.11.05 |
---|---|
[AWS lambda] 1. lambda로 'Hello World!' 찍어보기 (0) | 2023.07.31 |
[해커네컷] 2. '찍을래' 기능 추가(1/2) (0) | 2023.07.25 |
[해커네컷] 1. 기존 코드 리팩토링 (0) | 2023.07.25 |
[파이썬] 총동창회 회원 DB 전화번호 자동 수정 프로그램 만들기 (0) | 2023.01.16 |