Skip to content

Instantly share code, notes, and snippets.

@CarlosRA97
Last active October 13, 2023 03:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CarlosRA97/12b95d0d524e8bb52cb54feccbb91774 to your computer and use it in GitHub Desktop.
Save CarlosRA97/12b95d0d524e8bb52cb54feccbb91774 to your computer and use it in GitHub Desktop.
#!/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