netgescon-master/scripts/ade-fe/estrazione_cf_ade_xml.py

194 lines
9.0 KiB
Python

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
import time
import json
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager
def naviga_e_scarica_fatture(parametri):
driver = None
try:
# Usa Microsoft Edge
driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))
driver.delete_all_cookies() # Pulisce i cookie prima di iniziare
driver.get(parametri["url_login"])
print(f"Navigazione alla pagina di login: {parametri['url_login']}")
# Autenticazione
fisconline_entratel_tab = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='#tab-4']")))
fisconline_entratel_tab.click()
print("Cliccato tab Fisconline/Entratel.")
with open("credenziali_ade.json", "r") as f:
credenziali = json.load(f)
username_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "username-fo-ent")))
username_input.send_keys(credenziali["username"])
username_input.send_keys(Keys.TAB)
print(f"Username inserito: {credenziali['username']}")
password_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "password-fo-ent")))
password_input.send_keys(credenziali["password"])
password_input.send_keys(Keys.TAB)
password_input.send_keys(Keys.TAB)
print("Password inserita.")
pin_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "pin-fo-ent")))
pin_input.send_keys(credenziali["pin"])
print("PIN inserito.")
time.sleep(2)
# Clicca il pulsante "Accedi" tramite form
form = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//form[@action='/sam/UI/Login?realm=/agenziaentrate&service=pin']")))
form.submit()
print("Pulsante 'Accedi' cliccato.")
print("Login effettuato con successo. Attesa input manuale...")
input("Premi Invio per continuare dopo aver selezionato l'utenza manualmente...")
# Naviga alla pagina "Cambia Utenza"
driver.get("https://portale.agenziaentrate.gov.it/PortaleWeb/cambiautenza")
print("Navigazione alla pagina 'Cambia Utenza'.")
# Selezione utenza
codice_fiscale_presente = False
for _ in range(5): # Prova 5 volte con attesa
if parametri["codice_fiscale_referente"] in driver.page_source:
codice_fiscale_presente = True
break
time.sleep(2) # Attendi 2 secondi prima di riprovare
if not codice_fiscale_presente:
print(f"Errore: codice fiscale '{parametri['codice_fiscale_referente']}' non trovato nella pagina.")
return False
print(f"Codice fiscale '{parametri['codice_fiscale_referente']}' trovato nella pagina.")
# Verifica pagina pronta
if not verifica_pagina_pronta(driver, parametri["codice_fiscale_referente"], parametri["codice_fiscale_condominio"]):
return False
# Verifica se l'elemento select utenza è presente
try:
utente_select = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "utenza")))
print("Elemento select utenza trovato.")
except Exception as e:
print(f"Errore: l'elemento select utenza non è presente: {e}")
return False
# Verifica che il codice fiscale sia presente nel testo dell'elemento user-info-data-container
try:
user_info_data_container = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "user-info-data-container")))
if parametri["codice_fiscale_referente"] not in user_info_data_container.text:
print(f"Errore: codice fiscale '{parametri['codice_fiscale_referente']}' non trovato nel container user-info-data.")
return False
print(f"Codice fiscale '{parametri['codice_fiscale_referente']}' trovato nel container user-info-data.")
# Verifica la presenza del codice fiscale del condominio
if parametri["codice_fiscale_condominio"] not in user_info_data_container.text:
print(f"Errore: codice fiscale condominio '{parametri['codice_fiscale_condominio']}' non trovato nel container user-info-data.")
return False
print(f"Codice fiscale condominio '{parametri['codice_fiscale_condominio']}' trovato nel container user-info-data.")
except Exception as e:
print(f"Errore durante la verifica del codice fiscale nel container user-info-data: {e}")
return False
# Selezione utenza con attesa maggiore e verifica della selezionabilità
try:
# Prova con Select class
utente_select = Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "utenza"))))
utente_select.select_by_value(parametri["codice_fiscale_referente"])
print(f"Utenza '{parametri['codice_fiscale_referente']}' selezionata con Select class.")
except Exception as e:
print(f"Errore durante la selezione con Select class: {e}")
try:
# Prova con JavaScript
driver.execute_script(f"document.getElementById('utenza').value = '{parametri['codice_fiscale_referente']}';")
print(f"Utenza '{parametri['codice_fiscale_referente']}' selezionata con JavaScript.")
time.sleep(2) # Aggiungi un'attesa di 2 secondi
except Exception as js_e:
print(f"Errore durante la selezione con JavaScript: {js_e}")
return False
# Attesa intervento manuale
input("Conferma manualmente il cambio di utenza e premi Invio...")
# Naviga alla sezione fatture
driver.get("https://portale.agenziaentrate.gov.it/PortaleWeb/servizi/accessoFatturazione")
print("Navigazione alla sezione fatture.")
# Verifica della sessione dopo l'intervento manuale
try:
WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//a[@href='/FattureWeb/fatture/elenco']")))
print("Sessione verificata dopo l'intervento manuale.")
except Exception as e:
print(f"Errore: Sessione non valida dopo l'intervento manuale: {e}")
return False
# Navigazione alla pagina delle fatture
fatturazione_link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='/PortaleWeb/servizi/accessoFatturazione']")))
print("link fatturazione elettronica trovato.")
fatturazione_link.click()
print("Accesso a 'Fatturazione elettronica'.")
time.sleep(2)
fatture_elettroniche_link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='/FattureWeb/fatture/elenco']")))
print("link fatture elettroniche trovato.")
fatture_elettroniche_link.click()
print("Accesso a 'Fatture Elettroniche'.")
time.sleep(2)
# A questo punto, dovremmo essere nella pagina delle fatture
print("Sei nella pagina delle fatture. Procedi manualmente con il download o dammi i riferimenti per automatizzare.")
input("Premi invio per terminare")
return True
except Exception as e:
print(f"Errore: {e}")
return False
finally:
if driver:
driver.quit()
def verifica_pagina_pronta(driver, codice_fiscale, codice_fiscale_condominio):
try:
# Verifica la presenza e la visibilità dell'elemento user-collapse
user_collapse_element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "user-collapse"))
)
print("Elemento user-collapse visibile.")
# Verifica la presenza del codice fiscale
codice_fiscale_element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, f"//p[contains(text(), '{codice_fiscale}')]"))
)
print(f"Codice fiscale '{codice_fiscale}' trovato.")
# verifica la presenza del link cambia utenza.
cambia_utenza_link = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, "//a[@href='/PortaleWeb/cambiautenza']"))
)
print("link cambia utenza trovato.")
return True
except Exception as e:
print(f"Errore: {e}")
return False
# Leggi i parametri dal file JSON
with open("parametri_fatture.json", "r") as f:
parametri = json.load(f)
if naviga_e_scarica_fatture(parametri):
print("Procedura completata.")
else:
print("Procedura fallita.")