Fases lunares: un programa en Python, un script en Bash y un calendario web

En una reunión familiar, me pidieron que revisara el telescopio de mis sobrinos. En realidad, era una especie de catalejo para observaciones terrestres, pero para ver la luna funcionaba bastante bien.

Salvo por algunos detalles con el trípode, funcionaba perfectamente para hacer observaciones de nuestro satélite natural.

Mi papá se quedó con ganas de mirar, así que decidí llevarme mi telescopio. Sin embargo, en esos días hizo mucho frío y no iba a sacarlo para observar la luna.

Luego llegó la hora de esperar la siguiente luna llena y que las condiciones meteorológicas fueran las adecuadas. Solo había un problema: ¿cuándo sería la próxima luna llena?

En este artículo …

¿Qué son las fases lunares?

Intentar explicar como ocurren las fases lunares puede ser un poco complicado. Sobre todo en un cosmos en lo que todo se mueve, todo gira, todo el tiempo.

Les comparto este video de Astronomika TV en el que describe con lujo de detalles todo lo que se tiene que saber sobre las fases de la luna.

Por cierto, si tienes interés en temas de astronomía, definitivamente es el canal de Youtube que debes de mirar.

Un calendario lunar en Python

Lo primero que se me ocurrió fue crear un calendario que pudiera ejecutar desde la terminal, claro, con Python.

Así que me subí al tren de las inteligencias artificiales para generar algo de código, aprender a utilizarlas y no empezar desde cero.

Empecé con Gemini de Google, pero parece que se le cruzaron los cables, porque el código que me sugirió no funcionaba y para colmo, me recomendó una librería inexistente. ¿Qué pasó, Google?

Así que le di la oportunidad a la inteligencia artificial china DeepSeek, y tengo que decirles que me impresionó bastante. No es perfecta, pero fue un excelente punto de partida.

Si el programa se ejecuta sin parámetros, mostrará el mes actual, pero si se le proporciona el año y el mes deseados, también lo hace.

Calendario lunar - febrero 2025

Todo esto gracias a la librería ephem, que es la responsable de calcular las fases lunares.

Pueden darle un vistazo al código en github Calendario Lunar.

Script en Bash para establecer la luna como fondo de escritorio

Pasaron unos días, y me pregunté si habría alguna forma de poner la fase lunar actual como fondo de escritorio.

Esta vez no fue necesario recurrir a la IA. Encontré un script muy interesante en github moon-phase-background.

Es básicamente el mismo, solo le hice algunas adaptaciones. Convertí la imagen a WebP para hacerla mucho más ligera.

Curiosamente la imagen que descarga de la NASA es solamente de la luna, el script la combina con una imagen de fondo de un cielo estrellado, se puede cambiar pero me gustó como se ve así.

Hice algunos cambios con ImageMagick porque me daba algunos errores al poner el texto en la imagen con la información de la fase lunar.

Y, para rematar, tuve que ajustar la propiedad que debía cambiar para establecer el fondo de escritorio, ya que yo uso XFCE en lugar de Cinnamon.

#!/usr/bin/env bash

# updated for 2025
# Modificación de https://github.com/desertplant/moon-phase-background

#isbig=false means background  5641x3650, moon image = 3840x2160, download ~ 5MB
#isbig=true means background  8192x5641, moon image = 5760x3240, download ~ 12MB
isbig=false

#go into directory of script no matter where it is called.
wdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
cd $wdir

#get current hour of the year
num=$((10#$(date --utc +"%j") * 24 - 23 + 10#$(date --utc +"%H")))
echo "Hora del año: "$num
#get phase/illumination% from text file edited from "https://svs.gsfc.nasa.gov/vis/a000000/a005100/a005187/mooninfo_2024.txt"
# or current equivalent
phase=$(sed "$num q;d" phase.txt)
echo "Fase: "$phase
# age: days in moon cycle so far
# Edad lunar: días del ciclo lunar transcurridos
age=$(sed "$num q;d" age.txt)
echo "Edad lunar: "$age
#caption
text="fase: $phase% edad lunar: $age     "

# filename for dowloaded image
im="moon.$(printf "%04d" $num).tif"

echo "Texto a insertar: "$text
echo "Archivo a descargar: "$im

#URLs updated for 2025
if [ $isbig = true ]; then
	curl -LO "https://svs.gsfc.nasa.gov/vis/a000000/a005400/a005415/frames/5760x3240_16x9_30p/plain/$im" # 2025

	wait
	#replace original file with designated background file and add background and caption with imagemagick
	composite -gravity center $im best.tif back.tif

	magick back.tif -font Moon-2.0-Regular -fill '#b1ada7' -pointsize 80 -gravity east -draw "text 150,1800 '$text'" back.tif back.tif
else
	curl -LO "https://svs.gsfc.nasa.gov/vis/a000000/a005400/a005415/frames/3840x2160_16x9_30p/plain/$im" # 2025

	wait
	#replace orginal file with designated background file and add background and caption with imagemagick
	composite -gravity center $im best_small.tif back.tif

	magick back.tif -font Moon-2.0-Regular -fill '#b1ada7' -pointsize 50 -gravity east -draw "text 100,1200 '$text'" back.tif back.tif
fi
echo $wdir

# first half of gsettings command forces background to reload, by assigning an empty picture and immediately replacing it with the updated back.tif file.
# gsettings set org.cinnamon.desktop.background picture-uri "" && gsettings set org.cinnamon.desktop.background picture-uri "file://$wdir/back.tif"

# Reducir el tamaño de la imagen convirtiendola a webp
magick back.tif back.webp

# Actualiza el wallpaper en pantalla XFCE.
# Para revisar que propiedad hay que ajustar:
#    xfconf-query -c xfce4-desktop -m

xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitorVGA-0/workspace1/last-image -s $wdir/back.webp

# remove downloaded moon file as not too use up storage.
rm $im

echo "Proceso terminado."

Y este fue el resultado.

luna llena 12 feb 2025
Plenilunio en todo su esplendor 12 de febrero del 2025.

Ahora solo ejecuto el script cada vez que inicio sesión en mi computadora y listo, tengo la fase lunar actual en mi escritorio ¡Perfecto!

Calendario de fases lunares en Flask

Pasó algo de tiempo, y me dije a mí mismo: ¿Y si haces la versión web?

Nuevamente, me apoyé en DeepSeek para desarrollar algo en Flask.

Tengo que confesar que me sentí muy cómodo usando Flask. Creo que tiene algo que ver con mi experiencia usando Pelican como CMS.

En menos de lo que canta un gallo, ya tenía la aplicación ejecutándose y… pues que creen… que tenía un error.

Por alguna extraña razón que desconozco, las fases lunares no correspondían. Me daba luna nueva cuando debería ser llena, y muchas cosas raras.

Tuve que revisar el código a mano y encontrar una solución. Eso me llevó algo de tiempo, pero mucho menos si hubiera empezado desde cero.

Estaba por investigar cómo publicar en mi hosting una aplicación con Flask cuando decidí no romperme la cabeza.

Tomé el código HTML que generó la aplicación Flask y lo guardé en un archivo index.html.

A fin de cuentas, el próximo año actualizo el calendario al año 2026 y listo, asunto arreglado.

Todavía le estoy haciendo mejoras a todos los códigos así que se aceptan sugerencias.

Un detalle que me gustó es que, para mostrar la fase lunar aproximada, utilicé emojis.

Calendario Lunar visto en Firefox.
El calendario visto en Firefox.

Por lo tanto, se ven diferentes si utilizas un navegador distinto o el teléfono celular. Cada quien muestra la versión de emoji que tiene más a la mano.

¿Qué les parece el resultado? ¿Ya están listos para la próxima luna llena?

2 comentarios en «Fases lunares: un programa en Python, un script en Bash y un calendario web»

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.