🚀 第十三章:Automated Marketing 終極行銷機器人

恭喜你來到了 Vibe Coding 課程的最高殿堂! 回顧我們過去學到的東西:

  • 我們在 AstroReact 中打造了炫酷的玻璃擬態前端。
  • 我們在 car-camping-map 中實作了 Leaflet 的地圖互動與 Supabase 資料庫串接。
  • 我們在 line-punch-web 打造了能承受萬人並發、防作弊的 FastAPI 巨獸後台。
  • 最近,我們學會了用 CrewAI 組建一群會自己上網、查資料、寄 Email 的超級 AI 傭兵團。

現在,老闆給你下達了最後一個任務,這是一個價值百萬的 SaaS 核心功能: 「我希望系統每天凌晨 2 點,自動去資料庫檢查哪些露營地的訂房率太低。然後自動讓 AI 寫一篇超有吸引力的促銷貼文,隔天早上 9 點自動透過 Line 或 Email 推播給過去來過的 VIP 客戶。」

這是一個橫跨「資料庫查詢」、「多代理 AI 協作」、「非同步自動化腳本」的終極考驗。 這堂 6000 字的期末戰役,我們將不用傳統的程式碼死嗑,我們將用高階 Vibe Prompt 指揮 AI,將這三個系統完美縫合,打造出一台真正的 自動化印鈔機


🕒 實戰 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 秒執行一次 (開發階段請用這個,不然你要等一天)
    # scheduler.add_job(auto_marketing_campaign, 'interval', seconds=10)
    
    scheduler.start()
    print("✅ 排程引擎啟動成功!")

# 伺服器關閉時,優雅地關掉鬧鐘
@app.on_event("shutdown")
async def shutdown_event():
    scheduler.shutdown()

🗄️ 實戰 2:資料庫探測器:找出滯銷的營地

鬧鐘響了,行銷腳本啟動了。 第一步:我們必須寫一段程式碼(或是寫一個 CrewAI 的 Tool),連進 Supabase 資料庫,把「這個週末還有超過 10 個空位,且過去 3 天沒有人預訂」的營地撈出來。

💡 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() 取得文章。 為了避免 AI 被 OpenAI 鎖定 API (Rate Limit),請在每一個營地處理完後,使用 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': '雲海'} 後,產出一篇類似這樣的心血結晶:

"厭倦了城市的喧囂嗎?這個週末,星空部落的絕美雲海正等著你。目前限量釋出最後 15 個VIP席位,快點擊連結搶訂你的寧靜時刻!"


📱 實戰 4:大結局的最後一擊 (Line Notify 自動推播)

文案寫好了,不能只是存在記憶體裡面。我們要把這些文章自動送到客戶的手機裡。 最簡單、成本最低的方式就是使用 Line Notify

💡 Vibe Prompt 實戰 4:串接 Line API 執行最終發射

[!IMPORTANT] 請複製以下 Prompt 傳送給 AI:

我取得了一個包含多篇行銷文案的陣列 final_campaigns。 請寫一個函數 send_to_line_notify(message: str)。 需求: 1. 使用 httpx 套件,發送 POST 請求到 https://notify-api.line.me/api/notify。 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 字的終極戰役結束了。 如果你仔細觀察我們剛剛寫出的這套系統,你會發現這是一套完全不需要人類介入的封閉式自動化系統

  1. 觸發層 (Trigger):APScheduler 每天凌晨定時喚醒系統。
  2. 感知層 (Sensors):Python 去 Supabase 資料庫探測營運數據,發現「空位太多」的異常狀況。
  3. 思考層 (Brain):CrewAI 裡的高階研究員與文案大師被啟動,分析數據並產生極具商業價值的解決方案(促銷文案)。
  4. 行動層 (Action):Line Notify API 將解決方案化為真實世界的行動,把推播訊息送到客戶的手機上。

在過去,這 4 個層次分別需要: 一個維運工程師 (寫 Cronjob)、一個資料庫工程師 (寫 SQL)、一個行銷專員 (寫文案)、一個後端工程師 (接 Line API)。四個人的薪水加起來一個月超過 20 萬。

而在 Vibe Coding 的時代,你不需要背誦任何一個套件的語法,你不需要自己去算 Haversine 三角函數。 你只需要擁有 "架構師的思維 (Architect Mindset)"。 你只需要知道:「這裡要加個 Cron Job、這裡要掛個 @tool 讓 AI 去查 Supabase、這裡要把文字丟給 Line API」。然後,你用白話文把這個需求講給 Cursor 裡的 Claude 或 ChatGPT 聽,它就會為你產出百萬年薪等級的完美程式碼。

結業式:從寫 Code 到寫 Prompt

這就是我們一開始說的:「我們不是在寫程式碼,我們在寫需求與架構。」 你不再是一個「幫公司把畫面的按鈕從藍色改成紅色的打工人」。 你現在是一個能夠利用 AI 瞬間建構出複雜 SaaS 系統、自動化行銷系統、防作弊考勤系統的 「超級個體」

去尋找世界上還沒有被自動化的角落,去尋找那些還在用 Excel 複製貼上、用人工計算薪水、用大腦瞎猜該寫什麼文案的中小企業。 把這堂課教你的技能用在他們身上,你就能創造出不可思議的商業價值!

恭喜你完成了這門極致硬核的 Vibe Coding 全端實戰大師課程!現在,去創造屬於你的系統吧!

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!