Пример #1
0
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
Пример #2
0
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)
Пример #3
0
    "정산기준일": "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]
Пример #4
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, {"교환관리": "교환완료"})
Пример #5
0
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)