数字海洋的12天(第3天) – 检查生日并发送短信通知

🎄 数字海洋的12天:检查生日并发送短信通知 🎁

欢迎来到第3天数字海洋的12天!在过去的两天里,我们已设置了一个PostgreSQL数据库,并使用Python连接到它。现在,是时候让我们的生日提醒服务真正发挥作用——在今天有生日时给你发送一条短信。🎂

我们将使用Twilio,这是一个只需几行代码即可轻松发送短信的服务。到今天结束时,你的应用程序将检查数据库中的生日,并在有匹配时发送提醒。

让我们开始吧!


✨ 为什么这一步?

在数据库中查找生日只是工作的一部分。为了使这个应用程序真正有用,我们需要通知某人(你!)这些特殊的日期。

这一步连接了各个环节:

  • 使用SQL查询查找与今天日期匹配的生日。
  • 使用Twilio发送友好的短信提醒。

设置迅速,使应用程序立即变得更加实用。


🚀 你将学到的内容

今天我们将处理以下内容:

  1. 使用 SQL 查询查找与今天日期匹配的生日。
  2. 使用 Twilio 的 Python SDK 发送 SMS 通知。
  3. 将这些步骤组合成一个功能齐全的 Python 脚本。

🛠 你需要的工具

在开始之前,请确保你拥有:

  • 一个 Twilio 账户(如果你还没有,请按照这个 快速入门指南 注册、购买一个 Twilio 电话号码并获取你的凭据。
  • 你的 Twilio 凭据:
    • 账户 SID
    • 认证令牌
    • Twilio 电话号码
  • 来自 第 2 天 的数据库和 Python 连接脚本。
  • 示例数据在您的联系人表中(我们在第1天 – 设置PostgreSQL数据库以进行生日提醒中添加了这个)。如果您需要添加更多,请按照第1天的步骤填充您的数据库。

🧑‍🍳 第3天的食谱:检查生日并发送通知

步骤1:安装Twilio的Python SDK

要发送短信通知,我们需要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 通知:

# 检查生日.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