數位海洋的12天(第3天) – 檢查生日並發送簡訊通知

🎄 12 天的 DigitalOcean:檢查生日並發送 SMS 通知 🎁

歡迎來到 第 3 天12 天的 DigitalOcean!在過去的兩天裡,我們設置了一個 PostgreSQL 數據庫並使用 Python 連接到它。現在,是時候讓我們的生日提醒服務實際做一些有用的事情——當今天有生日時發送簡訊給你。 🎂

我們將使用 Twilio,這是一個可以用幾行代碼輕鬆發送 SMS 訊息的服務。在今天結束之前,你的應用將檢查數據庫中的生日,並在有匹配時發送提醒。

讓我們開始吧!


✨ 為什麼這一步?

在你的數據庫中找出生日只是工作的一部分。要使這個應用真正有用,我們需要通知某人(你!)這些特別的日期。

這一步連接了所有要素:

  • 使用 SQL 查詢找出與今天日期匹配的生日。
  • 使用 Twilio 發送友好的 SMS 提醒。

設置快速,讓應用程序立刻變得更實用。


🚀 你將學到什麼

今天我們將要處理的內容有:

  1. 使用 SQL 查詢查找符合今天日期的生日。
  2. 使用 Twilio 的 Python SDK 發送 SMS 通知。
  3. 將這些步驟合併成一個完整的 Python 腳本。

🛠 你需要什麼

在開始之前,請確保你擁有:

  • 一個 Twilio 帳戶(如果你還沒有,請按照這個 快速入門指南 註冊,購買一個 Twilio 電話號碼,並獲取你的憑證。
  • 你的 Twilio 憑證:
    • 帳戶 SID
    • 授權令牌
    • Twilio 電話號碼
  • 來自 第 2 天 的數據庫和 Python 連接腳本。
  • 範例資料 在您的聯絡人資料表中(我們在 第一天 – 設定 PostgreSQL 數據庫以獲取生日提醒 中添加了這個)。如果您需要添加更多,請按照第一天的步驟填充您的數據庫。

🧑‍🍳 第三天的食譜:檢查生日並發送通知

步驟 1:安裝 Twilio 的 Python SDK

要發送 SMS 通知,我們需要 Twilio 的 Python 庫。通過運行以下命令來安裝它:

pip install twilio

如果您還沒有 Twilio 憑證(帳戶 SID、授權令牌和電話號碼),請遵循 Twilio 的 簡訊快速入門。它將指導您註冊、購買電話號碼以及獲取必要的詳細資訊。


步驟 2:更新您的 .env 檔案

您的 .env 檔案現在應該包含您的資料庫憑證(來自第 2 天)和您的 Twilio 憑證。您可以透過登錄到您的 Twilio 帳戶儀表板來找到 Twilio 憑證—帳戶 SID授權令牌,以及您的 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 腳本,查詢今天的生日並使用 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.

🎁 總結

今天我們完成了以下事項:

✅ 查詢了資料庫中與今天日期匹配的生日。

✅ 使用 Twilio 發送了這些生日的簡訊通知。

✅ 將所有內容結合成一個功能完整的 Python 腳本。

接下來:明天,我們將把這個腳本部署到 DigitalOcean Functions,使其在雲端運行——無需伺服器管理。這就是生日提醒服務開始自動運行的地方。敬請期待!🚀

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