#!/usr/bin/env python # -*- coding: utf-8 -*- # --------------------------- # 🔧 CONFIGURAR SWISSEPH # --------------------------- import os import swisseph as swe # Ruta donde están tus efemérides dentro del contenedor # ----------------------------------------------------------- # CONFIGURAR RUTA DE EFEMÉRIDES PARA SWISSEPH # ----------------------------------------------------------- # MUY IMPORTANTE: esta carpeta debe existir en el contenedor # y debe contener archivos como: # seas_18.se1 # seas_18.se2 # ... EPHE_PATH = "/app/ephemeris" # 1) Configurar ANTES que flatlib swe.set_ephe_path(EPHE_PATH) os.environ["SWEPH_PATH"] = EPHE_PATH # --------------------------- # 📦 IMPORTAR FLATLIB # --------------------------- from flatlib.chart import Chart from flatlib.datetime import Datetime from flatlib.geopos import GeoPos from flatlib import const # Algunos sistemas necesitan esto porque flatlib pisa la ruta: swe.set_ephe_path(EPHE_PATH) # --------------------------- # 🌐 IMPORTAR FASTAPI # --------------------------- from fastapi import FastAPI, Query from urllib.parse import quote # ------------------------- # Función principal Nut # ------------------------- def Nut(datos: str) -> str: # Limpiar el comando y separar líneas datos = datos.split(sep='|') # Validar que haya 5 líneas if len(datos) != 5: return f"{len(datos)} => {datos[0]} = {datos[-1]} Error: se esperan 5 líneas de datos (fecha, hora, zona horaria, latitud, longitud)" # Crear fecha y posición date = Datetime(datos[0], datos[1], datos[2]) pos = GeoPos(datos[3], datos[4]) #-------------------------------------------------------- ''' pip uninstall pyswisspeh Found existing installation: pyswisseph 2.8.0.post0 Uninstalling pyswisseph-2.8. pip install pyswisseph==2 Pero Pyswisseph == 2.00.00-2 no se puede instalar en sistemas win10. Este error aparecerá: Solo se puede instalar pyswisseph-2.8.0 en Finalmente descubrí cómo hacer que el módulo funcione en Windows. tenemos que usar un archivo de rueda binario de Windows no oficial de ' https://www.lfd.uci.edu/~gohlke/pythonlibs/ '. hay diferentes ruedas para diferentes versiones de Python y actualizaciones del módulo. Usé: pyswisseph ‑ 2.5.1.post0 ‑ cp37 ‑ cp37m ‑ win_amd64.whl. use la rueda que se adapte a su versión de python / windows Solución: todo lo que tiene que hacer es abrir la ventana de comandos, escribir 'pip install pyswisseph ‑ 2.5.1.post0 ‑ cp37 ‑ cp37m ‑ win_amd64.whl' y se instala. ''' #------------------------------------------------ # Build a chart with Regiomontanus houses chart = Chart(date, pos, hsys=const.HOUSES_EQUAL) # Build a chart including modern planets chart = Chart(date, pos, IDs=const.LIST_OBJECTS) # Obtener casas house1 = chart.get(const.HOUSE1) # Ascendente house2 = chart.get(const.HOUSE2) house3 = chart.get(const.HOUSE3) house4 = chart.get(const.HOUSE4) house5 = chart.get(const.HOUSE5) house6 = chart.get(const.HOUSE6) house10 = chart.get(const.HOUSE10) # Medio cielo # Obtener planetas principales Sun = chart.get(const.SUN) Moon = chart.get(const.MOON) Mercury = chart.get(const.MERCURY) Venus = chart.get(const.VENUS) Mars = chart.get(const.MARS) Jupiter = chart.get(const.JUPITER) Saturn = chart.get(const.SATURN) Uranus = chart.get(const.URANUS) Neptune = chart.get(const.NEPTUNE) Pluto = chart.get(const.PLUTO) North_Node = chart.get(const.NORTH_NODE) South_Node = chart.get(const.SOUTH_NODE) Syzygy = chart.get(const.SYZYGY) Pars_Fortuna = chart.get(const.PARS_FORTUNA) ''' Algenib = chart.getFixedStar(const.STAR_ALGENIB) Alpheratz = chart.getFixedStar(const.STAR_ALPHERATZ) Algol = chart.getFixedStar(const.STAR_ALGOL) ... # Aquí estaban tus comentarios de estrellas fijas ''' # Construir URL de forma segura url = ( "https://horoscopes.astro-seek.com/horoscope-chart1-700__radix_ClanNot.png?" # ------------------------------------------------- # Configuración de asteroides y nodos "chiron_seda=1" # Mostrar Chiron en color "&lilith_seda=1" # Mostrar Lilith en color "&chiron_asp=1" # Mostrar aspectos de Chiron "&lilith_asp=1" # Mostrar aspectos de Lilith "&uzel_asp=1" # Mostrar aspectos de nodo norte "&true_uzel=on" # Nodo norte verdadero "&minor_45=on" # Aspectos menores 45° "&minor_135=on" # Aspectos menores 135° "&equal=1" # Casas iguales # ------------------------------------------------- # Casas f"&dum_1_new={quote(str(house1.lon))}" # Ascendente f"&dum_2={quote(str(house2.lon))}" f"&dum_3={quote(str(house3.lon))}" f"&dum_4={quote(str(house4.lon))}" f"&dum_5={quote(str(house5.lon))}" f"&dum_6={quote(str(house6.lon))}" f"&dum_10_new={quote(str(house10.lon))}" # Medio cielo # ------------------------------------------------- # Planetas f"&planeta_slunce={quote(str(Sun.lon))}" # Sol f"&planeta_luna={quote(str(Moon.lon))}" # Luna f"&planeta_merkur={quote(str(Mercury.lon))}" # Mercurio f"&planeta_venuse={quote(str(Venus.lon))}" # Venus f"&planeta_mars={quote(str(Mars.lon))}" # Marte f"&planeta_jupiter={quote(str(Jupiter.lon))}" # Júpiter f"&planeta_saturn={quote(str(Saturn.lon))}" # Saturno f"&planeta_uran={quote(str(Uranus.lon))}" # Urano f"&planeta_neptun={quote(str(Neptune.lon))}" # Neptuno f"&planeta_pluto={quote(str(Pluto.lon))}" # Plutón f"&planeta_uzel={quote(str(North_Node.lon))}" # Nodo Norte f"&planeta_fortune={quote(str(Pars_Fortuna.lon))}"# Parte de la Fortuna f"&planeta_syzygy={quote(str(Syzygy.lon))}" # Luna Nueva / Llena (Syzygy) # ------------------------------------------------- # Retrogradaciones "&r_saturn=ANO" # Saturno retrógrado "&r_pluto=ANO" # Plutón retrógrado "&r_uzel=ANO" # Nodo Norte retrógrado # ------------------------------------------------- # Otras configuraciones "&tolerance=1" # Tolerancia de aspecto "&tolerance_paral=1.2" # Tolerancia de paralelos "&house_system=equal" # Sistema de casas igual "&terms=#tabs_redraw" # Redibujar la carta ) return url # ------------------------- # Crear app FastAPI # ------------------------- app = FastAPI(title="Nut API FastAPI") # Ruta de inicio @app.get("/") def root(): return {"message": "Nut API FastAPI"} # Ruta para generar la URL de Nut @app.get("/nut") def procesar_cadena( datos: str = Query( "???", description="Ejemplo de entrada:1962/02/04|14:30|-05:00|05n00|75w32" ) ): url_generada = Nut(datos) return {"input": datos, "output": url_generada}