디지털오션의 12일 (3일차) – 생일 확인 및 SMS 알림 전송

🎄 디지털오션의 12일: 생일 확인 및 SMS 알림 보내기 🎁

디지털오션의 3일째에 오신 것을 환영합니다! 지난 이틀 동안 PostgreSQL 데이터베이스를 설정하고 Python을 사용하여 연결했습니다. 이제 우리의 생일 알림 서비스가 실제로 유용한 일을 할 차례입니다—오늘 생일이 있는 경우 문자 메시지를 보내는 것입니다. 🎂

우리는 트윌리오를 사용할 것입니다. 이는 몇 줄의 코드만으로 SMS 메시지를 쉽게 보낼 수 있는 서비스입니다. 오늘이 끝날 때쯤이면, 당신의 앱은 데이터베이스에서 생일을 확인하고 일치하는 경우 알림을 보낼 것입니다.

시작해봅시다!


✨ 왜 이 단계인가요?

데이터베이스에서 생일을 찾는 것만으로는 충분하지 않습니다. 이 앱을 진정으로 유용하게 만들기 위해서는 이러한 특별한 날짜에 대해 누군가(당신!)에게 알림을 보내야 합니다.

이 단계는 다음을 연결합니다:

  • 오늘 날짜와 일치하는 생일을 찾기 위해 SQL 쿼리를 사용합니다.
  • 트윌리오를 사용하여 친근한 SMS 알림을 보냅니다.

설정이 빠르고 앱을 즉시 더 실용적으로 만듭니다.


🚀 배울 내용

오늘 우리가 다룰 내용은 다음과 같습니다:

  1. 오늘 날짜와 일치하는 생일을 찾기 위해 SQL 쿼리를 사용합니다.
  2. Twilio의 Python SDK를 사용하여 SMS 알림을 보냅니다.
  3. 이 단계들을 하나의 기능적인 Python 스크립트로 결합합니다.

🛠 필요한 것들

시작하기 전에 다음을 준비하세요:

  • Twilio 계정 (아직 계정이 없다면, 이 빠른 시작 가이드를 따라 가입하고, Twilio 전화번호를 구매하며, 자격 증명을 받으세요.
  • 당신의 Twilio 자격 증명:
    • 계정 SID
    • 인증 토큰
    • Twilio 전화번호
  • 2일차의 데이터베이스 및 Python 연결 스크립트.
  • 샘플 데이터는 연락처 테이블에 있습니다(우리는 이것을 1일차 – 생일 알림을 위한 PostgreSQL 데이터베이스 설정에서 추가했습니다). 더 추가해야 할 경우, 1일차의 단계를 따라 데이터베이스를 채워주세요.

🧑‍🍳 3일차 레시피: 생일 확인 및 알림 전송

1단계: Twilio의 Python SDK 설치

SMS 알림을 보내기 위해 Twilio Python 라이브러리가 필요합니다. 다음 명령어를 실행하여 설치하세요:

pip install twilio

Twilio 자격 증명(계정 SID, 인증 토큰 및 전화 번호)이 아직 없는 경우, Twilio의 메시징 빠른 시작을 참조하세요. 여기에는 가입, 전화번호 구매 및 필요한 세부정보를 가져오는 방법이 안내되어 있습니다.


2단계: .env 파일 업데이트

.env 파일에는 이제 데이터베이스 자격 증명(2일차에서)과 Twilio 자격 증명이 모두 포함되어야 합니다. Twilio 계정 대시보드에 로그인하여 Twilio 자격 증명인 Account SID, Auth Token, 및 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단계: 파이썬 스크립트 작성

다음은 오늘의 생일을 데이터베이스에서 조회하고 Twilio를 사용하여 SMS 알림을 보내는 전체 파이썬 스크립트입니다:

# 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.

🎁 마무리

오늘 우리가 이룬 것은 다음과 같습니다:

✅ 오늘 날짜와 일치하는 생일을 데이터베이스에서 조회했습니다.

✅ 해당 생일에 대한 SMS 알림을 보내기 위해 Twilio를 사용했습니다.

✅ 모든 것을 기능적인 파이썬 스크립트로 통합했습니다.

다음 일정: 내일, 우리는 이 스크립트를 DigitalOcean Functions에 배포하여 클라우드에서 실행되도록 할 것입니다. 서버 관리가 필요 없습니다. 여기서 생일 알림 서비스가 자동으로 실행되기 시작합니다. 기대해 주세요! 🚀

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