from PIL import Image import platform from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import Select from selenium.webdriver.common.action_chains import ActionChains import time import ddddocr import sys from openpyxl import load_workbook def pic_ocr(path: str): ocr = ddddocr.DdddOcr() with open(path, 'rb') as f: img_bytes = f.read() res = ocr.classification(img_bytes) return res def start(): # 開始進入作業流程 options = Options() options.add_argument("--disable-notifications") try: return webdriver.Chrome('./chromedriver', chrome_options=options) except WebDriverException as ex: if 'Chrome version must be' in str(ex): print('Chrome 驅動版本不支援,請更新 Chrome (%s)' % ex) else: print('Chrome 驅動出錯 (%s)' % ex) sys.exit(1) def download_captcha(driver): # 驗證碼坐標 captcha = driver.find_element(By.ID, 'checkCode2') driver.get_screenshot_as_file("captcha.png") location = captcha.location # 驗證碼圖片位置 size = captcha.size # 驗證碼圖片大小 # 截圖高度調整 x = 900 y = 1138 width = size['width'] height = size['height'] x1 = x y1 = y x2 = x + width+130 y2 = y + height+30 # 透過坐標截圖 screenshot = Image.open('captcha.png') screenshot = screenshot.convert('RGB') captcha_photo = screenshot.crop((x1, y1, x2, y2)) captcha_photo.save('captcha.jpg', 'JPEG') def is_login_success(driver): # 檢查是否進入修改畫面 page_source_code = driver.page_source if page_source_code.find('圖形驗證碼錯誤') == -1: return True return False def is_change_pwd(driver): # 檢查是否成功更改密碼 page_source_code = driver.page_source if page_source_code.find('密碼更新完成') == -1: return True return False def login(driver, id, pwd): # 統一編號 ban = driver.find_elements(By.NAME, 'BAN') ban[1].send_keys(id) # 申報密碼 pw = driver.find_element(By.NAME, 'PW') pw.send_keys(pwd) # 圖形驗證碼 download_captcha(driver) captcha = pic_ocr('./captcha.jpg') print(f'驗證碼:{captcha}') pw = driver.find_element(By.ID, 'captcha2') pw.send_keys(captcha) pw.send_keys(Keys.ENTER) def change_pwd(driver, new_pwd, old_pwd): # 新密碼 pw1 = driver.find_element(By.ID, 'PW1') pw1.send_keys(new_pwd) # 新密碼確認 pw2 = driver.find_element(By.ID, 'PW2') pw2.send_keys(new_pwd) # 新密碼確認 pw3 = driver.find_element(By.ID, 'PW3') pw3.send_keys(old_pwd) # 確定 enter = driver.find_element(By.NAME, 'B1') enter.click() time.sleep(3) con_enter = driver.find_element( By.XPATH, '/html/body/div[2]/div/div/div[2]/button[2]') con_enter.click() data = { '統一編號': None, '密碼': None, '暫時密碼': None } url = 'https://svc.tax.nat.gov.tw/svc/fchoice.jsp' change_password_url = 'https://svc.tax.nat.gov.tw/svc/PwApplyUpdatePw.jsp' # 讀取 Excel 檔案 filename = '密碼變更.xlsx' wb = load_workbook(filename, read_only=False) sheet = wb[wb.active.title] # 讀取Excel內容 for row in sheet.iter_rows(min_row=2, max_col=3, max_row=10): # 導入資料 keysList = [key for key in data] for i, cell in enumerate(row): row_num = cell.row data[keysList[i]] = cell.value print(data['統一編號']) print(data['密碼']) print(data['暫時密碼']) if data['統一編號'] == None: break driver = start() driver.get(url) login(driver, data['統一編號'], data['密碼']) time.sleep(3) if is_login_success(driver): driver.get(change_password_url) else: print('進入失敗') time.sleep(3) change_pwd(driver, data['暫時密碼'], data['密碼']) time.sleep(3) # 前往首頁 driver.get(url) login(driver, data['統一編號'], data['暫時密碼']) if is_login_success(driver): driver.get(change_password_url) else: print('進入失敗') change_pwd(driver, data['密碼'], data['暫時密碼']) driver.close() print(f"{data['統一編號']}已更新成功") time.sleep(10)