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:
- Użyj zapytań SQL, aby znaleźć urodziny pasujące do dzisiejszej daty.
- Wysyłaj powiadomienia SMS za pomocą zestawu SDK Pythona Twilio.
- 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
🧑🍳 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! 🚀