12 Días de DigitalOcean (Día 3) – Comprobando Cumpleaños y Enviando Notificaciones SMS

🎄 12 Días de DigitalOcean: Verificando Cumpleaños y Enviando Notificaciones por SMS 🎁

¡Bienvenido al Día 3 de 12 Días de DigitalOcean! En los últimos dos días, hemos configurado una base de datos PostgreSQL y nos hemos conectado a ella utilizando Python. Ahora, es el momento de hacer que nuestro Servicio de Recordatorio de Cumpleaños realmente haga algo útil: enviarte un mensaje de texto cuando haya un cumpleaños hoy. 🎂

Utilizaremos Twilio, un servicio que facilita el envío de mensajes SMS con solo unas pocas líneas de código. Al final de hoy, tu aplicación verificará la base de datos en busca de cumpleaños y te enviará un recordatorio si hay una coincidencia.

¡Empecemos!


✨ ¿Por qué Este Paso?

Encontrar cumpleaños en tu base de datos es solo parte del trabajo. Para que esta aplicación sea realmente útil, necesitamos notificar a alguien (¡tú!) sobre estas fechas especiales.

Este paso conecta los puntos:

  • Utiliza consultas SQL para encontrar cumpleaños que coincidan con la fecha de hoy.
  • Envía un recordatorio amistoso por SMS usando Twilio.

Es rápido de configurar y hace que la aplicación sea instantáneamente más práctica.


🚀 Lo que aprenderás

Aquí está lo que abordaremos hoy:

  1. Usar consultas SQL para encontrar cumpleaños que coincidan con la fecha de hoy.
  2. Enviar notificaciones SMS usando el SDK de Python de Twilio.
  3. Combinar estos pasos en un solo script funcional de Python.

🛠 Lo que necesitarás

Antes de comenzar, asegúrate de tener:


🧑‍🍳 Receta para el Día 3: Comprobando cumpleaños y enviando notificaciones

Paso 1: Instalar el SDK de Python de Twilio

Para enviar notificaciones por SMS, necesitaremos la biblioteca de Python de Twilio. Instálala ejecutando:

pip install twilio

Si aún no tienes tus credenciales de Twilio (Account SID, Auth Token y un número de teléfono), sigue el Inicio rápido de mensajería de Twilio. Te guía a través del registro, la compra de un número de teléfono y la obtención de los detalles necesarios.


Paso 2: Actualiza tu .env Archivo

Tu archivo .env ahora debería incluir tanto tus credenciales de base de datos (del Día 2) como tus credenciales de Twilio. Puedes encontrar las credenciales de Twilio—Account SID, Auth Token y tu número de teléfono de Twilio—iniciando sesión en el panel de control de tu cuenta de Twilio.

Actualiza tu archivo .env para que se vea así:

# Credenciales de la base de datos
DB_HOST=
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_PORT=5432  # Default PostgreSQL port

# Credenciales de Twilio
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_PHONE_FROM=
TWILIO_PHONE_TO=
  • Reemplaza los marcadores de posición con tus credenciales reales.
  • Agrega tu número de teléfono personal como TWILIO_PHONE_TO para recibir notificaciones de prueba.

Consejo Profesional: Asegúrate de que .env esté añadido a tu archivo .gitignore para evitar que credenciales sensibles sean expuestas en el control de versiones.


Paso 3: Escribe el Script en Python

Aquí está el script completo en Python que consulta la base de datos para los cumpleaños de hoy y envía notificaciones SMS utilizando Twilio:

# check_birthdays.py

from datetime import datetime
import pg8000
from dotenv import load_dotenv
from twilio.rest import Client
import os

# Cargar variables de entorno
load_dotenv()

def connect_to_database():
    """Establish connection to the database."""
    return pg8000.connect(
        host=os.getenv("DB_HOST"),
        database=os.getenv("DB_NAME"),
        user=os.getenv("DB_USER"),
        password=os.getenv("DB_PASSWORD"),
        port=int(os.getenv("DB_PORT"))
    )

def send_birthday_message(first_name, last_name):
    """Send a birthday text message using Twilio."""
    try:
        # Configuración de Twilio
        account_sid = os.getenv("TWILIO_ACCOUNT_SID")
        auth_token = os.getenv("TWILIO_AUTH_TOKEN")
        client = Client(account_sid, auth_token)

        # Componer el mensaje
        message = client.messages.create(
            body=f"🎉 It's {first_name} {last_name or ''}'s birthday today! 🎂",
            from_=os.getenv("TWILIO_PHONE_FROM"),
            to=os.getenv("TWILIO_PHONE_TO")
        )

        print(
            f"Message sent to {os.getenv('TWILIO_PHONE_TO')} for {first_name} {last_name or ''}. Message SID: {message.sid}"
        )
    except Exception as e:
        print(f"An error occurred while sending the message: {e}")

def check_birthdays():
    """Check if any contact's birthday matches today's date and send a notification."""
    try:
        conn = connect_to_database()
        cursor = conn.cursor()

        # Obtener el mes y el día de hoy
        today = datetime.now()
        today_month = today.month
        today_day = today.day

        # Consulta para obtener contactos cuyo cumpleaños coincide con la fecha de hoy
        cursor.execute(
            """
            SELECT first_name, last_name, birthday
            FROM contacts
            WHERE EXTRACT(MONTH FROM birthday) = %s
              AND EXTRACT(DAY FROM birthday) = %s;
            """,
            (today_month, today_day)
        )

        rows = cursor.fetchall()

        # Notificar por cada contacto coincidente
        if rows:
            print("Birthday Notifications:")
            for row in rows:
                first_name, last_name, _ = row
                send_birthday_message(first_name, last_name)
        else:
            print("No birthdays today.")

        # Cerrar el cursor y la conexión
        cursor.close()
        conn.close()

    except Exception as e:
        print(f"An error occurred while checking birthdays: {e}")

if __name__ == "__main__":
    check_birthdays()

Paso 5: Prueba tu script

Ejecuta el script para probar todo:

python check_birthdays.py

Si hay un cumpleaños en tu base de datos que coincide con la fecha de hoy, recibirás un mensaje de texto. 🎉 Si no, el script simplemente imprimirá:

No birthdays today.

🎁 Resumen

Esto es lo que logramos hoy:

✅ Consultamos la base de datos para los cumpleaños que coinciden con la fecha de hoy.

✅ Usamos Twilio para enviar notificaciones por SMS para esos cumpleaños.

✅ Combinamos todo en un script funcional de Python.

Próximamente: Mañana, implementaremos este script en DigitalOcean Functions para que se ejecute en la nube—sin necesidad de gestión de servidores. Aquí es donde el Servicio de Recordatorio de Cumpleaños comienza a funcionar automáticamente. ¡Mantente atento! 🚀

Source:
https://www.digitalocean.com/community/tutorials/checking-birthdays-and-sending-sms-notifications