从零搭建你的自动化自律系统
📖 文章目录导读
- 为什么你需要一个习惯打卡脚本?
- 核心设计思路:从“手动记录”到“自动追踪”
- 技术选型:Python、Bash 还是低代码工具?
- 手把手教你编写第一个打卡脚本
- 进阶功能:数据可视化、提醒与多平台同步
- 避免踩坑:常见错误与调试技巧
- 问答环节:关于习惯打卡脚本的 5 个高频问题
为什么你需要一个习惯打卡脚本?
你有没有这种经历:每天睡前想记录“今天阅读了30分钟”,但打开手机应用时,不是被消息打断,就是忘记具体数字,传统手动打卡的痛点在于:记录成本高、易遗忘、数据难以量化。

习惯打卡脚本能帮你解决三大问题:
- 自动化记录:无需手动输入,脚本自动抓取数据(从番茄钟软件读取专注时长)。
- 趋势可视化:脚本输出 CSV/JSON 文件,可生成周/月度热力图。
- 防遗忘机制:结合系统通知或 Webhook 推送,到点提醒你执行习惯。
真实案例:一位开发者用 Python 脚本自动记录每日饮水量(通过智能水杯 API),坚持 3 个月后,成功戒掉了含糖饮料,脚本让他无需分心记录,专注执行本身。
核心设计思路:从“手动记录”到“自动追踪”
编写脚本前,先明确你的“习惯三角”:
| 要素 | 说明 | 例子 |
|---|---|---|
| 触发器 | 什么事件启动打卡 | 特定时间、设备连接WiFi、程序启动 |
| 行为 | 要追踪的具体动作 | 运动时长、代码提交次数、阅读页数 |
| 数据存储 | 记录在哪里 | 本地CSV、Notion API、GitHub Gist |
设计原则:
- 最小干预:脚本应静默运行,无需用户每次确认。
- 容错机制:如果网络中断或数据源缺失,脚本应能缓存数据稍后重试。
- 一次配置,长期运行:通过 cron 或系统调度器,让脚本在后台持续追踪。
技术选型:Python、Bash 还是低代码工具?
根据你的技术背景选择合适工具:
🔧 Python(推荐大多数用户)
- 优点:丰富的第三方库(
requests、pandas、schedule),支持 API 调用和复杂逻辑。 - 缺点:需安装 Python 环境。
- 适用场景:需要从多个数据源汇总的习惯(如“每天 GitHub 提交 + 微信读书时长”)。
⚙️ Bash/Shell
- 优点:系统自带,无需额外依赖,适合简单的命令日志。
- 缺点:处理 JSON 和 API 能力弱。
- 适用场景:记录“每天开机时间”、“终端命令使用次数”。
📱 低代码/无代码工具(如 Node-RED、n8n)
- 优点:可视化拖拽,适合非程序员。
- 缺点:灵活性有限,依赖服务商。
- 适用场景:快速搭建原型,无需编写代码。
我的建议:如果你会一点点 Python,直接用它,下面所有示例均基于 Python 3.9+。
手把手教你编写第一个打卡脚本
1 基础版本:手动记录每天阅读时间
import csv
from datetime import datetime
def log_habit(habit_name: str, value: float, unit: str = "分钟"):
filename = f"{habit_name}_log.csv"
with open(filename, 'a', newline='') as f:
writer = csv.writer(f)
# 如果文件为空,写表头
if f.tell() == 0:
writer.writerow(["timestamp", "habit", "value", "unit"])
writer.writerow([datetime.now().isoformat(), habit_name, value, unit])
print(f"✅ 已记录 {habit_name}: {value} {unit}")
# 使用示例
log_habit("阅读", 30) # 记录今日阅读30分钟
运行方式:在终端执行 python habit.py,输入参数即可记录,但每次手动运行仍不够“自动”。
2 自动版本:定时检查并记录
利用 schedule 库实现每天特定时间自动提醒并记录:
import schedule
import time
def check_and_log():
# 这里可以集成其他数据源,例如读取某个文件中的数字
value = prompt_user("今天阅读了多少分钟?请在 5 秒内输入数字:", timeout=5)
if value:
log_habit("阅读", float(value))
def prompt_user(prompt, timeout):
import threading, sys
user_input = [None]
def input_thread():
user_input[0] = input(prompt)
t = threading.Thread(target=input_thread)
t.daemon = True
t.start()
t.join(timeout)
return user_input[0]
schedule.every().day.at("22:00").do(check_and_log) # 每晚10点提醒
while True:
schedule.run_pending()
time.sleep(1)
注意:这个版本仍然需要你在终端输入数字,如果你希望完全自动化,需要找到“可自动采集的数据源”。
3 完全自动化版本:从云端 API 获取数据
假设你用了一个“Forest 专注森林”的 API(或其他工具),脚本可以自动拉取数据:
import requests
import json
def fetch_forest_focus():
# 替换为你的 API 参数
url = "https://example.com/api/forest/today"
headers = {"Authorization": "Bearer YOUR_TOKEN"}
resp = requests.get(url, headers=headers, timeout=10)
if resp.status_code == 200:
data = resp.json()
minutes = data.get("total_minutes", 0)
return minutes
else:
print("❌ 获取数据失败,将重试...")
return None
# 在定时任务中调用
def auto_log_focus():
mins = fetch_forest_focus()
if mins:
log_habit("专注", mins)
else:
# 缓存重试逻辑
with open("error_cache.txt", "a") as f:
f.write(f"{datetime.now()}: 专注数据获取失败\n")
核心要点:找到你习惯工具的开放 API 或网页爬虫接口,让脚本自主采集。
进阶功能:数据可视化、提醒与多平台同步
1 数据可视化:用 Matplotlib 生成周报
import pandas as pd
import matplotlib.pyplot as plt
def generate_weekly_chart(habit_name):
df = pd.read_csv(f"{habit_name}_log.csv")
df['timestamp'] = pd.to_datetime(df['timestamp'])
df['week'] = df['timestamp'].dt.isocalendar().week
weekly_sum = df.groupby('week')['value'].sum()
plt.figure(figsize=(10, 5))
weekly_sum.plot(kind='bar', color='skyblue')
plt.title(f'{habit_name} 周报')
plt.ylabel(habit_name)
plt.tight_layout()
plt.savefig(f'{habit_name}_weekly.png')
2 多平台同步:写入 Notion 数据库
利用 notion-py 库,一键将打卡数据同步到 Notion:
from notion_client import Client
def sync_to_notion(habit_name, value):
notion = Client(auth="YOUR_NOTION_TOKEN")
database_id = "YOUR_DATABASE_ID"
notion.pages.create(
parent={"database_id": database_id},
properties={
"Date": {"date": {"start": datetime.now().strftime("%Y-%m-%d")}},
"Habit": {"title": [{"text": {"content": habit_name}}]},
"Value": {"number": value}
}
)
3 智能提醒:结合系统通知或 Telegram Bot
import subprocess
def send_notification(title, message):
# macOS 系统通知
cmd = f'osascript -e \'display notification "{message}" with title "{title}"\''
subprocess.run(cmd, shell=True)
# 使用
send_notification("习惯提醒", "已记录今日阅读30分钟")
避免踩坑:常见错误与调试技巧
⚠️ 错误1:API 调用超时或限流
- 解决:添加
time.sleep(1)和重试机制(最多3次)。 - 示例:
for attempt in range(3): try: resp = requests.get(url, timeout=5) break except: time.sleep(2 ** attempt)
⚠️ 错误2:文件冲突(同时写入同一 CSV)
- 解决:使用文件锁(
fcntl库)或改用 SQLite 数据库。 - 简单方案:文件名添加日期,每天一个新文件。
⚠️ 错误3:时区问题导致数据错乱
- 解决:统一使用 UTC 时间存储,显示时再转换成本地时间。
- 代码:
from datetime import timezone utc_time = datetime.now(timezone.utc)
⚠️ 错误4:脚本意外终止
- 解决:使用
supervisor或systemd确保脚本常驻运行。 - 或者写一个简单的自愈循环:
while True: try: run_main() except Exception as e: print(f"异常:{e},10秒后重启...") time.sleep(10)
问答环节:关于习惯打卡脚本的 5 个高频问题
❓ Q1:我没有编程基础,能写打卡脚本吗?
A:可以尝试低代码工具如 n8n,或者用“某书”的自动化工作流,如果坚持用代码,建议从第4章的基础版开始,只改 habit_name 和 value 这两行。
❓ Q2:脚本记录的数据存储在哪里最安全?
A:推荐本地 SQLite 或 CSV(方便用 Excel 打开),如需云同步,优先选择 GitHub Gist 或 Notion(免费版有 API 限额),不建议直接存到公开的云端存储。
❓ Q3:如何处理“某一天忘记记录”的情况?
A:在脚本中添加“补录接口”,你可以手动执行 python habit.py --backfill 2025-02-01 阅读 45,通过定时提醒降低遗忘概率。
❓ Q4:每天跑脚本会不会消耗很多电量?
A:几乎可以忽略,Python 脚本单次运行仅需几 KB 内存,比刷短视频省电多了,如果担心,可以用 cron 设置每天运行一次,运行完自动退出。
❓ Q5:脚本能同时追踪多个习惯吗?
A:你可以创建一个字典存储不同习惯的 API 地址,用循环逐一采集,也可以设计一个配置文件 habits.json,让脚本动态加载。
{
"阅读": {"source": "forest_api", "unit": "分钟"},
"跑步": {"source": "strava_api", "unit": "公里"}
}
从“写脚本”到“养成习惯”
真正改变你的不是脚本,而是持续的观测,脚本只是帮你搬开了“记录”这块绊脚石,当你不再纠结“今天要不要打卡”,而是让脚本默默替你记账时,习惯就变得像呼吸一样自然。
下一步行动:打开终端,创建 habit.py 文件,贴上第4章的基础代码,然后运行它,即使只记录一个习惯,一周后你就会看到数据的变化,如果你在编写过程中遇到问题,欢迎留言讨论——每一个自律者都能从自动化中受益。