Created
April 20, 2026 19:43
-
-
Save Anders87x/a40010a76c0d25d9953f9501baf60071 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from waitress import serve | |
| from flask import Flask, request, jsonify, render_template | |
| from flask_sqlalchemy import SQLAlchemy | |
| from datetime import datetime, timezone | |
| import json | |
| import os | |
| app = Flask(__name__) | |
| # Configuración BD SQLITE | |
| app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///metapython.db' | |
| app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False | |
| db = SQLAlchemy(app) | |
| # Modelo de la tabla Log | |
| class Log(db.Model): | |
| id = db.Column(db.Integer, primary_key=True) | |
| fecha_y_hora = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) | |
| texto = db.Column(db.Text, nullable=False) | |
| # Crear la tabla si no existe | |
| with app.app_context(): | |
| db.create_all() | |
| # Función para ordenar los registros por fecha y hora | |
| def ordenar_por_fecha_y_hora(registros): | |
| return sorted(registros, key=lambda x: x.fecha_y_hora, reverse=True) | |
| @app.route('/') | |
| def index(): | |
| registros = Log.query.all() | |
| registros_ordenados = ordenar_por_fecha_y_hora(registros) | |
| return render_template('index.html', registros=registros_ordenados) | |
| mensajes_log = [] | |
| # Función para agregar mensajes y guardar en la BD | |
| def agregar_mensajes_log(data): | |
| try: | |
| # Convertimos el JSON/dict a string | |
| texto_json = json.dumps(data, ensure_ascii=False, indent=2) | |
| mensajes_log.append(texto_json) | |
| nuevo_registro = Log(texto=texto_json) | |
| db.session.add(nuevo_registro) | |
| db.session.commit() | |
| print("Registro guardado correctamente en la BD", flush=True) | |
| except Exception as e: | |
| db.session.rollback() | |
| print(f"Error guardando en BD: {str(e)}", flush=True) | |
| raise | |
| # Token de verificación | |
| TOKEN_BRYAN = "p" | |
| @app.route('/webhook', methods=['GET', 'POST']) | |
| def webhook(): | |
| if request.method == 'GET': | |
| return verificar_token(request) | |
| elif request.method == 'POST': | |
| return recibir_mensajes(request) | |
| def verificar_token(req): | |
| mode = req.args.get('hub.mode') | |
| token = req.args.get('hub.verify_token') | |
| challenge = req.args.get('hub.challenge') | |
| if mode == 'subscribe' and token == TOKEN_BRYAN: | |
| print('WEBHOOK VERIFICADO', flush=True) | |
| return challenge, 200 | |
| else: | |
| return jsonify({'error': 'Token inválido'}), 401 | |
| def recibir_mensajes(req): | |
| try: | |
| data = req.get_json(silent=True) | |
| if data is None: | |
| print("No se recibió JSON válido", flush=True) | |
| return jsonify({'error': 'JSON inválido'}), 400 | |
| print("JSON recibido:", json.dumps(data, ensure_ascii=False, indent=2), flush=True) | |
| agregar_mensajes_log(data) | |
| return jsonify({'message': 'EVENT_RECEIVED'}), 200 | |
| except Exception as e: | |
| print(f"Error en webhook POST: {str(e)}", flush=True) | |
| return jsonify({'error': str(e)}), 500 | |
| if __name__ == '__main__': | |
| port = int(os.environ.get("PORT", 10000)) | |
| app.run(host='0.0.0.0', port=port, debug=True) | |
| # En producción: | |
| # serve(app, host='0.0.0.0', port=port) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment