
동창회 DB에는 휴대폰 번호를 입력하는 칸이 있다. 휴대폰 번호는 계속 바뀌므로 회원들의 바뀐 번호는 매번 엑셀 파일로 정리되어 들어온다.
문제는 수정할 번호가 만 개가 넘는다는 사실이다. 내가 처음 동창회에 입사했던 것도 이 업무를 맡기 위해서였다. 엑셀에 있는 학번과 번호를 복사해 붙여 넣는 간단한 작업을 모두 수동으로 하려니 비효율적이었다.
파이썬으로 매크로를 만들기로 했다.
프로젝트: 마우스를 자동 컨트롤해서 엑셀에 있는 학번과 번호를 웹사이트에 입력하는 프로그램
- 엑셀에 있는 학번과 번호는 메모장에 따로 붙여 넣는다
- 메모장에 붙여 넣은 학번과 번호는 파이썬 코드로 불러온다.
- 마우스를 컨트롤해서 알맞은 자리에 위치하게 한 후
- 현재 라인을 붙여넣는다.
- 역시 마우스를 컨트롤해서 회원 정보 저장 버튼을 누른다.
소스코드
import pyautogui
import time
import pyperclip
searchButton=(1053,385)
saveButton=(827,396)
IDSection=(837,422)
lookUpButton=(1264,400)
XButton=(1439,313)
thatStudentSection=(850,554)
phoneNumberSection_rightSide=(1041,750)
phoneNumberSection_leftSide=(789,734)
sayYesButton=(1043,623)
emptySection=(1045,665)
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="")
def goEmpty():
pyautogui.hotkey('ctrl','x')
pyautogui.click(emptySection)
pyautogui.hotkey('ctrl','v')
pyperclip.copy(" ")
###클릭하기###
def correctNum(ID, phoneNumber):
pyautogui.click(searchButton,duration=0.2)
pyautogui.click(IDSection,duration=1)
pyautogui.typewrite(ID)
pyautogui.click(lookUpButton,duration=0.2)
pyautogui.click(thatStudentSection,duration=0.2)
pyautogui.doubleClick(thatStudentSection)
time.sleep(3)
pyautogui.click(XButton,duration=0.2)
pyautogui.click(phoneNumberSection_rightSide)
pyautogui.mouseDown(phoneNumberSection_rightSide,duration=0.2)
pyautogui.move(-250,0)
pyautogui.mouseUp()
# goEmpty()
#pyautogui.click(phoneNumberSection_rightSide,duration=0.2)
pyautogui.typewrite(phoneNumber)
pyautogui.click(saveButton,duration=0.2)
pyautogui.click(sayYesButton,duration=0.5)
pyautogui.click(sayYesButton)
time.sleep(sleepS)
IDFile=open('/IDLists.txt','r')
phoneNumFile=open('/phoneNumList.txt','r')
#IDFile=open("./IDlists.txt", 'r')
#phoneNumFile=open("./phoneNumlist.txt", 'r')
counter=len(IDFile.readlines())
IDFile=open('//192.168.0.250/inha/3 작업중/동창회 DB 업데이트/연락처 입력 매크로/IDLists.txt','r')
#IDFile=open("./IDlists.txt", 'r')
sleepS=int(input("건 당 대기 간격을 입력하세요.\n[입력]"))
restTime=4.7+sleepS
print("총 "+str(counter)+"개의 연락처 업데이트를 진행합니다. \n")
StM(int(counter*restTime))
print("가 소요될 예정입니다.\n\n")
time.sleep(15)
wholeCounter=counter
for i in range(counter):
nowID=IDFile.readline().strip()
nowPhoneNum=phoneNumFile.readline().strip()
correctNum(nowID, nowPhoneNum)
print(str(wholeCounter)+"개 중 ", end="")
pyautogui.press('enter')
print(i+1,end="")
print("번째 완료했습니다. 약",end="")
StM(int((counter-i-1)*restTime))
print(" 남았습니다.")
- 전체 코드
import pyautogui
import time
import pyperclip
- pyautogui: 마우스와 키보드를 컨트롤할 수 있는 모듈
- time: time.sleep()처럼 시간을 조절할 수 있는 모듈
- paperclip: 클립보드와 코드를 연결해 주는 모듈
searchButton=(1053,385)
saveButton=(827,396)
IDSection=(837,422)
lookUpButton=(1264,400)
XButton=(1439,313)
thatStudentSection=(850,554)
phoneNumberSection_rightSide=(1041,750)
phoneNumberSection_leftSide=(789,734)
sayYesButton=(1043,623)
emptySection=(1045,665)
- 눌러야 할 버튼의 순서쌍을 변수로 지정해 준다.
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="")
- 초단위 시간을 시/분/초 단위로 바꿔 주는 함수
def goEmpty():
pyautogui.hotkey('ctrl','x')
pyautogui.click(emptySection)
pyautogui.hotkey('ctrl','v')
pyperclip.copy(" ")
- 원래 전화번호를 복사해서 비고란에 붙여넣는 함수
def correctNum(ID, phoneNumber):
pyautogui.click(searchButton,duration=0.2)
pyautogui.click(IDSection,duration=1)
pyautogui.typewrite(ID)
pyautogui.click(lookUpButton,duration=0.2)
pyautogui.click(thatStudentSection,duration=0.2)
pyautogui.doubleClick(thatStudentSection)
time.sleep(3)
pyautogui.click(XButton,duration=0.2)
pyautogui.click(phoneNumberSection_rightSide)
pyautogui.mouseDown(phoneNumberSection_rightSide,duration=0.2)
pyautogui.move(-250,0)
pyautogui.mouseUp()
# goEmpty()
#pyautogui.click(phoneNumberSection_rightSide,duration=0.2)
pyautogui.typewrite(phoneNumber)
pyautogui.click(saveButton,duration=0.2)
pyautogui.click(sayYesButton,duration=0.5)
pyautogui.click(sayYesButton)
time.sleep(sleepS)
- 학번과 전화번호를 argument로 받아 알맞은 버튼을 순서대로 누르는 함수. 마우스가 너무 휙휙 움직이면 안 눌리길래 duration으로 마우스를 천천히 움직이게 했다.
IDFile=open("./IDlists.txt", 'r')
phoneNumFile=open("./phoneNumlist.txt", 'r')
- ID와 휴대폰 번호를 입력해 둔 파일을 불러와 변수로 저장한다.
counter=len(IDFile.readlines())
IDFile=open('/IDLists.txt','r')
sleepS=int(input("건 당 대기 간격을 입력하세요.\n[입력]"))
restTime=4.7+sleepS
print("총 "+str(counter)+"개의 연락처 업데이트를 진행합니다. \n")
StM(int(counter*restTime))
print("가 소요될 예정입니다.\n\n")
- ID.readlines()를 len으로 받아서 총 몇 줄인지를 counter에 저장한다.
- IDFile을 이미 끝까지 다 읽었으므로 readline()으로 더 읽을 수 없다. 다시 open해서 저장한다.
- 건 당 대기시간을 입력받는다.
for i in range(counter):
nowID=IDFile.readline().strip()
nowPhoneNum=phoneNumFile.readline().strip()
correctNum(nowID, nowPhoneNum)
print(str(wholeCounter)+"개 중 ", end="")
pyautogui.press('enter')
print(i+1,end="")
print("번째 완료했습니다. 약",end="")
StM(int((counter-i-1)*restTime))
print(" 남았습니다.")
- 번호 수정하는 작업을 전체 개수만큼 반복한다.
프로그램 실행


'기타 프로젝트' 카테고리의 다른 글
| [학식왕 김인하] 인하대학교 학식 메뉴 알리미 제작기(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. 기존 코드 리팩토링 (1) | 2023.07.25 |
| [파이썬] 총동창회 회원 DB 주소 업데이트 프로그램 제작 (0) | 2023.01.20 |