Last active
October 13, 2023 03:12
-
-
Save CarlosRA97/12b95d0d524e8bb52cb54feccbb91774 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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("--------------------") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment