#!/usr/local/bin/python3 from datetime import datetime from mrz.checker.td1 import TD1CodeChecker from mrz.checker.td2 import TD2CodeChecker from mrz.checker.td3 import TD3CodeChecker import pyautogui import pygetwindow import time from getpass import getpass def parse_date(date: datetime): return datetime.strptime(date, "%y%m%d") def add_year(date: datetime, year: int): return datetime(date.year+year, date.month, date.day, date.hour, date.minute, date.second, date.microsecond, date.tzinfo) def print_relevant_info(relevant_info: list): print(str.join(" ",relevant_info)) def validity_years(birth_date: datetime): now = datetime.now() yo = now.year-birth_date.year years = 0 if (5 <= yo < 30): years = 5 elif (30 <= yo < 70): years = 10 return years def document_type_parse(document_type, country): if document_type == "ID" and country == "ESP": document_type = "D" elif document_type == "ID" and country != "ESP": document_type = "I" return document_type def relevant_info(fields): document_type = document_type_parse(fields.document_type, fields.country) birth_date = parse_date(fields.birth_date) expiry_date = parse_date(fields.expiry_date) validity_year = validity_years(birth_date) expiry_date = add_year(expiry_date, -validity_year) document_number = fields.document_number if fields.optional_data != "": document_number = fields.optional_data surname = fields.surname.split(" ") return [ document_type, document_number, expiry_date.strftime("%d%m%Y") ] + surname + [ fields.name, fields.sex, birth_date.strftime("%d%m%Y"), fields.nationality ] def clean_mrz_input(mrz: str): mrz = mrz.replace(";", "<") mrz = mrz.replace("\n", "") return mrz def mrz_parser(mrz: str): mrz = clean_mrz_input(mrz) if (len(mrz) == 3*30): # TD1 ID Cards mrz = mrz[0:30] + "\n" + mrz[30:60] + "\n" + mrz[60:90] check = TD1CodeChecker(mrz) if bool(check): fields = check.fields() return relevant_info(fields) elif (len(mrz) == 2*36): # TD2 mrz = mrz[0:36] + "\n" + mrz[36:36*2] check = TD2CodeChecker(mrz) if bool(check): fields = check.fields() return relevant_info(fields) elif (len(mrz) == 2*44): # TD3: Passports mrz = mrz[0:44] + "\n" + mrz[44:44*2] check = TD3CodeChecker(mrz) if bool(check): fields = check.fields() print(fields) return relevant_info(fields) else: print("Formato erroneo") return None return None def writer_format(info: list): new_info = info inserts = [2,5,-4,-3] for i in inserts: new_info.insert(i, ".") return new_info def activate(title: str, maximize = False): w = pygetwindow.getWindowsWithTitle(title)[0] if not w.isActive: w.activate() if maximize: w.maximize() def write_to_active_window(info: list): info = writer_format(info) info = str.join("",info) info = info.split(".") for d in info: pyautogui.write(d) pyautogui.press('tab') def save(info): today = str(datetime.now().strftime("%d%m%Y")) fileName = "C:/Users/torre/Desktop/FICHEROS POLICIA/DNIESCANEADO/Clientes-{}.txt".format(today) output = "{}\n{}\n{}".format( "\n----- Check-In: " + str(datetime.now().strftime("[%d/%m/%Y, %H:%M:%S]")) + " ------ ", str.join(" ",info), "-------------------------------------------\n" ) f = open(fileName, "a") f.write(output) f.close() add_line_x = 880 add_line_y = 620 print("Use el lector para escanear los documentos de identidad\n\n") print("Formato:\nTipo Doc. -- NÂșDoc -- Fec. Expiracion -- Apell. -- Nom. -- Sexo -- Fec. Nac. -- Nac") while True: mrz = getpass("") if (mrz == "q"): activate("K-HOTEL for Windows") exit() info = mrz_parser(mrz) if (info == None): continue save(info) activate("K-HOTEL for Windows", maximize=True) time.sleep(1) write_to_active_window(info) pyautogui.click(x=add_line_x, y=add_line_y, clicks=1, interval=0, button='left') time.sleep(1) activate("Lector Doc. Identidad") print("\n------ Cliente -----") print_relevant_info(info) print("--------------------")