Add security
Browse files- app.py +20 -1
- campos/ine_actual.py +10 -7
- campos/ine_antes.py +12 -8
- conceptos_busqueda.py +7 -4
- documentos.py +12 -9
- funciones.py +6 -2
- herramientas.py +0 -3
- tools/ine_actual.py +4 -1
app.py
CHANGED
|
@@ -3,6 +3,22 @@ from io import BytesIO
|
|
| 3 |
from fastapi import FastAPI, Form
|
| 4 |
from fastapi import FastAPI, File, UploadFile
|
| 5 |
from fastapi.responses import StreamingResponse, JSONResponse
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
|
| 7 |
app = FastAPI()
|
| 8 |
|
|
@@ -23,7 +39,10 @@ async def health_check():
|
|
| 23 |
description="Test endpoint que recibe y regresa la misma imagen, para probar envío, recepción y problemas con api o red.",
|
| 24 |
summary="Summary"
|
| 25 |
)
|
| 26 |
-
async def echo_image(
|
|
|
|
|
|
|
|
|
|
| 27 |
if not image.content_type.startswith("image/"):
|
| 28 |
return {"error": "El archivo no es una imagen"}
|
| 29 |
contents = await image.read()
|
|
|
|
| 3 |
from fastapi import FastAPI, Form
|
| 4 |
from fastapi import FastAPI, File, UploadFile
|
| 5 |
from fastapi.responses import StreamingResponse, JSONResponse
|
| 6 |
+
from fastapi import FastAPI, Depends, HTTPException, status
|
| 7 |
+
from fastapi.security.api_key import APIKeyHeader
|
| 8 |
+
|
| 9 |
+
API_KEY = "tu_super_secreta_clave_de_api"
|
| 10 |
+
api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False)
|
| 11 |
+
|
| 12 |
+
async def get_api_key(api_key: str = Depends(api_key_header)):
|
| 13 |
+
if not api_key or api_key != API_KEY:
|
| 14 |
+
raise HTTPException(
|
| 15 |
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
| 16 |
+
detail="Credenciales de autenticación inválidas",
|
| 17 |
+
)
|
| 18 |
+
return api_key
|
| 19 |
+
|
| 20 |
+
#Y manda ésto en los headers:
|
| 21 |
+
#"X-API-Key": apiKey
|
| 22 |
|
| 23 |
app = FastAPI()
|
| 24 |
|
|
|
|
| 39 |
description="Test endpoint que recibe y regresa la misma imagen, para probar envío, recepción y problemas con api o red.",
|
| 40 |
summary="Summary"
|
| 41 |
)
|
| 42 |
+
async def echo_image(
|
| 43 |
+
image: UploadFile = File(...),
|
| 44 |
+
#api_key: str = Depends(get_api_key)
|
| 45 |
+
):
|
| 46 |
if not image.content_type.startswith("image/"):
|
| 47 |
return {"error": "El archivo no es una imagen"}
|
| 48 |
contents = await image.read()
|
campos/ine_actual.py
CHANGED
|
@@ -2,20 +2,23 @@ import herramientas
|
|
| 2 |
import tools.ine_actual as ine_actual_tools
|
| 3 |
import time
|
| 4 |
|
| 5 |
-
def vigencia(
|
| 6 |
|
| 7 |
conceptos_busqueda = [
|
| 8 |
{'preferida': 'vigencia', 'alternativas': ['igencia']},
|
| 9 |
]
|
| 10 |
|
| 11 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_limpios, conceptos_busqueda)
|
| 12 |
-
|
| 13 |
textos_extraidos_limpios = textos_extraidos_corregidos
|
| 14 |
-
|
|
|
|
|
|
|
| 15 |
|
| 16 |
-
|
| 17 |
-
print("Y su correspondiente texto es: " , texto_vigencia)
|
| 18 |
|
| 19 |
vigencia = ine_actual_tools.obtener_vigencia(indice, textos_extraidos_limpios)
|
| 20 |
-
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import tools.ine_actual as ine_actual_tools
|
| 3 |
import time
|
| 4 |
|
| 5 |
+
def vigencia(textos_extraidos_limpios):
|
| 6 |
|
| 7 |
conceptos_busqueda = [
|
| 8 |
{'preferida': 'vigencia', 'alternativas': ['igencia']},
|
| 9 |
]
|
| 10 |
|
| 11 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_limpios, conceptos_busqueda)
|
|
|
|
| 12 |
textos_extraidos_limpios = textos_extraidos_corregidos
|
| 13 |
+
|
| 14 |
+
if indice is None:
|
| 15 |
+
return None
|
| 16 |
|
| 17 |
+
print("El índice de vigencia es: ", indice)
|
|
|
|
| 18 |
|
| 19 |
vigencia = ine_actual_tools.obtener_vigencia(indice, textos_extraidos_limpios)
|
| 20 |
+
|
| 21 |
+
if vigencia is not None:
|
| 22 |
+
return vigencia
|
| 23 |
+
else:
|
| 24 |
+
return None
|
campos/ine_antes.py
CHANGED
|
@@ -1,20 +1,24 @@
|
|
| 1 |
import herramientas
|
| 2 |
import tools.ine_antes as ine_antes_tools
|
| 3 |
|
| 4 |
-
def vigencia(
|
| 5 |
|
| 6 |
conceptos_busqueda = [
|
| 7 |
-
{'preferida': 'vigencia', 'alternativas': ['igencia']},
|
| 8 |
]
|
| 9 |
|
| 10 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_limpios, conceptos_busqueda)
|
| 11 |
-
|
| 12 |
textos_extraidos_limpios = textos_extraidos_corregidos
|
| 13 |
-
print("El índice de genero es: ", indice)
|
| 14 |
|
| 15 |
-
|
| 16 |
-
|
| 17 |
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import herramientas
|
| 2 |
import tools.ine_antes as ine_antes_tools
|
| 3 |
|
| 4 |
+
def vigencia(textos_extraidos_limpios):
|
| 5 |
|
| 6 |
conceptos_busqueda = [
|
| 7 |
+
{'preferida': 'vigencia', 'alternativas': ['igencia', 'vigenca']},
|
| 8 |
]
|
| 9 |
|
| 10 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_limpios, conceptos_busqueda)
|
|
|
|
| 11 |
textos_extraidos_limpios = textos_extraidos_corregidos
|
|
|
|
| 12 |
|
| 13 |
+
if indice is None:
|
| 14 |
+
return None
|
| 15 |
|
| 16 |
+
print("El índice de genero es: ", indice)
|
| 17 |
+
texto = textos_extraidos_limpios[indice]
|
| 18 |
+
|
| 19 |
+
vigencia = ine_antes_tools.obtener_vigencia(texto)
|
| 20 |
|
| 21 |
+
if vigencia is not None:
|
| 22 |
+
return vigencia
|
| 23 |
+
else:
|
| 24 |
+
return None
|
conceptos_busqueda.py
CHANGED
|
@@ -8,7 +8,10 @@ pasaporte = [
|
|
| 8 |
#{'preferida': 'identidad', 'alternativas': []}
|
| 9 |
]
|
| 10 |
|
| 11 |
-
ine = [
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
#{'preferida': 'identidad', 'alternativas': []}
|
| 9 |
]
|
| 10 |
|
| 11 |
+
ine = [{
|
| 12 |
+
'preferida': 'Instituto Nacional Electoral',
|
| 13 |
+
#'alternativas': ['']
|
| 14 |
+
},
|
| 15 |
+
{'preferida': 'MEXICO',
|
| 16 |
+
#'alternativas': [''] #Cuando no hay altarnativas, tienen que ser comentadas.
|
| 17 |
+
}]
|
documentos.py
CHANGED
|
@@ -27,17 +27,20 @@ async def pasaporte(textos_extraidos, textos_extraidos_simplificados):
|
|
| 27 |
return nombre, apellido, identificacion
|
| 28 |
|
| 29 |
#Funciones para Zurich México
|
| 30 |
-
|
| 31 |
-
async def ine_actual(textos_extraidos, textos_extraidos_simplificados):
|
| 32 |
-
|
| 33 |
#Campos Buscados
|
| 34 |
-
vigencia = doc_ine_actual.vigencia(
|
| 35 |
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
-
async def ine_antes(
|
| 39 |
-
|
| 40 |
#Campos Buscados
|
| 41 |
-
vigencia = doc_ine_antes.vigencia(
|
| 42 |
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
return nombre, apellido, identificacion
|
| 28 |
|
| 29 |
#Funciones para Zurich México
|
| 30 |
+
async def ine_actual(textos_extraidos_simplificados):
|
|
|
|
|
|
|
| 31 |
#Campos Buscados
|
| 32 |
+
vigencia = doc_ine_actual.vigencia(textos_extraidos_simplificados)
|
| 33 |
|
| 34 |
+
if vigencia is None:
|
| 35 |
+
return "Vigencia no localizada"
|
| 36 |
+
else:
|
| 37 |
+
return vigencia
|
| 38 |
|
| 39 |
+
async def ine_antes(textos_extraidos_simplificados):
|
|
|
|
| 40 |
#Campos Buscados
|
| 41 |
+
vigencia = doc_ine_antes.vigencia(textos_extraidos_simplificados)
|
| 42 |
|
| 43 |
+
if vigencia is None:
|
| 44 |
+
return "Vigencia no localizada"
|
| 45 |
+
else:
|
| 46 |
+
return vigencia
|
funciones.py
CHANGED
|
@@ -72,9 +72,13 @@ async def procesa_ine(image):
|
|
| 72 |
tipo_ine = identificador.identifica_ine(textos_extraidos_simplificados)
|
| 73 |
print("Tipo ine es : ", tipo_ine)
|
| 74 |
if tipo_ine == 'ine_actual':
|
| 75 |
-
vigencia = await documentos.ine_actual(
|
| 76 |
else:
|
| 77 |
-
vigencia = await documentos.ine_antes(
|
| 78 |
return {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
"vigencia": vigencia,
|
| 80 |
}
|
|
|
|
| 72 |
tipo_ine = identificador.identifica_ine(textos_extraidos_simplificados)
|
| 73 |
print("Tipo ine es : ", tipo_ine)
|
| 74 |
if tipo_ine == 'ine_actual':
|
| 75 |
+
vigencia = await documentos.ine_actual(textos_extraidos_simplificados)
|
| 76 |
else:
|
| 77 |
+
vigencia = await documentos.ine_antes(textos_extraidos_simplificados)
|
| 78 |
return {
|
| 79 |
+
"nombre": "-----",
|
| 80 |
+
"domicilio": "-----",
|
| 81 |
+
"clave_elector": "-----",
|
| 82 |
+
"sexo": "-----",
|
| 83 |
"vigencia": vigencia,
|
| 84 |
}
|
herramientas.py
CHANGED
|
@@ -118,7 +118,6 @@ def buscaIndexMultiplesPalabras(arreglo_textos, conceptos_requeridos):
|
|
| 118 |
if forma in texto_linea_lower:
|
| 119 |
print("Encontrado línea es True!")
|
| 120 |
encontrado_en_esta_linea = True
|
| 121 |
-
time.sleep(7)
|
| 122 |
|
| 123 |
# Guardamos qué forma se encontró y cuál es la preferida
|
| 124 |
palabras_encontradas_en_linea[forma] = concepto['preferida']
|
|
@@ -127,11 +126,9 @@ def buscaIndexMultiplesPalabras(arreglo_textos, conceptos_requeridos):
|
|
| 127 |
# Hemos encontrado una forma para este concepto, pasamos al siguiente concepto
|
| 128 |
break #Éste break entonces si se sale del for. De no hacerlo, volvería arriba.
|
| 129 |
|
| 130 |
-
print("Paso if encontrado_en_esta_linea es True...")
|
| 131 |
if encontrado_en_esta_linea:
|
| 132 |
es_coincidencia_completa = True
|
| 133 |
print(f"Línea {i}: Concepto '{concepto['preferida']}' : Encontrado.")
|
| 134 |
-
print("Estoy por hacer break por que es_coincidencia_completa es True...")
|
| 135 |
break # Se sale del for grande.
|
| 136 |
|
| 137 |
|
|
|
|
| 118 |
if forma in texto_linea_lower:
|
| 119 |
print("Encontrado línea es True!")
|
| 120 |
encontrado_en_esta_linea = True
|
|
|
|
| 121 |
|
| 122 |
# Guardamos qué forma se encontró y cuál es la preferida
|
| 123 |
palabras_encontradas_en_linea[forma] = concepto['preferida']
|
|
|
|
| 126 |
# Hemos encontrado una forma para este concepto, pasamos al siguiente concepto
|
| 127 |
break #Éste break entonces si se sale del for. De no hacerlo, volvería arriba.
|
| 128 |
|
|
|
|
| 129 |
if encontrado_en_esta_linea:
|
| 130 |
es_coincidencia_completa = True
|
| 131 |
print(f"Línea {i}: Concepto '{concepto['preferida']}' : Encontrado.")
|
|
|
|
| 132 |
break # Se sale del for grande.
|
| 133 |
|
| 134 |
|
tools/ine_actual.py
CHANGED
|
@@ -11,4 +11,7 @@ def obtener_vigencia(indice, textos_extraidos_libres):
|
|
| 11 |
dato_vigencia = textos_extraidos_libres[indice+3]
|
| 12 |
print("El dato numérico de la vigencia es: " , dato_vigencia)
|
| 13 |
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
dato_vigencia = textos_extraidos_libres[indice+3]
|
| 12 |
print("El dato numérico de la vigencia es: " , dato_vigencia)
|
| 13 |
|
| 14 |
+
if dato_vigencia is not None:
|
| 15 |
+
return dato_vigencia
|
| 16 |
+
else:
|
| 17 |
+
return None
|