12 Giorni di DigitalOcean (Giorno 3) – Verifica Compleanni e Invio Notifiche SMS

🎄 12 Giorni di DigitalOcean: Controllare i Compleanni e Inviare Notifiche SMS 🎁

Benvenuto al Giorno 3 dei 12 Giorni di DigitalOcean! Negli ultimi due giorni, abbiamo configurato un database PostgreSQL e ci siamo connessi utilizzando Python. Ora, è il momento di far sì che il nostro Servizio di Promemoria dei Compleanni faccia qualcosa di utile: inviarti un messaggio quando c’è un compleanno oggi. 🎂

Utilizzeremo Twilio, un servizio che rende facile inviare messaggi SMS con solo poche righe di codice. Entro la fine di oggi, la tua app controllerà il database per i compleanni e ti invierà un promemoria se c’è una corrispondenza.

Iniziamo!


✨ Perché Questo Passaggio?

Trovare i compleanni nel tuo database è solo parte del lavoro. Per rendere questa app davvero utile, dobbiamo notificare qualcuno (te!) riguardo a queste date speciali.

Questo passaggio collega i punti:

  • Utilizza query SQL per trovare i compleanni che corrispondono alla data di oggi.
  • Invia un promemoria SMS amichevole utilizzando Twilio.

È veloce da configurare e rende l’app immediatamente più pratica.


🚀 Cosa Imparerai

Ecco cosa affronteremo oggi:

  1. Usa query SQL per trovare compleanni che corrispondono alla data di oggi.
  2. Invia notifiche SMS utilizzando il SDK Python di Twilio.
  3. Combina questi passaggi in un unico script Python funzionale.

🛠 Cosa Ti Serve

Prima di iniziare, assicurati di avere:

  • Un account Twilio (se non ne hai ancora uno, segui questa Guida Rapida per registrarti, acquistare un numero di telefono Twilio e ottenere le tue credenziali.
  • Le tue credenziali Twilio:
    • Account SID
    • Auth Token
    • Numero di telefono Twilio
  • Il database e lo script di connessione Python dal Giorno 2.
  • Dati di esempio nella tua tabella contatti (abbiamo aggiunto questo in Giorno 1 – Configurazione di un database PostgreSQL per i promemoria di compleanno). Se hai bisogno di aggiungere altro, segui i passaggi nel Giorno 1 per popolare il tuo database.

🧑‍🍳 Ricetta per il Giorno 3: Controllo dei compleanni e invio delle notifiche

Passo 1: Installa il SDK Python di Twilio

Per inviare notifiche SMS, avremo bisogno della libreria Python di Twilio. Installala eseguendo:

pip install twilio

Se non hai già le tue credenziali Twilio (Account SID, Auth Token e un numero di telefono), segui il Messaggi Quickstart di Twilio. Ti guiderà nella registrazione, nell’acquisto di un numero di telefono e nel recupero dei dettagli necessari.


Passaggio 2: Aggiorna il tuo file .env

Il tuo file .env dovrebbe ora includere sia le credenziali del database (dal Giorno 2) sia le tue credenziali Twilio. Puoi trovare le credenziali Twilio—Account SID, Auth Token e il tuo numero di telefono Twilio—accedendo al pannello di controllo del tuo account Twilio.

Aggiorna il tuo file .env affinché appaia così:

# Credenziali del database
DB_HOST=
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_PORT=5432  # Default PostgreSQL port

# Credenziali Twilio
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_PHONE_FROM=
TWILIO_PHONE_TO=
  • Sostituisci i segnaposto con le tue credenziali reali.
  • Aggiungi il tuo numero di telefono personale come TWILIO_PHONE_TO per ricevere notifiche di test.

Consiglio da professionista: Assicurati che .env sia aggiunto al tuo file .gitignore per prevenire l’esposizione di credenziali sensibili nel controllo di versione.


Passaggio 3: Scrivi lo script Python

Ecco lo script Python completo che interroga il database per i compleanni di oggi e invia notifiche SMS utilizzando Twilio:

# check_birthdays.py

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

# Carica le variabili di ambiente
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:
        # Configurazione di Twilio
        account_sid = os.getenv("TWILIO_ACCOUNT_SID")
        auth_token = os.getenv("TWILIO_AUTH_TOKEN")
        client = Client(account_sid, auth_token)

        # Componi il messaggio
        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()

        # Ottieni il mese e il giorno di oggi
        today = datetime.now()
        today_month = today.month
        today_day = today.day

        # Query per recuperare i contatti il cui compleanno corrisponde alla data di oggi
        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()

        # Notifica per ogni contatto corrispondente
        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.")

        # Chiudi il cursore e la connessione
        cursor.close()
        conn.close()

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

if __name__ == "__main__":
    check_birthdays()

Passo 5: Testa il tuo script

Esegui lo script per testare tutto:

python check_birthdays.py

Se c’è un compleanno nel tuo database che corrisponde alla data di oggi, riceverai un messaggio di testo. 🎉 Se no, lo script stamperà semplicemente:

No birthdays today.

🎁 Riepilogo

Ecco cosa abbiamo realizzato oggi:

✅ Abbiamo interrogato il database per i compleanni che corrispondono alla data di oggi.

✅ Abbiamo utilizzato Twilio per inviare notifiche SMS per quei compleanni.

✅ Abbiamo combinato tutto in uno script Python funzionale.

Prossimamente: Domani, implementeremo questo script su DigitalOcean Functions per farlo funzionare nel cloud—senza necessità di gestire server. Qui è dove il Servizio di Promemoria per Compleanni inizia a funzionare automaticamente. Rimanete sintonizzati! 🚀

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