Codi que he utilitzat en Google Colab
!pip install flask-cors pyngrok google-generativeai beautifulsoup4 requests
import requests, time, threading
from bs4 import BeautifulSoup
from flask import Flask, request, jsonify
from flask_cors import CORS
from pyngrok import ngrok
from google.colab import userdata
import google.generativeai as genai
from urllib.parse import urljoin, urlparse
# — 1. CONFIGURACIÓ —
try:
API_KEY = userdata.get(‘GOOGLE_API_KEY’)
NGROK_TOKEN = userdata.get(‘token_ngrok’)
genai.configure(api_key=API_KEY)
ngrok.set_auth_token(NGROK_TOKEN)
model = genai.GenerativeModel(‘gemini-1.5-flash’)
except Exception as e:
print(f»❌ ERROR: {e}»)
app = Flask(__name__)
CORS(app)
# CONFIGURACIÓ DE WEBS
WEBS_A_RASTREJAR = [
«https://idiaz.inscastellbisbal.net»,
«https://iker-tu-web.github.io» # Posa aquí la teva web real
]
# Memòria del bot
base_de_dades_textual = «» # Inicialització de la variable
# {base_de_dades_textual[:1500]} # Aquesta línia ha estat comentada ja que no té una funció clara tal com estava
# — 2. EL MOTOR AUTOMÀTIC (BACKGROUND CRAWLER) —
def motor_actualitzacio_automatica():
global base_de_dades_textual
while True:
nova_base_dades = «»
print(f»\n🔄 [{time.strftime(‘%H:%M:%S’)}] Actualització automàtica en marxa…»)
for base_url in WEBS_A_RASTREJAR:
visitades = set()
per_visitar = [base_url]
domain = urlparse(base_url).netloc
while per_visitar and len(visitades) < 12:
url = per_visitar.pop(0)
if url in visitades: continue
try:
res = requests.get(url, timeout=5)
visitades.add(url)
soup = BeautifulSoup(res.text, 'html.parser')
for s in soup(["script", "style", "nav", "footer"]): s.extract()
text = soup.get_text(separator=' ', strip=True)
nova_base_dades += f"\n[FONT: {url}]\n{text}\n"
# Cerca automàtica de subpàgines
for link in soup.find_all('a', href=True):
full_url = urljoin(url, link['href'])
if urlparse(full_url).netloc == domain and full_url not in visitades:
per_visitar.append(full_url)
except: continue
base_de_dades_textual = nova_base_dades
print("✅ Coneixement sincronitzat. Propera actualització en 10 minuts.")
time.sleep(600) # S'actualitza sol cada 10 minuts (600 segons)
# --- 3. LÒGICA DE RESPOSTA ---
def consultar_ia(pregunta, nivell):
roles = {
"admin": "Ets l'Administrador. Respon amb dades precises i control total.",
"usuari": "Ets l'assistent per a alumnes. Sigues amable i ajuda amb les tasques.",
"visitant": "Ets un guia. Donar la benvinguda i explicar què hi ha als webs."
}
prompt = f"""
{roles.get(nivell, roles['visitant'])}
CONTEXT ACTUAL DELS WEBS:
{base_de_dades_textual[:28000]}
PREGUNTA: {pregunta}
Respon en català basant-te en el context. Si no ho saps, digues-ho.
"""
try:
response = model.generate_content(prompt)
return response.text
except Exception as e:
# Aquesta línia imprimirà l'error real a la consola de Google Colab
print(f"❌ ERROR DETECTAT: {e}")
# Aquesta és la resposta que veurà l'usuari al xat
return f"Ho sento, hi ha un error tècnic: {str(e)[:50]}..."
# --- 4. RUTES API ---
@app.route('/ask', methods=['POST'])
def ask():
data = request.json
resposta = consultar_ia(data.get("message", ""), data.get("level", "visitant"))
return jsonify({"reply": resposta})
# --- 5. ARRANCADA AUTOMÀTICA ---
if __name__ == '__main__':
# 1. Activem el motor de rastreig en un fil separat (background)
crawler_thread = threading.Thread(target=motor_actualitzacio_automatica, daemon=True)
crawler_thread.start()
# 2. Connectem Ngrok
ngrok.kill()
time.sleep(2)
public_url = ngrok.connect(5000).public_url
print("-" * 30)
print(f"🚀 SERVIDOR 100% AUTOMÀTIC")
print(f"🔗 URL GitHub: {public_url}/ask")
print(f"🤖 El bot s'actualitza sol cada 10 minuts.")
print("-" * 30)
app.run(port=5000)
