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
|