def doProcess(driver, stores): # 0번 인덱스에 pid 존재 pid = stores[0] # pid 이후부터 스토어 리스트 존재 stores = stores[1:] # 모든 일감들에 대해서 for store in stores: store = store[0] flag = naver.moveStore(pid, driver, store) if not flag: continue # status -> 반품, 취소, 발주발송 for status in naver.data["url"][task]: # 사이트 이동이 된 후에 첫번째 취소관리로 넘어가야 정상 이동 가능해서 '스마트스토어센터가' 떳는지 확인 # WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, data["isLogin"]))) try: naver.log(pid, "{} {} 업무 시작".format(store, status)) naver.cancleAlert(pid, driver) flag = naver.canclePopup(pid, driver, task, store, status) if not flag: continue naver.delay(3) try: detailJob(pid, driver, store, status) except Exception as e: naver.adminLog.error("detailJob 에러 발생 | {}".format(e)) naver.cancleAlert(pid, driver) continue except Exception: naver.adminLog.error("{} {}에서 처리 안된 에러 발생".format(store, status)) naver.cancleAlert(pid, driver) continue
def detailJob(pid, driver, store, status): task = "{} {}".format(store, naver.data["statusList"][status]) try: naver.switchFrame(pid, driver) except Exception: naver.log(pid, "프레임 변경 불필요") try: #일별 정산내역 / 건별 정산내역 버튼 클릭 naver.processByXpath(pid, driver, {"xpath": naver.data[status]["moveButton"]}, "click", 5) naver.log(pid, "정산내역 이동 버튼 클릭 성공") except Exception as e: # 인식 안될 경우 앞에서 팝업창 때문에 홈페이지 이동이 안된 것이므로 작업 종료하고 다음 작업 진행 naver.storeExcept(pid, driver, task, "정산내역 이동 버튼 클릭 실패 | {}".format(e)) return naver.delay(3) # 정산완료일, 정산기준일만 상태 설정이 있음, 정산예정일은 없음 text = {"finish": "정산완료일", "standard": "정산기준일"} if status == "finish" or status == "standard": try: select = Select( WebDriverWait(driver, 10).until( EC.presence_of_element_located( (By.XPATH, naver.data[status]["processStatus"])))) naver.log(pid, "{} Select 칸 포커스 성공".format(text[status])) except Exception as e: naver.storeExcept(pid, driver, task, "{} Select 칸 포커스 실패".format(text[status])) return naver.delay(2) try: select.select_by_visible_text(text[status]) naver.log(pid, "{} 글자 선택 성공".format(text[status])) except Exception as e: naver.storeExcept(pid, driver, task, "{} 글자 선택 실패".format(text[status])) return common = 'react-datepicker__day--0' searchDate = {"start": "", "end": ""} searchDate["start"], searchDate["end"] = api.getLastDate() searchDate["start"] = '{}{}'.format(common, searchDate["start"].split('.')[2]) searchDate["end"] = '{}{}'.format(common, searchDate["end"].split('.')[2]) naver.log( pid, "시작일: {}, 종료일: {} 받아오기 성공".format(searchDate["start"], searchDate["end"])) #조회 시작일, 종료일 설정 idx = 0 for date in searchDate: try: objs = WebDriverWait(driver, 5).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, naver.data[status]["date"]))) objs[idx].click() naver.log(pid, "{} 날짜 칸 클래스로 클릭 성공".format(date)) idx += 1 except Exception as e: naver.doExcept(pid, store, driver, "{} 날짜 칸 클릭 실패: ".format(date), e) return naver.delay(3) try: obj = WebDriverWait(driver, 5).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, naver.data[status]["prev"]))) obj[0].click() naver.log(pid, "전월 버튼 클릭") except Exception as e: naver.doExcept(pid, store, driver, "전월 버튼 클릭 실패", e) return naver.delay(3) try: obj = WebDriverWait(driver, 5).until( EC.presence_of_all_elements_located( (By.CLASS_NAME, searchDate[date]))) naver.log( pid, "달력 중 주단위 클래스 오브젝트 클래스로 날짜칸 {} 인식 완료".format(searchDate[date])) except Exception as e: naver.doExcept( pid, store, driver, "달력 중 주단위 클래스 오브젝트 클래스로 날짜칸 {} 인식 불가".format(searchDate[date]), e) return naver.delay(3) try: if date == 'end': if len(obj) >= 2: obj[1].click() else: obj[0].click() elif date == 'start': obj[0].click() naver.log(pid, "{} 클릭 완료".format(searchDate[date])) except Exception as e: naver.doExcept(pid, store, driver, "{} 클릭 실패".format(searchDate[date]), e) return naver.delay(3) # 검색 버튼 클릭 flag = naver.searchData(pid, driver, task, naver.data[status]["search"]) if not flag: return naver.delay(3) try: # 데이터 검색 후 조회 내역의 두번째 컬럼이 인식되는지로 데이터 존재여부 확인 WebDriverWait(driver, 5).until( EC.presence_of_element_located( (By.XPATH, naver.data[status]["data"]))) except Exception: naver.log(pid, "{} 조회 결과 데이터가 존재하지 않음.".format(task)) return # 작업 폴더 비우기(파일 이름 변경 후 결과폴더로 이동해서 원래 폴더에는 파일이 없어야하는데 혹시라도 안지워진게 있으면 문제가 되서 한번더 폴더 안의 파일들 삭제) naver.initDir(pid) flag = naver.downloadExcel(pid, driver, task, naver.data[status]["download"]) if not flag: return limit = 60 path = "{}{}".format(downPath, pid) isDownOk = naver.downloadWait(pid, driver, task, store, limit, path, ["Settle"]) # 몇초 걸려서 기다렸는데도 경로에 파일이 다운되지 못한 경우 한번 더 체크 isDownOk = naver.downloadCheck(path, ["Settle"]) if isDownOk == -1: naver.storeExcept(pid, driver, task, "{} 파일이 다운로드 되지 못함".format(store)) return # 여기 오면 파일이 정상 다운된 상황 ["정산예정일", "정산완료일", "정산기준일"] fnameDict = {"Settle": ""} fnameDict["Settle"] = naver.data["statusList"][status] naver.moveFile(pid, driver, task, "{}{}".format(downPath, pid), downPath, store, fnameDict)
"정산기준일": "SettleStandard" } task = "naversettle" naver.mkdir(downPath, downPath_win, task, shop, dirs) # mkdir에서 할당된 다운 경로를 현재 파일 변수로 받아오는 작업 downPath = naver.downPath downPath_win = naver.downPath_win # 프로그램 시작 task_name = '네이버_{}_{}'.format(naver.data["task_name"][task], naver.data["shop"][shop]) bot_ip = api.get_ip() bot_id = naver.data["bot_id"][bot_ip] data = {'name': task_name, 'botId': bot_id, 'botIp': bot_ip, 'status': 'run'} try: naver.log(0, api.post_api(naver.task_status_url, data)) except Exception as e: naver.log(0, e) #################################################################################################################### # 각 스토어별 일처리 하는 함수 def doProcess(driver, stores): # 0번 인덱스에 pid 존재 pid = stores[0] # pid 이후부터 스토어 리스트 존재 stores = stores[1:] # 모든 일감들에 대해서 for store in stores: store = store[0]
def detailJob(pid, driver, store, status): task = "{} {}".format(store, naver.data["statusList"][status]) naver.switchFrame(pid, driver) #반품, 취소관리에만 완료 설정 진행 naver.delay(3) if status == "exchange" or "cancle" or status == "return": # 3개월 버튼 클릭 (반품, 취소는 3개월) try: naver.processByXpath(pid, driver, {"xpath": naver.data[status]["searchRange"]}, "click", 5) naver.log(pid, "3개월 버튼 클릭 성공") except Exception as e: naver.storeExcept(pid, driver, task, "3개월 버튼 클릭 실패 | {}".format(e)) # 인식 안될 경우 앞에서 팝업창 때문에 홈페이지 이동이 안된 것이므로 작업 종료하고 다음 작업 진행 return naver.delay(3) # 처리상태(반품완료, 취소완료) 선택 try: select = Select( WebDriverWait(driver, 10).until( EC.presence_of_element_located( (By.XPATH, naver.data[status]["processStatus"])))) naver.delay(2) select.select_by_visible_text(naver.data["statusList"][status]) naver.log(pid, "처리상태 버튼 클릭 성공") except Exception as e: naver.storeExcept(pid, driver, task, "처리상태 버튼 클릭 실패") return elif status == "delivery": try: select = Select( WebDriverWait(driver, 10).until( EC.presence_of_element_located( (By.XPATH, naver.data[status]["searchRange"])))) naver.delay(2) select.select_by_visible_text("발송처리일") naver.log(pid, "발송처리일 선택 성공") except Exception as e: naver.storeExcept(pid, driver, task, "발송처리일 선택 실패") return naver.delay(3) # 검색 버튼 클릭 flag = naver.searchData(pid, driver, task, naver.data[status]["search"]) if not flag: return cnt = 0 check = 0 while cnt < 6: naver.delay(1) # 조회 목록이 0이면 바로 다음작업 진행 try: # 정상적인 상황이면 무조건 인식이 되므로 명시적 지연시간 줘도 그만큼 소요 안됨, 인식 안되면 홈페이지 이상 obj = WebDriverWait(driver, 2).until( EC.presence_of_element_located( (By.XPATH, naver.data["dataCnt"]))) except Exception: naver.storeExcept(pid, driver, task, "조회 목록 인식 실패") return # 6초 전에 조회 결과 뜨면 딜레이 멈추고 진행 if obj.text != "0": check = int(obj.text) naver.log(pid, "조회목록 {}건 발생".format(obj.text)) break cnt += 1 # 다운할 양이 0건이면 다음작업 안하고 진행 if check == 0: naver.log(pid, "{} 다운 할 데이터 없음(0건)".format(task)) return # 리스트 0번에 뜰때까지 기다림 -> 타임아웃되면 너무 많아서 늦게뜬 경우임 -> 타임아웃이면 넘어감 try: naver.processByXpath(pid, driver, {"xpath": naver.data[status]["checkList"]}, "click", 10) naver.log(pid, "조회 항목 로딩 완료") except Exception: naver.storeExcept(pid, driver, task, "조회 항목 로딩이 지연돼 다운 불가(10초 초과)") return # 조회목록이 존재하면 폴더 비우고 엑셀 다운 naver.delay(2) # 작업 폴더 비우기(파일 이름 변경 후 결과폴더로 이동해서 원래 폴더에는 파일이 없어야하는데 혹시라도 안지워진게 있으면 문제가 되서 한번더 폴더 안의 파일들 삭제) naver.initDir(pid) flag = naver.downloadExcel(pid, driver, task, naver.data[status]["download"]) if not flag: return limit = 60 path = "{}{}".format(downPath, pid) isDownOk = naver.downloadWait(pid, driver, task, store, limit, path, ["스마트"]) # 다운로드 된 파일의 행 수가 스마트스토어 홈페이지의 조회된 데이터 수와 다르면 수기작업 기재 if isDownOk != check: naver.log( pid, "다운받은 파일의 행 수: {}, 홈페이지 조회된 데이터 수: {}로 상이하여 수기작업 필요!".format( isDownOk, check)) # 작업 폴더 비우기(데이터 누락된 파일이므로 그냥 삭제) naver.initDir(pid) naver.storeExcept(pid, driver, task, "{} 다운받은 파일이 데이터 건수가 홈페이지와 상이함".format(store)) return # 몇초 걸려서 기다렸는데도 경로에 파일이 다운되지 못한 경우 한번 더 체크 isDownOk = naver.downloadCheck(path, ["스마트"]) if isDownOk == -1: naver.storeExcept(pid, driver, task, "{} 파일이 다운로드 되지 못함".format(store)) return # 여기 오면 파일이 정상 다운된 상황 naver.moveFile(pid, driver, task, "{}{}".format(downPath, pid), downPath, store, {"교환관리": "교환완료"})
def detailJob(pid, driver, store, status): # ["구매확정일", "결제일"] jobs = naver.data["statusList"][status] for jobname in jobs: naver.log(pid, "{} {} 업무 시작".format(store, jobname)) # 팝업창 제거 하면서 작업 링크로 이동, 한 화면에서 설정만 바뀌지만 사이트를 재접속하지 않으면 크롬에서 파일을 중복해서 다운로드 받을지 물어보면서 다운로드 되지 않기 때문에 강제 이동 flag = naver.canclePopup(pid, driver, task, store, status) if not flag: continue job = "{} {}".format(store, jobname) #홈페이지 이동 후 딜레이를 준 후에 프레임을 변경해야 정상 적용됨! naver.delay(3) naver.switchFrame(pid, driver) naver.delay(3) try: select = Select(WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,naver.data[status]["processStatus"])))) naver.delay(2) select.select_by_visible_text(jobname) naver.log(pid, "{} 선택 성공".format(jobname)) except Exception as e: naver.storeExcept(pid, driver, job, "{} 선택 실패 | {}".format(jobname, e)) continue naver.delay(3) # 검색 버튼 클릭 flag = naver.searchData(pid, driver, job, naver.data[status]["search"]) if not flag: continue cnt = 0 check = 0 checkList = True while cnt < 6: naver.delay(1) # 조회 목록이 0이면 바로 다음작업 진행 try: # 정상적인 상황이면 무조건 인식이 되므로 명시적 지연시간 줘도 그만큼 소요 안됨, 인식 안되면 홈페이지 이상 obj = WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.XPATH, naver.data["dataCnt"]))) except Exception: naver.storeExcept(pid, driver, job, "조회 목록 인식 실패") checkList = False break # 6초 전에 조회 결과 뜨면 딜레이 멈추고 진행 if obj.text != "0": check = int(obj.text) naver.log(pid, "조회목록 {}건 발생".format(obj.text)) break cnt += 1 if checkList == False: continue # 다운할 양이 0건이면 다음작업 안하고 진행 if check == 0: naver.log(pid, "{} 다운 할 데이터 없음(0건)".format(job)) continue # 리스트 0번에 뜰때까지 기다림 -> 타임아웃되면 너무 많아서 늦게뜬 경우임 -> 타임아웃이면 넘어감 try: naver.processByXpath(pid, driver, {"xpath":naver.data[status]["checkList"]}, "click", 10) naver.log(pid, "조회 항목 로딩 완료") except Exception: naver.storeExcept(pid, driver, job, "조회 항목 로딩이 지연돼 다운 불가(10초 초과)") continue # 조회목록이 존재하면 폴더 비우고 엑셀 다운 naver.delay(2) # 작업 폴더 비우기(파일 이름 변경 후 결과폴더로 이동해서 원래 폴더에는 파일이 없어야하는데 혹시라도 안지워진게 있으면 문제가 되서 한번더 폴더 안의 파일들 삭제) naver.initDir(pid) flag = naver.downloadExcel(pid, driver, job, naver.data[status]["download"]) if not flag: continue limit = 60 path = "{}{}".format(downPath, pid) isDownOk = naver.downloadWait(pid, driver, job, store, limit, path, ["스마트"]) # 다운로드 된 파일의 행 수가 스마트스토어 홈페이지의 조회된 데이터 수와 다르면 수기작업 기재 if isDownOk != check: naver.log(pid, "다운받은 파일의 행 수: {}, 홈페이지 조회된 데이터 수: {}로 상이하여 수기작업 필요!".format(isDownOk, check)) # 작업 폴더 비우기(데이터 누락된 파일이므로 그냥 삭제) naver.initDir(pid) naver.storeExcept(pid, driver, job, "{} 다운받은 파일이 데이터 건수가 홈페이지와 상이함".format(store)) continue # 몇초 걸려서 기다렸는데도 경로에 파일이 다운되지 못한 경우 한번 더 체크 isDownOk = naver.downloadCheck(path, ["스마트"]) if isDownOk == -1: naver.storeExcept(pid, driver, job, "{} 파일이 다운로드 되지 못함".format(store)) continue # 여기 오면 파일이 정상 다운된 상황 fnameDict = {"구매확정":""} fnameDict["구매확정"] = jobname naver.moveFile(pid, driver, job, "{}{}".format(downPath, pid), downPath, store, fnameDict)