본문 바로가기

기타 프로젝트

[파이썬] 총동창회 회원 DB 전화번호 자동 수정 프로그램 만들기

동창회 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(" 남았습니다.")
  • 번호 수정하는 작업을 전체 개수만큼 반복한다.

 

 

 

 

프로그램 실행