12 Dias de DigitalOcean (Dia 3) – Verificando Aniversários e Enviando Notificações por SMS

🎄 12 Dias de DigitalOcean: Verificando Aniversários e Enviando Notificações por SMS 🎁

Bem-vindo ao Dia 3 dos 12 Dias de DigitalOcean! Nos últimos dois dias, configuramos um banco de dados PostgreSQL e nos conectamos a ele usando Python. Agora, é hora de fazer nosso Serviço de Lembrete de Aniversário realmente fazer algo útil—enviar uma mensagem de texto quando há um aniversário hoje. 🎂

Usaremos Twilio, um serviço que facilita o envio de mensagens SMS com apenas algumas linhas de código. Ao final de hoje, seu aplicativo verificará o banco de dados em busca de aniversários e enviará um lembrete se houver uma correspondência.

Vamos começar!


✨ Por Que Esta Etapa?

Encontrar aniversários no seu banco de dados é apenas parte do trabalho. Para tornar este aplicativo realmente útil, precisamos notificar alguém (você!) sobre essas datas especiais.

Esta etapa conecta os pontos:

  • Use consultas SQL para encontrar aniversários que coincidam com a data de hoje.
  • Envie um lembrete amigável por SMS usando o Twilio.

É rápido de configurar e torna o aplicativo instantaneamente mais prático.


🚀 O que você aprenderá

Aqui está o que vamos abordar hoje:

  1. Use consultas SQL para encontrar aniversários que correspondam à data de hoje.
  2. Envie notificações SMS usando o SDK Python do Twilio.
  3. Combine esses passos em um único script Python funcional.

🛠 O que você precisará

Antes de começar, certifique-se de ter:

  • Uma conta no Twilio (se você ainda não tiver uma, siga este Guia Rápido para se inscrever, comprar um número de telefone Twilio e obter suas credenciais.
  • Suas credenciais do Twilio:
    • Account SID
    • Auth Token
    • Número de telefone Twilio
  • O script de conexão com o banco de dados e Python do Dia 2.
  • Dados de exemplo na sua tabela de contatos (adicionamos isso em Dia 1 – Configurando um Banco de Dados PostgreSQL para Lembretes de Aniversário). Se você precisar adicionar mais, siga os passos do Dia 1 para preencher seu banco de dados.

🧑‍🍳 Receita para o Dia 3: Verificando Aniversários e Enviando Notificações

Passo 1: Instale o SDK Python da Twilio

Para enviar notificações por SMS, precisamos da biblioteca Python da Twilio. Instale-a executando:

pip install twilio

Se você ainda não tiver suas credenciais da Twilio (Account SID, Auth Token e um número de telefone), siga o Guia Rápido de Mensagens da Twilio. Ele orienta você sobre como se inscrever, comprar um número de telefone e obter os detalhes necessários.


Passo 2: Atualize seu .env Arquivo

Seu arquivo .env agora deve incluir tanto suas credenciais de banco de dados (do Dia 2) quanto suas credenciais do Twilio. Você pode encontrar as credenciais do Twilio—Account SID, Auth Token e seu número de telefone do Twilio—fazendo login no painel da sua conta Twilio.

Atualize seu arquivo .env para ficar assim:

# Credenciais do banco de dados
DB_HOST=
DB_NAME=
DB_USER=
DB_PASSWORD=
DB_PORT=5432  # Default PostgreSQL port

# Credenciais do Twilio
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_PHONE_FROM=
TWILIO_PHONE_TO=
  • Substitua os espaços reservados pelas suas credenciais reais.
  • Adicione seu número de telefone pessoal como TWILIO_PHONE_TO para receber notificações de teste.

Dica Profissional: Certifique-se de que .env esteja adicionado ao seu arquivo .gitignore para evitar que credenciais sensíveis sejam expostas no controle de versão.


Passo 3: Escreva o Script em Python

Aqui está o script completo em Python que consulta o banco de dados para os aniversários de hoje e envia notificações SMS usando o Twilio:

# check_birthdays.py

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

# Carregar variáveis de 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:
        # Configuração do Twilio
        account_sid = os.getenv("TWILIO_ACCOUNT_SID")
        auth_token = os.getenv("TWILIO_AUTH_TOKEN")
        client = Client(account_sid, auth_token)

        # Compor a mensagem
        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()

        # Obter o mês e o dia de hoje
        today = datetime.now()
        today_month = today.month
        today_day = today.day

        # Consulta para buscar contatos cujo aniversário coincide com a data de hoje
        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()

        # Notificar para cada contato correspondente
        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.")

        # Fechar o cursor e a conexão
        cursor.close()
        conn.close()

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

if __name__ == "__main__":
    check_birthdays()

Etapa 5: Teste seu script

Execute o script para testar tudo:

python check_birthdays.py

Se houver um aniversário em seu banco de dados que corresponda à data de hoje, você receberá uma mensagem de texto. 🎉 Se não, o script simplesmente imprimirá:

No birthdays today.

🎁 Conclusão

Aqui está o que conseguimos hoje:

✅ Consultamos o banco de dados para aniversários correspondentes à data de hoje.

✅ Usamos o Twilio para enviar notificações SMS para esses aniversários.

✅ Combinamos tudo em um script funcional em Python.

Próximo: Amanhã, vamos implantar este script nas Funções do DigitalOcean para que ele execute na nuvem—sem necessidade de gerenciamento de servidor. É aqui que o Serviço de Lembrete de Aniversário começa a funcionar automaticamente. Fique ligado! 🚀

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