AI习惯养成助手怎么搭:零基础自建打卡提醒与周报
很多人想养成习惯,但手动记录容易中断,用现成 App 又担心数据不在自己手里。
这篇教程面向零基础用户,教你用一台 Linux 服务器搭建一个可自托管的 AI习惯养成助手:每天收到打卡提醒,记录完成情况,每周自动生成一次总结。
整个过程不需要写复杂代码,按步骤执行即可。
先确认你的环境和要准备的东西
这套方案适合有一台能联网的 Linux 服务器(Ubuntu 22.04 或 Debian 12 均可),并且能用 sudo 执行命令的读者。
如果你只是想在本地电脑试用,也可以,但提醒功能需要服务器长期运行才可靠。
需要提前准备:
- 一台服务器,建议 1 核 1G 内存以上
- 一个能接收通知的渠道,本文用 Telegram Bot 举例,也可以换成邮件
- 一个 AI 模型的 API Key(用于生成周报),没有的话周报部分可以先跳过
先登录服务器,更新软件包并确认 Docker 可用:
sudo apt update && sudo apt upgrade -y
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
docker --version
如果 docker --version 能输出版本号,说明 Docker 安装成功。
部署打卡记录服务
这里用轻量的自托管打卡工具 Habitica 的替代方案——一个简单的 Flask 应用来记录习惯,数据存到 SQLite。
你不需要理解全部代码,按下面操作即可。
创建项目目录和文件:
mkdir -p ~/habit-assistant && cd ~/habit-assistant
nano app.py
把以下内容粘贴进去,保存退出(Ctrl+O 回车,Ctrl+X):
from flask import Flask, request, jsonify
import sqlite3, datetime
app = Flask(__name__)
DB = 'habits.db'
def init_db():
conn = sqlite3.connect(DB)
conn.execute('CREATE TABLE IF NOT EXISTS records (id INTEGER PRIMARY KEY, habit TEXT, date TEXT, done INTEGER)')
conn.commit()
conn.close()
@app.route('/check', methods=['POST'])
def check():
data = request.json
habit = data.get('habit', 'default')
done = data.get('done', 1)
today = datetime.date.today().isoformat()
conn = sqlite3.connect(DB)
conn.execute('INSERT INTO records (habit, date, done) VALUES (?, ?, ?)', (habit, today, done))
conn.commit()
conn.close()
return jsonify({'status': 'ok'})
@app.route('/report', methods=['GET'])
def report():
conn = sqlite3.connect(DB)
cur = conn.execute("SELECT habit, COUNT(*) FROM records WHERE done=1 AND date >= date('now','-7 days') GROUP BY habit")
rows = cur.fetchall()
conn.close()
return jsonify({'week': rows})
if __name__ == '__main__':
init_db()
app.run(host='0.0.0.0', port=5000)
写一个 Dockerfile 来打包:
FROM python:3.11-slim
WORKDIR /app
RUN pip install flask
COPY app.py .
CMD ["python", "app.py"]
构建并启动容器:
docker build -t habit-assistant .
docker run -d --name habit -p 5000:5000 -v ~/habit-assistant:/app habit-assistant
验证服务是否正常:
curl http://127.0.0.1:5000/report
返回 {"week":[]} 说明服务已运行,还没有记录。
配置每日提醒和打卡入口
提醒用 Linux 自带的 cron 定时任务实现。
先写一个提醒脚本 remind.sh:
#!/bin/bash
curl -s -X POST https://api.telegram.org/bot<你的BOT_TOKEN>/sendMessage \
-d chat_id=<你的CHAT_ID> \
-d text="该打卡了:今天完成习惯了吗?回复 /done 记录"
给脚本执行权限,并加到 crontab,每天早上 8 点提醒:
chmod +x remind.sh
crontab -e
在末尾添加一行:
0 8 * * * /home/你的用户名/habit-assistant/remind.sh
保存后,可以用 crontab -l 确认任务已写入。
想测试提醒是否生效,把时间改成下一分钟,观察 Telegram 是否收到消息。
打卡入口可以直接调用接口:
curl -X POST http://127.0.0.1:5000/check -H "Content-Type: application/json" -d '{"habit":"早起","done":1}'
返回 {"status":"ok"} 表示记录成功。
用 AI 生成每周习惯总结
每周日晚上,让脚本拉取 /report 数据,发给 AI 模型生成一段总结,再推送到 Telegram。
写一个 weekly.sh:
#!/bin/bash
DATA=$(curl -s http://127.0.0.1:5000/report)
SUMMARY=$(curl -s https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer <你的API_KEY>" \
-H "Content-Type: application/json" \
-d "{\"model\":\"gpt-4o-mini\",\"messages\":[{\"role\":\"user\",\"content\":\"根据以下打卡数据,用中文写一段100字以内的鼓励总结:$DATA\"}]}" \
| grep -o '"content":"[^"]*"' | cut -d'"' -f4)
curl -s -X POST https://api.telegram.org/bot<你的BOT_TOKEN>/sendMessage \
-d chat_id=<你的CHAT_ID> \
-d text="本周习惯总结:$SUMMARY"
同样加入 crontab,每周日 21 点执行:
0 21 * * 0 /home/你的用户名/habit-assistant/weekly.sh
注意:AI 模型的接口地址和可用模型可能变化,请以你所用服务商的文档为准。
如果不想接 AI,也可以直接把 /report 的原始数据发到通知里,手动看统计。
容易踩的几个坑
- 容器重启后数据丢失:启动时一定要加
-v挂载目录,把 SQLite 文件留在宿主机上。 - cron 不执行:脚本里用绝对路径,检查
crontab -l是否有任务,查看/var/log/syslog里 cron 的日志。 - Telegram 收不到消息:确认 Bot Token 和 Chat ID 正确,并且你已经主动给 Bot 发过一条消息,否则 Bot 无法主动推送。
- 端口冲突:如果 5000 端口被占用,把
docker run的-p 5000:5000改成-p 5001:5000,同时修改脚本里的访问地址。 - 防火墙拦截:如果从外部访问接口,需要在安全组或
ufw中放行对应端口,但建议只在内网调用,减少暴露风险。
怎么确认整套流程跑通了
按顺序做三个检查:
- 手动执行
remind.sh,看通知是否到达。 - 调用一次
/check接口,再请求/report,确认返回数据里出现记录。 - 把
weekly.sh的执行时间改到下一分钟,观察是否收到 AI 总结消息。
三个检查都通过后,把 crontab 时间改回正常计划。
之后每天只需在收到提醒时调用一次打卡接口,或做一个简单的快捷指令,就能持续记录。
这套 AI习惯养成助手 的核心是把记录、提醒和总结拆成独立的小步骤,任何一步出问题都容易定位。
如果你后续想换成邮件提醒或接入其他 AI 服务,只需要替换 remind.sh 和 weekly.sh 里的通知与请求部分,数据层不用改动。