如何编写习惯打卡脚本

wen 实用脚本 31

从零搭建你的自动化自律系统

📖 文章目录导读

  1. 为什么你需要一个习惯打卡脚本?
  2. 核心设计思路:从“手动记录”到“自动追踪”
  3. 技术选型:Python、Bash 还是低代码工具?
  4. 手把手教你编写第一个打卡脚本
  5. 进阶功能:数据可视化、提醒与多平台同步
  6. 避免踩坑:常见错误与调试技巧
  7. 问答环节:关于习惯打卡脚本的 5 个高频问题

为什么你需要一个习惯打卡脚本?

你有没有这种经历:每天睡前想记录“今天阅读了30分钟”,但打开手机应用时,不是被消息打断,就是忘记具体数字,传统手动打卡的痛点在于:记录成本高、易遗忘、数据难以量化

如何编写习惯打卡脚本

习惯打卡脚本能帮你解决三大问题:

  • 自动化记录:无需手动输入,脚本自动抓取数据(从番茄钟软件读取专注时长)。
  • 趋势可视化:脚本输出 CSV/JSON 文件,可生成周/月度热力图。
  • 防遗忘机制:结合系统通知或 Webhook 推送,到点提醒你执行习惯。

真实案例:一位开发者用 Python 脚本自动记录每日饮水量(通过智能水杯 API),坚持 3 个月后,成功戒掉了含糖饮料,脚本让他无需分心记录,专注执行本身。


核心设计思路:从“手动记录”到“自动追踪”

编写脚本前,先明确你的“习惯三角”:

要素 说明 例子
触发器 什么事件启动打卡 特定时间、设备连接WiFi、程序启动
行为 要追踪的具体动作 运动时长、代码提交次数、阅读页数
数据存储 记录在哪里 本地CSV、Notion API、GitHub Gist

设计原则

  • 最小干预:脚本应静默运行,无需用户每次确认。
  • 容错机制:如果网络中断或数据源缺失,脚本应能缓存数据稍后重试。
  • 一次配置,长期运行:通过 cron 或系统调度器,让脚本在后台持续追踪。

技术选型:Python、Bash 还是低代码工具?

根据你的技术背景选择合适工具:

🔧 Python(推荐大多数用户)

  • 优点:丰富的第三方库(requestspandasschedule),支持 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:脚本意外终止

  • 解决:使用 supervisorsystemd 确保脚本常驻运行。
  • 或者写一个简单的自愈循环
    while True:
        try:
            run_main()
        except Exception as e:
            print(f"异常:{e},10秒后重启...")
            time.sleep(10)

问答环节:关于习惯打卡脚本的 5 个高频问题

❓ Q1:我没有编程基础,能写打卡脚本吗?

A:可以尝试低代码工具如 n8n,或者用“某书”的自动化工作流,如果坚持用代码,建议从第4章的基础版开始,只改 habit_namevalue 这两行。

❓ 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章的基础代码,然后运行它,即使只记录一个习惯,一周后你就会看到数据的变化,如果你在编写过程中遇到问题,欢迎留言讨论——每一个自律者都能从自动化中受益。

抱歉,评论功能暂时关闭!