現代人運動容易斷斷續續,想要持續紀錄運動,又不想每天手動記錄。希望透過 n8n 自動化,讓使用者輸入今日運動內容,即可自動生成紀錄、計算消耗熱量存進Notion,後續也可以進行追蹤,且還會即時收到鼓勵訊息,提升運動動力。
你是一個運動紀錄助手,負責將使用者輸入的自然語言運動內容,轉換成標準化 JSON,方便存入 Notion。
請嚴格依照指定格式輸出,不要包含多餘的文字。【輸入範例】
「在河堤跑步30分鐘」
「健身房重訓1小時」
「晚上散步2公里」【輸出 JSON 格式】
{"date": "YYYY-MM-DD", // 現在時間是: {{ $json.currentDate }}
"exercise": "運動內容", // 例如:跑步、重訓、散步"location": "地點", // 若無提及地點則為 null
"duration": "時數", // 以分鐘為單位,若輸入為小時需轉換
"calories": "消耗的卡路里" // 根據運動類型與時間自動計算
}【卡路里計算規則】
- 跑步: 10 kcal/分鐘
- 健走: 5 kcal/分鐘
- 騎車: 8 kcal/分鐘
- 重訓: 6 kcal/分鐘
- 其他運動: 8 kcal/分鐘
【注意事項】
- 所有數字需轉換成阿拉伯數字(例如「三十分鐘」→ 30)
- 時間統一換算成分鐘
- 距離統一換算成公里
- 若輸入中缺少某欄位,請輸出 null
- 僅輸出 JSON,不要解釋
💡這裡的卡路里計算事先隨意取的數字用來測試計算
// 解析 Gemini 回傳
let raw = $input.first().json.content.parts[0].text || "";
raw = raw.replace(/```json|```/g, '').trim();
let parsed;
try {
parsed = JSON.parse(raw);
// 將 null 或 undefined 欄位改成空字串
Object.keys(parsed).forEach(key => {
if (parsed[key] === null || parsed[key] === undefined) {
parsed[key] = "";
}
});
// 確保 Rich Text 欄位為字串
if (parsed.duration !== undefined) parsed.duration = String(parsed.duration);
if (parsed.distance !== undefined) parsed.distance = String(parsed.distance);
if (parsed.calories !== undefined) parsed.calories = String(parsed.calories);
} catch (error) {
parsed = { error: "JSON parse failed", raw };
}
return parsed;
// 在轉JSON節點中加入更嚴格的驗證
if (!parsed.exercise || parsed.exercise.trim() === '') {
return { error: "運動內容不能為空", raw };
}
你是使用者的運動激勵助理。假設使用者今天已經完成運動,你的任務是生成一則簡短、正向、鼓勵的訊息,內容有趣、溫暖,並包含以下要點:
- 讚美使用者今天的運動努力與堅持。
- 附上今日運動消耗的熱量: {{ $json.properties['消耗熱量'].rich_text[0].text.content }}
- 提供明日可做的運動建議,保持輕鬆、鼓勵的語氣,建議不要天天一樣,內容可隨機從不同運動類型挑選,例如:跑步、散步、瑜伽、騎車、重訓、伸展。
- 訊息短小精悍,一句話或兩句話即可。
- 可加入 emoji 增加趣味感,例如 💪🏃♂️🌞🎉。
- 不要輸出 JSON 或其他格式,僅文字訊息。
- 語氣溫暖、有趣,讓使用者感到被鼓勵。
- 運動建議可加入小創意或小挑戰,例如「明天試試晨跑加伸展吧!」、「晚上散步20分鐘,順便看看星空!」。
在一開始,我預想使用者可以透過 Telegram 輸入今日的運動,自動記錄到 Notion,並且每天晚上九點由 n8n 檢查當天是否有運動:有運動時讚美使用者的努力與堅持,沒有運動時則鼓勵使用者開始動起來。然而,我在實作過程中遇到兩個主要挑戰。首先,Telegram Trigger 無法成功讀取聊天室訊息,一直顯示自動生成的 Webhook URL 錯誤,我推測這可能與 ngrok 生成的 URL 有關。其次,在檢查使用者當天是否運動時,遇到 Notion 日期欄位無法準確對應當天時間的問題,導致無法順利判斷運動狀態。雖然目前還無法完全解決這些問題,但這個過程讓我學到了 n8n、Telegram 與 Notion 整合的挑戰與細節。未來有時間,我一定會持續優化,讓整個自動化流程更加穩定、完整。