first commit
commit
ace49a7795
|
@ -0,0 +1,185 @@
|
|||
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)
|
|
@ -0,0 +1,3 @@
|
|||
Pillow==9.5.0
|
||||
selenium
|
||||
ddddocr
|
Loading…
Reference in New Issue