Izan lecina webㅤㅤ‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎ ‎  

ChatBot Flotante
ChatBot

Creacio de Xat Bot backend

He fet un xatbot partint del codi:

# La primera vegada, desmarca la línia de sota per a instal·lar la biblioteca
# !pip install -U google-genai

from google import genai
from google.colab import userdata

# ==============================
# CONFIGURACIÓ DE L'API
# ==============================

# Configurar la clau API directament al client
GOOGLE_API_KEY = userdata.get("GOOGLE_API_KEY")

# Gestió d'errors si no s'ha configurat la clau API
if not GOOGLE_API_KEY:
    print("⚠️ No s'ha trobat la clau API. Configura-la a Colab abans d'executar el programa.")
    exit()

# Crear el client (NOU mètode de l'SDK 2.x)
client = genai.Client(api_key=GOOGLE_API_KEY)

# ==============================
# INSTRUCCIONS DEL SISTEMA
# ==============================

# Definir la instrucció del sistema per guiar el comportament del xat
# Aquesta instrucció determina la "personalitat" i el to de les respostes
system_instruction = """
Ets un assistent d'intel·ligència artificial dissenyat per ajudar els usuaris de manera clara, precisa i educada.
Proporciona respostes concretes i senzilles per facilitar la comprensió.
"""

# Crear una sessió de xat amb historial automàtic i instruccions personalitzades
chat = client.chats.create(
    model="gemini-2.0-flash",
    config=genai.types.GenerateContentConfig(
        system_instruction=system_instruction, # Afegim instruccions del sistema
        temperature=0.7,                      # Nivell de creativitat (0 = més concret, 1 = més creatiu)
        max_output_tokens=200                 # Longitud màxima de la resposta
    )
)

# ==============================
# BUCLE DEL XAT
# ==============================

print("\n💬 XatBot activat! Escriu 'sortir' per acabar la conversa.\n")

while True:
    try:
        # Llegir la pregunta de l'usuari
        prompt = input("👤 Usuari: ").strip()

        # Si l'usuari escriu 'sortir', finalitzar la sessió
        if prompt.lower() == "sortir":
            print("👋 XatBot: Fins aviat!")
            break

        # Enviar el missatge al model i obtenir la resposta
        resposta = chat.send_message(prompt)

        # Mostrar la resposta generada pel model
        print(f"🤖 XatBot: {resposta.text.strip()}\n")

    except Exception as e:
        # Gestionar qualsevol error de comunicació amb l'API
        print(f"⚠️ Error en la comunicació amb Gemini: {e}")

# ==============================
# FI DE LA SESSIÓ
# ==============================

He agregat una funcio de scraping per poder obtenir tota l’informacio de la web:

def obtener_info_web(url, visitadas=set(), profundidad=0, max_profundidad=2):
    print(f"Scraping página: {url}")

    # Evitar el scraping de páginas ya visitadas o si se alcanza la profundidad máxima
    if url in visitadas or profundidad >= max_profundidad:
        return ""

    try:
        # Realizar la solicitud HTTP
        respuesta = requests.get(url, timeout=10)
        respuesta.raise_for_status()  # Verificar si hay errores en la respuesta
        soup = BeautifulSoup(respuesta.text, "html.parser")
        visitadas.add(url)  # Marcar la URL como visitada

        # Extraer información de la página
        titulo = soup.title.string if soup.title else "Sin título"
        parrafos = [p.text for p in soup.find_all("p")]
        contenido = f"Título: {titulo}\nContenido: {' '.join(parrafos[:50])}"

        # Esperar antes de hacer nuevas solicitudes para evitar sobrecargar el servidor
        time.sleep(1)

        # Buscar enlaces internos y hacer scraping en ellos (evitar enlaces externos y duplicados)
        enlaces = [urljoin(url, a['href']) for a in soup.find_all('a', href=True)
                   if urljoin(url, a['href']).startswith("https://ilecina.inscastellbisbal.net")]

        for enlace in enlaces:
            if enlace not in visitadas:  # Solo visitar enlaces que no hayan sido procesados
                contenido += "\n" + obtener_info_web(enlace, visitadas, profundidad + 1, max_profundidad)

        return contenido

    except requests.exceptions.RequestException as e:
        return f"Error al obtener datos de la web: {e}"

 

I per la vinculacio a la web he cambiat el final del codi ” BUCLE DE XAT” per :

NGROK_AUTHTOKEN = userdata.get("NGROK")
ngrok.set_auth_token(NGROK_AUTHTOKEN)
public_url = ngrok.connect(5001)
print(f" * Servidor disponible en: {public_url}")

@app.route('/', methods=['POST'])
def obtenir_resposta():
    if request.method == "OPTIONS":
        return jsonify({"status": "ok"}), 200

    try:
        dades = request.get_json()
        if not dades or 'mensaje' not in dades:
            return jsonify({'error': 'Solicitud invàlida, falta "mensaje"'}), 400

        mensaje = dades['mensaje']
        # Imprimir el mensaje rebut als logs de Flask
        print(f"missatge rebut: {mensaje}")

        # Obtenir informació de tota la web
        info_web = obtenir_info_web("https://ilecina.inscastellbisbal.net")

        # Enviar mensaje al model amb la informació extraïda
        resposta = chat.send_message(f"{info_web}\n\nPregunta: {mensaje}")

        print(f"Resposta del model: {resposta.text.strip()}")

        return jsonify({'resposta': resposta.text.strip()}), 200
    except Exception as e:
        # Capturar qualsevol error i mostrar-lo als logs
        print(f"Error en processar la sol·licitud: {e}")
        return jsonify({'error': 'Error intern al servidor'}), 500

obtenir_info_web('https://ilecina.inscastellbisbal.net')

if __name__ == '__main__':
    app.run(port=5001)

 

GDPR Cookie Consent with Real Cookie Banner