Spaces:
Runtime error
Runtime error
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
%writefile app.py
|
| 2 |
+
import os
|
| 3 |
+
import csv
|
| 4 |
+
from datetime import datetime
|
| 5 |
+
import gradio as gr
|
| 6 |
+
import google.generativeai as genai
|
| 7 |
+
|
| 8 |
+
# --- Configuración de la API de Gemini para Hugging Face Spaces ---
|
| 9 |
+
# Asegúrate de añadir GOOGLE_API_KEY como un secreto en tu Space de Hugging Face
|
| 10 |
+
GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY')
|
| 11 |
+
|
| 12 |
+
if GOOGLE_API_KEY:
|
| 13 |
+
genai.configure(api_key=GOOGLE_API_KEY)
|
| 14 |
+
gemini_model = genai.GenerativeModel('gemini-pro')
|
| 15 |
+
print("Modelo de Gemini inicializado correctamente.")
|
| 16 |
+
else:
|
| 17 |
+
print("Advertencia: La clave GOOGLE_API_KEY no está configurada. La evaluación de Gemini no estará disponible.")
|
| 18 |
+
gemini_model = None # Para evitar errores si la clave no está presente
|
| 19 |
+
|
| 20 |
+
# Definir el nombre del archivo CSV donde se guardarán los resultados
|
| 21 |
+
ARCHIVO_CSV = "resultados_encuesta.csv"
|
| 22 |
+
|
| 23 |
+
def encuesta_preguntas_de_seguridad(
|
| 24 |
+
p1_respuesta, p2_respuesta, p3_respuesta, p4_respuesta, p5_respuesta,
|
| 25 |
+
p6_respuesta, p7_respuesta, p8_respuesta, p9_respuesta, p10_respuesta
|
| 26 |
+
):
|
| 27 |
+
puntaje = 0
|
| 28 |
+
if p1_respuesta == "Sí":
|
| 29 |
+
puntaje += 1
|
| 30 |
+
if p2_respuesta == "Sí":
|
| 31 |
+
puntaje += 1
|
| 32 |
+
if p3_respuesta == "Sí":
|
| 33 |
+
puntaje += 1
|
| 34 |
+
if p4_respuesta == "Sí":
|
| 35 |
+
puntaje += 1
|
| 36 |
+
if p5_respuesta == "Sí":
|
| 37 |
+
puntaje += 1
|
| 38 |
+
if p6_respuesta == "Sí":
|
| 39 |
+
puntaje += 1
|
| 40 |
+
if p7_respuesta == "Sí":
|
| 41 |
+
puntaje += 1
|
| 42 |
+
if p8_respuesta == "Sí":
|
| 43 |
+
puntaje += 1
|
| 44 |
+
if p9_respuesta == "Sí":
|
| 45 |
+
puntaje += 1
|
| 46 |
+
if p10_respuesta == "Sí":
|
| 47 |
+
puntaje += 1
|
| 48 |
+
|
| 49 |
+
evaluacion_gemini = "No se pudo generar una evaluación detallada."
|
| 50 |
+
if gemini_model:
|
| 51 |
+
prompt = f"El usuario obtuvo un puntaje de {puntaje} sobre 10 en una encuesta de seguridad digital. Genera una evaluación concisa y personalizada sobre su nivel de seguridad, incluyendo recomendaciones específicas para mejorar, si es necesario. Enfócate en un tono motivador y educativo."
|
| 52 |
+
try:
|
| 53 |
+
response = gemini_model.generate_content(prompt)
|
| 54 |
+
evaluacion_gemini = response.text
|
| 55 |
+
except Exception as e:
|
| 56 |
+
evaluacion_gemini = f"No se pudo generar una evaluación detallada con Gemini (Error: {e})."
|
| 57 |
+
|
| 58 |
+
# Guardado directo en el archivo CSV local de forma anónima
|
| 59 |
+
fecha_actual = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
| 60 |
+
with open(ARCHIVO_CSV, mode='a', newline='', encoding='utf-8') as f:
|
| 61 |
+
csv.writer(f).writerow([
|
| 62 |
+
fecha_actual, p1_respuesta, p2_respuesta, p3_respuesta, p4_respuesta, p5_respuesta,
|
| 63 |
+
p6_respuesta, p7_respuesta, p8_respuesta, p9_respuesta, p10_respuesta, f"{puntaje}/10"
|
| 64 |
+
])
|
| 65 |
+
print(f"\n Guardado en el almacenamiento local ({fecha_actual}). Puntaje: {puntaje}/10")
|
| 66 |
+
|
| 67 |
+
# Lo que ve el usuario en su teléfono
|
| 68 |
+
resultado_final = f"Tu puntuación total es: {puntaje} / 10\n\nEvaluación de Seguridad Digital:\n{evaluacion_gemini}"
|
| 69 |
+
return resultado_final
|
| 70 |
+
|
| 71 |
+
# --- INTERFAZ GRÁFICA WEB ---
|
| 72 |
+
opciones = ["Sí", "No"]
|
| 73 |
+
introduccion_texto = (
|
| 74 |
+
"Escanear un código QR parece algo seguro y cotidiano, pero muchas veces puede llevarnos a sitios falsos o engañosos sin que lo notemos. Esta actividad busca demostrar lo fácil que es caer en un engaño digital y la importancia de verificar antes de escanear cualquier código QR."
|
| 75 |
+
"hola mi nombre es evelyn lorena espinoza olivo de la especialidad de ciberseguridad 2A, el codigo lo creamos para ver que tanto puedes confiar en engaños o escanear codigos QR sin saber que es lo que puede llegar a contener"
|
| 76 |
+
)
|
| 77 |
+
|
| 78 |
+
interfaz = gr.Interface(
|
| 79 |
+
fn=encuesta_preguntas_de_seguridad,
|
| 80 |
+
inputs=[
|
| 81 |
+
gr.Radio(opciones, label="1. Uso de contraseñas seguras y diferentes en cada cuenta o correo:"),
|
| 82 |
+
gr.Radio(opciones, label="2. Tengo activada la verificación en dos pasos:"),
|
| 83 |
+
gr.Radio(opciones, label="3. Reviso los permisos de las aplicaciones antes instaladas:"),
|
| 84 |
+
gr.Radio(opciones, label="4. Configuro adecuadamente la privacidad en mis redes sociales:"),
|
| 85 |
+
gr.Radio(opciones, label="5. Realizo respaldos periódicos de información importante: "),
|
| 86 |
+
gr.Radio(opciones, label="6. Actualizo mis contraseñas de manera regular, al menos cada 6 meses: "),
|
| 87 |
+
gr.Radio(opciones, label="7. Evito conectarme a redes wifi públicas para acceder a bancos en línea y operaciones financieras sencillas: "),
|
| 88 |
+
gr.Radio(opciones, label="8. Mantengo mi sistema operativo y aplicaciones actualizadas:"),
|
| 89 |
+
gr.Radio(opciones, label="9. No comparto información personal sensible (INE, dirección, ubicación) en sitios no confiables: "),
|
| 90 |
+
gr.Radio(opciones, label="10. Uso antivirus y herramientas de seguridad en mis dispositivos:")
|
| 91 |
+
],
|
| 92 |
+
outputs=gr.Textbox(label="Resultado de tu Evaluación:"),
|
| 93 |
+
title="Encuesta de Seguridad Informática",
|
| 94 |
+
description=introduccion_texto
|
| 95 |
+
)
|
| 96 |
+
|
| 97 |
+
# --- LANZAMIENTO DEL INTERFAZ DE GRADIO ---
|
| 98 |
+
# En Hugging Face Spaces, no necesitas especificar 'share=True',
|
| 99 |
+
# ya que la URL pública se gestiona automáticamente.
|
| 100 |
+
# Esta línea iniciará la aplicación Gradio cuando el script se ejecute.
|
| 101 |
+
interfaz.launch(server_name="0.0.0.0", server_port=0)
|