12 дней DigitalOcean (День 3) – Проверка дней рождения и отправка SMS-уведомлений

🎄 12 дней DigitalOcean: Проверка дней рождения и отправка SMS-уведомлений 🎁

Добро пожаловать в День 3 12 дней DigitalOcean! За последние два дня мы настроили базу данных PostgreSQL и подключились к ней с помощью Python. Теперь пришло время сделать наш Сервис Напоминания о Днях Рождения действительно полезным — отправлять вам сообщение, когда сегодня чей-то день рождения. 🎂

Мы будем использовать Twilio, сервис, который упрощает отправку SMS-сообщений всего лишь с несколькими строками кода. К концу сегодняшнего дня ваше приложение будет проверять базу данных на наличие дней рождения и отправлять вам напоминание, если найдется совпадение.

Приступим!


✨ Почему этот шаг важен?

Поиск дней рождения в вашей базе данных — это лишь часть работы. Чтобы сделать это приложение действительно полезным, нам нужно уведомить кого-то (вас!) о этих особенных датах.

Этот шаг связывает все воедино:

  • Используйте SQL-запросы для поиска дней рождения, которые совпадают с сегодняшней датой.
  • Отправьте дружелюбное SMS-напоминание с помощью Twilio.

Настройка занимает немного времени и делает приложение сразу более практичным.


🚀 Что вы узнаете

Вот что мы будем рассматривать сегодня:

  1. Используйте SQL-запросы, чтобы найти дни рождения, совпадающие с сегодняшней датой.
  2. Отправляйте SMS-уведомления с использованием Python SDK от Twilio.
  3. Объедините эти шаги в один рабочий скрипт на Python.

🛠 Что вам понадобится

Перед началом убедитесь, что у вас есть:


🧑‍🍳 Рецепт на День 3: Проверка дней рождения и отправка уведомлений

Шаг 1: Установите SDK Python от Twilio

Чтобы отправлять SMS-уведомления, нам понадобится библиотека Twilio для Python. Установите её, выполнив:

pip install twilio

Если у вас еще нет учетных данных Twilio (Account SID, Auth Token и номер телефона), следуйте Краткому руководству по отправке сообщений Twilio. Оно проведет вас через процесс регистрации, покупки номера телефона и получения необходимых данных.


Шаг 2: Обновите свой .env файл

Ваш файл .env теперь должен содержать как учетные данные вашей базы данных (с Дня 2), так и учетные данные Twilio. Вы можете найти учетные данные Twilio — Account SID, Auth Token и ваш номер телефона Twilio — войдя в панель управления вашей учетной записи Twilio.

Обновите ваш .env файл так:

# Учетные данные базы данных
DB_HOST=
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_PORT=5432  # Default PostgreSQL port

# Учетные данные Twilio
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_PHONE_FROM=
TWILIO_PHONE_TO=
  • Замените заполнители вашими актуальными учетными данными.
  • Добавьте ваш личный номер телефона как TWILIO_PHONE_TO, чтобы получать тестовые уведомления.

Совет: Убедитесь, что .env добавлен в ваш .gitignore файл, чтобы предотвратить утечку конфиденциальных учетных данных в системе контроля версий.


Шаг 3: Напишите Python скрипт

Вот полный Python скрипт, который запрашивает базу данных на предмет сегодняшних дней рождения и отправляет SMS уведомления с использованием Twilio:

# check_birthdays.py

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

# Загрузка переменных окружения
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
        account_sid = os.getenv("TWILIO_ACCOUNT_SID")
        auth_token = os.getenv("TWILIO_AUTH_TOKEN")
        client = Client(account_sid, auth_token)

        # Составление сообщения
        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()

        # Получение текущего месяца и дня
        today = datetime.now()
        today_month = today.month
        today_day = today.day

        # Запрос для получения контактов, чьи дни рождения совпадают с сегодняшней датой
        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()

        # Уведомление для каждого совпадающего контакта
        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.")

        # Закрытие курсора и подключения
        cursor.close()
        conn.close()

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

if __name__ == "__main__":
    check_birthdays()

Шаг 5: Протестируйте ваш скрипт

Запустите скрипт, чтобы протестировать все:

python check_birthdays.py

Если в вашей базе данных есть день рождения, совпадающий с сегодняшней датой, вы получите текстовое сообщение. 🎉 Если нет, скрипт просто выведет:

No birthdays today.

🎁 Подведение итогов

Вот что мы достигли сегодня:

✅ Провели запрос к базе данных на дни рождения, совпадающие с сегодняшней датой.

✅ Использовали Twilio для отправки SMS-уведомлений о этих днях рождения.

✅ Объединили все в функциональный Python-скрипт.

Далее: Завтра мы развернем этот скрипт на DigitalOcean Functions, чтобы он работал в облаке — без необходимости управления сервером. Здесь Сервис Напоминания о Дне Рождения начинает работать автоматически. Оставайтесь с нами! 🚀

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