デジタルオーシャンの12日間(第3日) – 誕生日の確認とSMS通知の送信

🎄 デジタルオーシャンの12日間: 誕生日の確認とSMS通知の送信 🎁

デジタルオーシャンの12日間の第3日目へようこそ!ここ2日間で、PostgreSQLデータベースを設定し、Pythonを使って接続しました。さて、私たちの誕生日リマインダーサービスが実際に役立つことをする時が来ました。今日誕生日の人にテキストメッセージを送ります。🎂

私たちは、少ないコード行でSMSメッセージを簡単に送信できるサービスTwilioを使用します。今日の終わりまでに、あなたのアプリはデータベースをチェックして誕生日を探し、一致する場合はリマインダーを送信します。

さあ、始めましょう!


✨ このステップの理由は?

データベース内の誕生日を見つけることは、仕事の一部に過ぎません。このアプリを本当に役立つものにするためには、特別な日について誰か(あなた!)に通知する必要があります。

このステップはポイントをつなぎます:

  • SQLクエリを使用して、今日の日付に一致する誕生日を見つけます。
  • Twilioを使って、友好的なSMSリマインダーを送信します。

設定が簡単で、アプリをすぐに実用的にします。


🚀 学ぶこと

今日取り組む内容は次のとおりです:

  1. 今日の日付に一致する誕生日を見つけるためにSQLクエリを使用します。
  2. TwilioのPython SDKを使用してSMS通知を送信します。
  3. これらのステップを1つの機能的なPythonスクリプトに統合します。

🛠 必要なもの

始める前に、次のものを用意してください:

  • Twilioアカウント(まだ持っていない場合は、このクイックスタートガイドに従ってサインアップし、Twilioの電話番号を購入し、認証情報を取得してください。
  • あなたのTwilio認証情報:
    • アカウントSID
    • 認証トークン
    • Twilio電話番号
  • Day 2からのデータベースとPython接続スクリプト。
  • サンプルデータはあなたの連絡先テーブルにあります(これはDay 1 – バースデーリマインダーのためのPostgreSQLデータベースの設定で追加しました)。もっと追加する必要がある場合は、Day 1の手順に従ってデータベースを充填してください。

🧑‍🍳 Day 3のレシピ: 誕生日の確認と通知の送信

ステップ1: TwilioのPython SDKをインストールする

SMS通知を送信するために、TwilioのPythonライブラリが必要です。次のコマンドを実行してインストールします:

pip install twilio

Twilioの認証情報(アカウントSID、認証トークン、電話番号)がまだない場合は、Twilioのメッセージングクイックスタートを参照してください。サインアップ、電話番号の購入、必要な詳細を取得する手順があります。


ステップ2: .envファイルを更新する

あなたの.envファイルには、データベースの認証情報(2日目のもの)とTwilioの認証情報の両方が含まれている必要があります。Twilioの認証情報、すなわちアカウントSID認証トークン、およびあなたの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スクリプトを書く

以下は、今日の誕生日をデータベースから照会し、Twilioを使用してSMS通知を送信する完全なPythonスクリプトです:

# 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を使用しました。

✅ すべてを機能するPythonスクリプトに統合しました。

次に: 明日、このスクリプトをDigitalOcean Functionsにデプロイして、クラウドで実行できるようにします—サーバー管理は不要です。ここからバースデーリマインダーサービスが自動的に実行され始めます。お楽しみに!🚀

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