🚀 第13章:Automated Marketing 究極のマーケティングボット
Vibe Codingコースの最高峰へようこそ! これまで学んできたことを振り返りましょう:
AstroとReactでクールなグラスモーフィズムのフロントエンドを構築car-camping-mapでLeafletの地図インタラクションとSupabaseデータベース連携を実装line-punch-webで万人同時接続に耐え、チート防止機能を備えたFastAPIバックエンドモンスターを作成- 最近では、
CrewAIを使って自分でネット検索し、資料を調べ、Emailを送信するスーパーAI傭兵団を編成する方法を学びました
さて、上司から最後のミッションが下されました。これは百万ドルの価値があるSaaSコア機能です: 「毎日午前2時にシステムが自動的にデータベースをチェックし、予約率の低いキャンプサイトを検出してほしい。その後AIが魅力的なプロモーションテキストを自動生成し、翌朝9時に過去のVIP顧客へLineまたはEmailで自動配信するように」
これは「データベースクエリ」、「マルチエージェントAI協調」、「非同期自動化スクリプト」にまたがる究極の試練です。 この6000字に及ぶ最終決戦では、従来のコード作成にこだわるのではなく、高度なVibe PromptでAIを指揮し、これら3つのシステムを完璧に統合して真の自動化印鑑機を構築します!
🕒 実戦1:Pythonタイマー(Cron Job)トリガーセンターの構築
「毎日午前2時」にシステムを自動実行させるためには、フロントエンドのウェブページにコードを書くわけにはいきません(ページを閉じると機能しなくなります)。 私たちの強力なFastAPIバックエンドサーバーにコードを書き、「目覚まし時計」を設置する必要があります。
Pythonで最も安定かつエレガントなタイマーライブラリはAPScheduler(Advanced Python Scheduler)です。
💡 Vibe Prompt 実戦1:ブロックしないスケジューリングエンジンをAIに書かせる
[!IMPORTANT] 以下のPromptをAIにコピーして送信してください:
私のFastAPIバックエンドで、毎日定時に実行するスケジュールタスクを設定する必要があります。APSchedulerライブラリのAsyncIOSchedulerを使用してください。要件:1. 非同期関数auto_marketing_campaign()を作成し、まず"起動毎日マーケティングスクリプト..."と出力する2. FastAPIの@app.on_event("startup")ライフサイクルでSchedulerを初期化する3. cron jobを設定:毎日午前2時(hour=2, minute=0)に実行。テスト用に「10秒ごとに実行」する設定方法もコメントで記載4. scheduler.start()を起動するこのスケジューラがFastAPIのメインスレッドをブロックしないようにしてください
🤖 AIの企業向けタスクスケジューリングセンター:
from fastapi import FastAPI
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from datetime import datetime
app = FastAPI(title="Automated Marketing System")
# 非同期スケジューラの初期化
scheduler = AsyncIOScheduler()
async def auto_marketing_campaign():
"""毎日午前に自動起動する究極のマーケティングスクリプト"""
print(f"\n[{datetime.now()}] 🚀 システム自動起動:毎日のマーケティングと売上分析を開始...")
# 後でCrewAIチーム起動コードをここに追加
# FastAPIライフサイクル:サーバー起動時にアラームも起動
@app.on_event("startup")
async def startup_event():
print("⏰ 自動スケジューリングエンジンを初期化中...")
# スケジュールタスクを追加
# 本番環境:毎日午前2:00に実行
scheduler.add_job(auto_marketing_campaign, 'cron', hour=2, minute=0)
# 💡 テスト用:10秒ごとに実行(開発時はこれを使用、さもないと1日待つ必要あり)
# scheduler.add_job(auto_marketing_campaign, 'interval', seconds=10)
scheduler.start()
print("✅ スケジューリングエンジン起動成功!")
# サーバーシャットダウン時、アラームを適切に停止
@app.on_event("shutdown")
async def shutdown_event():
scheduler.shutdown()
🗄️ 実戦2:データベーススキャン:売れ残りキャンプサイトの発見
アラームが鳴り、マーケティングスクリプトが起動しました。 最初のステップ:Supabaseデータベースに接続し、「今週末に10以上の空きがあり、過去3日間予約がない」キャンプサイトを検索するコード(またはCrewAIのTool)を作成します。
💡 Vibe Prompt 実戦2:Supabase複雑ロジッククエリ
AIに推測させず、正確なPython関数でデータを取得します。
[!IMPORTANT] 以下のPromptをAIにコピーして送信してください:
auto_marketing_campaign()関数内で、まずSupabaseに接続し、売れ残りキャンプサイトを取得する必要があります。"camps"テーブルをクエリするコードを書いてください。条件:1. vacancy_countが10以上(空きが多い)2. is_activeがtrue(営業中のキャンプサイト)キャンプサイト名とIDを含む配列を返し、売れ残りキャンプサイトがない場合はスケジュールタスクを早期終了してください
🤖 AIの精密データスキャナー:
# supabase_clientはファイル上部で既に初期化済みと仮定
async def fetch_underperforming_camps():
try:
print("📊 Supabaseをスキャンして売れ残りキャンプサイトを検索中...")
response = supabase_client.table("camps") \
.select("id, name, feature, price, vacancy_count") \
.gte("vacancy_count", 10) \
.eq("is_active", True) \
.execute()
camps = response.data
if not camps:
print("🎉 素晴らしい!今週末の全てのキャンプサイトがほぼ満室、マーケティングスクリプトは不要です。")
return None
print(f"⚠️ {len(camps)}つのキャンプサイトで空きが多すぎます、緊急マーケティングが必要!")
return camps
except Exception as e:
print("❌ データベースクエリ失敗:", e)
return None
🧠 実戦3:CrewAI総動員:売れ残りキャンプサイト向けカスタムコピー作成
ここが最もエキサイティングな部分です。売れ残りキャンプサイト(例:「星空部族」、空き15、特徴「高山雲海」)を発見しました。 以前の方法なら、単純な文字列テンプレートでメールを送信していたかもしれません。しかし今、前章で作成した**CrewAIマルチエージェントチーム(研究者+コピーライター)**を召喚します。 「各」売れ残りキャンプサイトに対して、AIチームを派遣し、記事をカスタマイズします!
💡 Vibe Prompt 実戦3:データベース配列とCrewAIの動的統合
[!IMPORTANT] 以下のPromptをAIにコピーして送信してください:
Python配列underperforming_campsを取得しました。run_crewai_marketing(camp_info: dict)という関数が既に用意されており、CrewAIを起動して渡されたキャンプサイトの魅力的なプロモーションコピー文字列を生成します。配列内の各キャンプサイトに対してrun_crewai_marketing()を呼び出し記事を取得するループを書いてください。OpenAIのAPIレートリミットを回避するため、各キャンプサイト処理後にasyncio.sleep(5)で5秒間一時停止してください
🤖 AIの動的マーケティングファクトリー:
import asyncio
async def auto_marketing_campaign():
print(f"\n[{datetime.now()}] 🚀 毎日マーケティングスクリプトを起動...")
# 1. 売れ残りキャンプサイトを取得
camps_to_promote = await fetch_underperforming_camps()
if not camps_to_promote:
return # 早期リターン!
print("🤖 CrewAIマーケティング部門を召喚、カスタムコピー作成を開始...")
# 完成した全てのキャンペーンを収集する配列
final_campaigns = []
# 2. 各キャンプサイトに対してAI攻勢を開始
for camp in camps_to_promote:
print(f"✍️ 『{camp['name']}』の専用プロモーションコピーを作成中...")
# 前章で作成したCrewAIロジックを呼び出し(内部宣言は省略)
# データベースから取得した情報(価格、特徴など)をAIの背景資料として渡す
marketing_copy = run_crewai_marketing(camp)
final_campaigns.append({
"camp_id": camp['id'],
"camp_name": camp['name'],
"copy": marketing_copy
})
print(f"✅ 『{camp['name']}』コピー作成完了!")
# ⚠️ ブロック防止:AIが息つく時間を与え、OpenAI APIへの過剰なリクエストによる429エラーを防ぐ
await asyncio.sleep(5)
print(f"🔥 マーケティング部門が任務完了、合計{len(final_campaigns)}つの核となるコピーを生成!")
# 次に、これらのコピーを配信します...
🔍 詳細解析:
これはVibe Codingと従来のコードが織りなす最も美しい化学反応です。
データベースは「無機質なJSONデータ」を取得し、forループは「スケジューリングとエラー防止」を担当し、CrewAIは「魂と創造性」を注入します。
AIは{'name': '星空部族', 'feature': '雲海'}を受け取ると、次のような傑作を生み出します:
"都会の喧騒に疲れていませんか?この週末、星空部族の絶景雲海があなたを待っています。現在最後の15VIP席を限定解放中、静かな時間を確保するため今すぐリンクをクリック!"
📱 実戦4:最終決戦のラストアタック(Line Notify自動配信)
コピーが完成しましたが、メモリ内に保存するだけでは意味がありません。これらの記事を顧客の携帯電話に自動配信する必要があります。 最も簡単でコストが低い方法はLine Notifyを使用することです。
💡 Vibe Prompt 実戦4:Line API連携で最終発射
[!IMPORTANT] 以下のPromptをAIにコピーして送信してください:
複数のマーケティングコピーを含む配列final_campaignsを取得しました。send_to_line_notify(message: str)関数を作成してください。要件:1. httpxライブラリを使用し、https://notify-api.line.me/api/notifyにPOSTリクエストを送信2. HeaderにAuthorization: Bearer {LINE_NOTIFY_TOKEN}を含める3. payload(data)はmessage最後に、マーケティングスクリプト内でfinal_campaigns内の各記事を、偽の予約リンク(https://book.com/camp_id)と組み合わせ、send_to_line_notifyを呼び出して送信
🤖 AIの完全自動配信ランチャー:
import os
import httpx
async def send_to_line_notify(message: str):
"""
この関数は私たちのマーケティングマシンの発射台です。
苦労して作成した記事を、会社の上司や顧客のLineグループに配信します!
"""
token = os.getenv("LINE_NOTIFY_TOKEN")
if not token:
print("❌ LINE_NOTIFY_TOKENが見つかりません、送信をスキップします。")
return
headers = {
"Authorization": f"Bearer {token}"
}
data = {
"message": message
}
try:
# 発射!
async with httpx.AsyncClient() as client:
response = await client.post("https://notify-api.line.me/api/notify", headers=headers, data=data)
if response.status_code == 200:
print("📲 Lineメッセージ配信成功!")
else:
print("❌ Line APIエラー:", response.text)
except Exception as e:
print("❌ ネットワーク送信異常:", e)
# メインコードの最後に戻る...
for campaign in final_campaigns:
# 最終送信テキストを組み立て、行動喚起(Call To Action)を追加
final_message = f"\n\n🔥【週末最後のチャンス】🔥\n{campaign['copy']}\n\n👉 今すぐ予約:https://my-punch.vercel.app/book/{campaign['camp_id']}"
# 最終発射!
await send_to_line_notify(final_message)
print("\n🎉🎉🎉 本日の完全自動マーケティング作戦が完璧に終了!上司は収益を待つばかり!")
🏆 シリーズ完結の極意:Vibe CodingのCTO思考
この6000字に及ぶ究極の戦いが終わりました。 私たちが作成したこのシステムを注意深く観察すると、これは完全に人間の介入を必要としない閉じた自動化システムであることがわかります。
- トリガー層 (Trigger):APSchedulerが毎日午前にシステムを自動起動
- センサー層 (Sensors):PythonがSupabaseデータベースをスキャンし、「空き過多」の異常を検出
- 思考層 (Brain):CrewAIの上級研究者とコピーライターが起動し、データを分析して高い商業価値のある解決策(プロモーションコピー)を生成
- 行動層 (Action):Line Notify APIが解決策を現実世界の行動に変換し、プッシュ通知を顧客の携帯電話に送信
過去には、これら4つの層それぞれに以下が必要でした: 運用エンジニア(Cronjob作成)、データベースエンジニア(SQL作成)、マーケティング担当者(コピー作成)、バックエンドエンジニア(Line API連携)。4人の給与を合わせると月20万円以上。
しかしVibe Codingの時代では、どのライブラリの構文も暗記する必要はなく、Haversineの三角関数を自分で計算する必要もありません。 必要なのは**「アーキテクト思考 (Architect Mindset)」**だけです。 「ここにCron Jobを追加、ここに@toolを設定してAIにSupabaseを検索させ、ここでテキストをLine APIに渡す」と知っているだけで十分です。そして、この要件をCursor内のClaudeやChatGPTに平易な言葉で伝えると、百万ドル級の完璧なコードを生成してくれます。
卒業式:コードからプロンプトへ
これが最初にお話しした**「私たちはコードを書いているのではなく、���件とアーキテクチャを書