12 Dagen van DigitalOcean (Dag 3) – Verjaardagen Controleren en SMS-meldingen Versturen

🎄 12 Dagen van DigitalOcean: Verjaardagen Controleren en SMS-Meldingen Versturen 🎁

Welkom bij Dag 3 van 12 Dagen van DigitalOcean! In de afgelopen twee dagen hebben we een PostgreSQL-database opgezet en zijn we ermee verbonden via Python. Nu is het tijd om onze Verjaardagsherinneringsdienst echt iets nuttigs te laten doen—je een sms sturen wanneer er vandaag een verjaardag is. 🎂

We zullen Twilio gebruiken, een service die het gemakkelijk maakt om SMS-berichten te versturen met slechts een paar regels code. Tegen het einde van vandaag zal je app de database controleren op verjaardagen en je een herinnering sturen als er een overeenkomst is.

Laten we beginnen!


✨ Waarom Deze Stap?

Verjaardagen in je database vinden is maar een deel van de klus. Om deze app echt nuttig te maken, moeten we iemand (jij!) informeren over deze speciale data.

Deze stap verbindt de punten:

  • Gebruik SQL-query’s om verjaardagen te vinden die overeenkomen met de datum van vandaag.
  • Stuur een vriendelijke SMS-herinnering met behulp van Twilio.

Het is snel op te zetten en maakt de app meteen praktischer.


🚀 Wat Je Zult Leren

Hier is wat we vandaag gaan aanpakken:

  1. Gebruik SQL-query’s om verjaardagen te vinden die overeenkomen met de datum van vandaag.
  2. Stuur SMS-notificaties met behulp van Twilio’s Python SDK.
  3. Combineer deze stappen tot een enkele, functionele Python-script.

🛠 Wat Je Nodig Hebt

Voordat je begint, zorg ervoor dat je het volgende hebt:

  • Een Twilio-account (als je er nog geen hebt, volg deze Snelstartgids om je aan te melden, een Twilio-telefoonnummer aan te schaffen en je inloggegevens te krijgen.
  • Je Twilio-inloggegevens:
    • Account SID
    • Auth Token
    • Twilio telefoonnummer
  • De database en het Python-verbinding script van Dag 2.
  • Voorbeeldgegevens in je contacten tabel (we hebben dit toegevoegd in Dag 1 – Een PostgreSQL-database instellen voor verjaardagsherinneringen). Als je meer moet toevoegen, volg dan de stappen in Dag 1 om je database te vullen.

🧑‍🍳 Recept voor Dag 3: Verjaardagen controleren en meldingen verzenden

Stap 1: Installeer de Twilio Python SDK

Om SMS-meldingen te verzenden, hebben we de Twilio Python-bibliotheek nodig. Installeer het door het volgende uit te voeren:

pip install twilio

Als je je Twilio-inloggegevens (Account SID, Auth Token en een telefoonnummer) nog niet hebt, volg dan de Messaging Quickstart van Twilio. Het leidt je door het aanmeldproces, het kopen van een telefoonnummer en het verkrijgen van de nodige gegevens.


Stap 2: Werk je .env bestand bij

Je .env bestand zou nu zowel je database-inloggegevens (van Dag 2) als je Twilio-inloggegevens moeten bevatten. Je kunt de Twilio-inloggegevens—Account SID, Auth Token, en je Twilio-telefoonnummer—vinden door in te loggen op je Twilio-accountdashboard.

Werk je .env bestand bij zodat het er als volgt uitziet:

# Database-inloggegevens
DB_HOST=
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_PORT=5432  # Default PostgreSQL port

# Twilio-inloggegevens
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_PHONE_FROM=
TWILIO_PHONE_TO=
  • Vervang de tijdelijke aanduidingen door je werkelijke inloggegevens.
  • Voeg je persoonlijke telefoonnummer toe als TWILIO_PHONE_TO om testmeldingen te ontvangen.

Pro Tip: Zorg ervoor dat .env is toegevoegd aan je .gitignore bestand om te voorkomen dat gevoelige inloggegevens worden blootgesteld in versiebeheer.


Stap 3: Schrijf het Python-script

Hier is het volledige Python-script dat de database vraagt naar de verjaardagen van vandaag en SMS-meldingen verzendt met Twilio:

# check_birthdays.py

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

# Laad omgevingsvariabelen
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:
        # Twilio-instellingen
        account_sid = os.getenv("TWILIO_ACCOUNT_SID")
        auth_token = os.getenv("TWILIO_AUTH_TOKEN")
        client = Client(account_sid, auth_token)

        # Stel het bericht samen
        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()

        # Haal de maand en dag van vandaag op
        today = datetime.now()
        today_month = today.month
        today_day = today.day

        # Vraag om contacten waarvan de verjaardag overeenkomt met de datum van vandaag
        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()

        # Meld voor elk passend contact
        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.")

        # Sluit de cursor en verbinding
        cursor.close()
        conn.close()

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

if __name__ == "__main__":
    check_birthdays()

Stap 5: Test je script

Voer het script uit om alles te testen:

python check_birthdays.py

Als er een verjaardag in je database is die overeenkomt met de datum van vandaag, ontvang je een sms-bericht. 🎉 Zo niet, dan print het script gewoon:

No birthdays today.

🎁 Samenvatting

Dit hebben we vandaag bereikt:

✅ De database geraadpleegd voor verjaardagen die overeenkomen met de datum van vandaag.

✅ Twilio gebruikt om sms-meldingen te versturen voor die verjaardagen.

✅ Alles samengevoegd in een functioneel Python-script.

Volgende: Morgen zullen we dit script naar DigitalOcean Functions implementeren zodat het in de cloud draait—geen serverbeheer nodig. Dit is waar de Verjaardagsherinneringsdienst automatisch begint te draaien. Blijf op de hoogte! 🚀

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