Wyszukiwanie w witrynie

12 dni (dzień 3) - Sprawdzanie urodzin i wysyłanie powiadomień SMS


🎄 12 dni DigitalOcean: sprawdzanie urodzin i wysyłanie powiadomień SMS 🎁

Witamy w 3. dniu 12 dni DigitalOcean! W ciągu ostatnich dwóch dni skonfigurowaliśmy bazę danych PostgreSQL i połączyliśmy się z nią za pomocą Pythona. Nadszedł czas, aby nasza usługa przypominania o urodzinach faktycznie zrobiła coś pożytecznego — wysłała Ci SMS-a, gdy dzisiaj są urodziny. 🎂

Będziemy korzystać z Twilio, usługi ułatwiającej wysyłanie wiadomości SMS za pomocą zaledwie kilku linijek kodu. Do końca dnia Twoja aplikacja sprawdzi w bazie danych datę urodzin i wyśle Ci przypomnienie, jeśli znajdzie się dopasowanie.

Zacznijmy!

✨ Dlaczego ten krok?

Znalezienie urodzin w bazie danych to tylko część zadania. Aby ta aplikacja była naprawdę użyteczna, musimy powiadomić kogoś (Ciebie!) o tych wyjątkowych datach.

Ten krok łączy kropki:

  • Użyj zapytań SQL, aby znaleźć urodziny pasujące do dzisiejszej daty.
  • Wyślij przyjazne przypomnienie SMS-em za pomocą Twilio.

Można ją szybko skonfigurować, a aplikacja staje się od razu bardziej praktyczna.

🚀 Czego się nauczysz

Oto czym się dzisiaj zajmiemy:

  1. Użyj zapytań SQL, aby znaleźć urodziny pasujące do dzisiejszej daty.
  2. Wysyłaj powiadomienia SMS za pomocą zestawu SDK Pythona Twilio.
  3. Połącz te kroki w jeden funkcjonalny skrypt w języku Python.

🛠 Czego będziesz potrzebować

Przed rozpoczęciem upewnij się, że masz:

  • Konto Twilio (jeśli jeszcze go nie masz, postępuj zgodnie z tym przewodnikiem Szybki start, aby się zarejestrować, kupić numer telefonu Twilio i uzyskać poświadczenia).
  • Twoje dane uwierzytelniające Twilio:

    • Identyfikator konta
    • Token uwierzytelniający
    • Numer telefonu Twilio
  • Skrypt połączenia z bazą danych i językiem Python z dnia 2.
  • Przykładowe dane w tabeli kontaktów (dodaliśmy je w dniu 1 – Konfigurowanie bazy danych PostgreSQL na potrzeby przypomnień o urodzinach). Jeśli chcesz dodać więcej, wykonaj czynności opisane w dniu 1, aby zapełnić bazę danych.

🧑🍳 Przepis na Dzień 3: Sprawdzanie urodzin i wysyłanie powiadomień

Krok 1: Zainstaluj pakiet SDK Pythona Twilio

Do wysyłania powiadomień SMS będziemy potrzebować biblioteki Twilio Python. Zainstaluj go, uruchamiając:

pip install twilio

Jeśli nie masz jeszcze poświadczeń Twilio (identyfikatora SID konta, tokenu uwierzytelniania i numeru telefonu), postępuj zgodnie z przewodnikiem Szybki start dotyczącym obsługi wiadomości w Twilio. Przeprowadzi Cię przez proces rejestracji, zakupu numeru telefonu i pobrania niezbędnych danych.

Krok 2: Zaktualizuj swój plik .env

Twój plik env powinien teraz zawierać zarówno poświadczenia bazy danych (z dnia 2), jak i poświadczenia Twilio. Poświadczenia Twilio — SID konta, Token uwierzytelniania i numer telefonu Twilio — możesz znaleźć, logując się do pulpitu nawigacyjnego konta Twilio.

Zaktualizuj swój plik .env tak, aby wyglądał następująco:

# Database credentials
DB_HOST=<your-database-hostname>
DB_NAME=<your-database-name>
DB_USER=<your-database-username>
DB_PASSWORD=<your-database-password>
DB_PORT=5432  # Default PostgreSQL port
Twilio credentials
TWILIO_ACCOUNT_SID=<your-twilio-account-sid>
TWILIO_AUTH_TOKEN=<your-twilio-auth-token>
TWILIO_PHONE_FROM=<your-twilio-phone-number>
TWILIO_PHONE_TO=<your-personal-phone-number>
  • Zastąp symbole zastępcze rzeczywistymi poświadczeniami.
  • Dodaj swój osobisty numer telefonu jako TWILIO_PHONE_TO, aby otrzymywać powiadomienia o testach.

Wskazówka: upewnij się, że plik .env jest dodany do pliku .gitignore, aby zapobiec ujawnieniu poufnych danych uwierzytelniających podczas kontroli wersji.

Krok 3: Napisz skrypt w Pythonie

Oto pełny skrypt Pythona, który wysyła zapytanie do bazy danych o dzisiejsze urodziny i wysyła powiadomienia SMS za pomocą Twilio:

# check_birthdays.py

from datetime import datetime
import pg8000
from dotenv import load_dotenv
from twilio.rest import Client
import os
Load environment variables
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 setup
        account_sid = os.getenv("TWILIO_ACCOUNT_SID")
        auth_token = os.getenv("TWILIO_AUTH_TOKEN")
        client = Client(account_sid, auth_token)

        # Compose the message
        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()

        # Get today's month and day
        today = datetime.now()
        today_month = today.month
        today_day = today.day

        # Query to fetch contacts whose birthday matches today's date
        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()

        # Notify for each matching 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.")

        # Close the cursor and connection
        cursor.close()
        conn.close()

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

if __name__ == "__main__":
    check_birthdays()

Krok 5: Przetestuj swój skrypt

Uruchom skrypt, aby wszystko przetestować:

python check_birthdays.py

Jeżeli w Twojej bazie danych znajdują się urodziny odpowiadające dzisiejszej dacie, otrzymasz wiadomość SMS. 🎉 Jeśli nie, skrypt po prostu wydrukuje:

No birthdays today.

🎁 Podsumowanie

Oto, co dzisiaj osiągnęliśmy:

✅ Zapytałem bazę danych o urodziny pasujące do dzisiejszej daty.

✅ Używałem Twilio do wysyłania powiadomień SMS z okazji urodzin.

✅ Połączyłem wszystko w funkcjonalny skrypt Pythona.

Następny: jutro wdrożymy ten skrypt w DigitalOcean Functions, aby umożliwić jego działanie w chmurze – bez konieczności zarządzania serwerem. W tym miejscu usługa przypomnień o urodzinach zaczyna działać automatycznie. Czekać na dalsze informacje! 🚀

Powiązane artykuły: