12 日間 (3 日目) - 誕生日の確認と SMS 通知の送信
🎄 DigitalOcean の 12 日間: 誕生日の確認と SMS 通知の送信 🎁
12 日間の DigitalOcean の 3 日目 へようこそ!過去 2 日間、私たちは PostgreSQL データベースをセットアップし、Python を使用してそれに接続しました。ここで、誕生日リマインダー サービスに実際に何か役立つことを実行してみましょう。今日の誕生日にテキスト メッセージを送信します。 🎂
わずか数行のコードで SMS メッセージを簡単に送信できるサービスである Twilio を使用します。今日の終わりまでに、アプリはデータベースで誕生日を確認し、一致するものがあればリマインダーを送信します。
始めましょう!
✨ なぜこのステップを行うのか?
データベースから誕生日を検索することは仕事の一部にすぎません。このアプリを本当に便利にするには、これらの特別な日付について誰か (あなた!) に通知する必要があります。
このステップでは、点と点がつながります。
- SQL クエリを使用して、今日の日付と一致する誕生日を検索します。
- Twilio を使用してフレンドリーな SMS リマインダーを送信します。
セットアップが簡単で、アプリがすぐに実用的になります。
🚀 学ぶ内容
今日取り組む内容は次のとおりです。
- SQL クエリを使用して、今日の日付と一致する誕生日を検索します。
- Twilio の Python SDK を使用して SMS 通知を送信します。
- これらの手順を単一の機能的な Python スクリプトに結合します。
🛠 必要なもの
始める前に、次のものが揃っていることを確認してください。
- Twilio アカウント (まだお持ちでない場合は、このクイックスタート ガイドに従ってサインアップし、Twilio 電話番号を購入し、資格情報を取得してください。
Twilio 認証情報:
- アカウントSID
- 認証トークン
- Twilio 電話番号
🧑🍳 3日目のレシピ: 誕生日の確認と通知の送信
ステップ 1: Twilio の Python SDK をインストールする
SMS 通知を送信するには、Twilio Python ライブラリが必要です。以下を実行してインストールします。
pip install twilio
Twilio 資格情報 (アカウント SID、認証トークン、電話番号) をまだ持っていない場合は、Twilio のメッセージング クイックスタートに従ってください。サインアップ、電話番号の購入、必要な詳細の取得までを手順を追って説明します。
ステップ 2: .env
ファイルを更新する
.env ファイルには、データベース認証情報 (2 日目のもの) と Twilio 認証情報の両方が含まれるはずです。 Twilio アカウント ダッシュボードにログインすると、Twilio 認証情報 (アカウント SID、認証トークン、Twilio 電話番号) を確認できます。
.env
ファイルを次のように更新します。
# Database credentials
DB_HOST=<your-database-hostname>
DB_NAME=<your-database-name>
DB_USER=<your-database-username>
DB_PASSWORD=<your-database-password>
DB_PORT=5432 # Default PostgreSQL port
Twilio credentials
TWILIO_ACCOUNT_SID=<your-twilio-account-sid>
TWILIO_AUTH_TOKEN=<your-twilio-auth-token>
TWILIO_PHONE_FROM=<your-twilio-phone-number>
TWILIO_PHONE_TO=<your-personal-phone-number>
- プレースホルダーを実際の資格情報に置き換えます。
- テスト通知を受信するには、個人の電話番号を 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 environment variables
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 setup
account_sid = os.getenv("TWILIO_ACCOUNT_SID")
auth_token = os.getenv("TWILIO_AUTH_TOKEN")
client = Client(account_sid, auth_token)
# Compose the message
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()
# Get today's month and day
today = datetime.now()
today_month = today.month
today_day = today.day
# Query to fetch contacts whose birthday matches today's date
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()
# Notify for each matching contact
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.")
# Close the cursor and connection
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 を使用して、誕生日の SMS 通知を送信しました。
✅ すべてを機能的な Python スクリプトに結合しました。
次回: 明日、このスクリプトを DigitalOcean Functions にデプロイしてクラウドで実行できるようにします。サーバー管理は必要ありません。ここで、誕生日リマインダー サービスが自動的に実行されます。乞うご期待! 🚀