20231018/main.py

186 lines
4.4 KiB
Python
Raw Normal View History

2023-10-20 16:12:37 +08:00
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)