🐂🐎 牛马专列:用飞书 Webhook 做的打工提醒机器人
有时候,我们并不是缺少动力,而是缺少一个温柔但坚定的「催更」。于是我写了一个小脚本,通过 飞书机器人 Webhook,每天在关键时间点提醒自己——该吃饭了、还有多久下班、再坚持一会儿就可以收工。

说实话,这个机器人没什么高尚的理由——纯粹是为了好玩。
我给它起了个特别接地气的名字:牛马专列。
每天到了几个关键时间点,它就会在飞书群里冒出来提醒:
- 该去吃饭了 🍚
- 离下班还有多久 🕒
- 再坚持一下就能收工 🏁
看起来像是在「关心」我,实际上更像是在用精确到分钟的方式提醒:你的打工时光又被收割了多少。
功能概览
- 自动时间点提醒
- 上午 10:50:饭点提醒
- 下午每个整点(13:00-17:00):下班倒计时提醒
- 下午 17:50:下班前 10 分钟提醒
- 自动计算今日已赚金额(按月薪 / 每月工作日 / 每天工作时长计算)
- 彩色飞书交互卡片,让提醒更醒目
- 防重复运行(文件锁机制)
- 自动日志记录(文件过大自动清理)
核心实现思路
1. 飞书 Webhook 发送消息 飞书支持用 POST 请求给 Webhook 发送消息卡片,脚本的 send_card()
函数就是负责构造 JSON 并调用 API。
def send_card(title, content_lines, header_title="提醒", color="turquoise"): payload = { "msg_type": "interactive", "card": { "config": {"wide_screen_mode": True}, "elements": [ { "tag": "div", "text": {"tag": "lark_md", "content": "\n".join(content_lines)} } ], "header": { "title": {"tag": "plain_text", "content": header_title}, "template": color } } } try: response = requests.post( WEBHOOK_URL, headers={"Content-Type": "application/json"}, data=json.dumps(payload), timeout=5 ) if response.status_code == 200: log(f"[{header_title}] 消息卡片发送成功") else: log(f"[{header_title}] 发送失败:{response.status_code} - {response.text}") except requests.exceptions.RequestException as e: log(f"[{header_title}] 网络请求异常: {e}")
2. 定时检查 脚本通过 while True 循环,每分钟检查当前时间是否到提醒点,如果到了就发一次。
3. 计算今日已赚 用 datetime 计算从上午 9 点到现在的工作时长,再结合时薪推算出今天赚了多少钱。
4. 防并发 用 fcntl 文件锁确保同一时间只运行一个实例,防止重复发消息。
代码地址:https://github.com/rainding0311/lark_webhook_reminder/tree/main
配置项说明
脚本顶部的几个变量可以根据需要调整:
变量 | 含义 | 默认值 | 说明 |
---|---|---|---|
WEBHOOK_URL | 飞书 Webhook 地址 | (你的地址) | 去飞书群聊添加机器人获得 |
INTERVAL | 循环检查间隔(秒) | 3600 | 实际本脚本里没直接用,逻辑里是固定 60 秒检查一次 |
LOG_FILE | 日志文件路径 | reminder.log | 记录发送情况和错误 |
LOCK_FILE | 锁文件路径 | reminder.lock | 防重复运行 |
MAX_LOG_SIZE | 日志最大大小(字节) | 5 MB | 超过会自动删除重建 |
MONTHLY_SALARY | 月薪(元) | 12000 | 用于计算今日已赚 |
WORK_DAYS_PER_MONTH | 每月工作天数 | 22 | 用于计算时薪 |
WORK_HOURS_PER_DAY | 每天工作时长(小时) | 8 | 用于计算时薪 |
飞书卡片效果
飞书支持给卡片加颜色和 Markdown 文本。脚本的 send_card()
里可以调整:
- header_title:卡片标题
- color:卡片主题色(blue、green、turquoise 等)
- content_lines:卡片正文内容(支持 Markdown 加粗、emoji)
示例提醒卡片:



运行方式
1. 安装依赖(仅需 requests):
pip install requests
2. 运行脚本:
python3 work_reminder_v2.py
3. 建议用 systemd、nohup 做常驻运行,避免因为终端关闭而中断。
nohup python3 work_reminder_v2.py &
当前局限性
- 错过时间不会补发 如果脚本启动时已经错过了提醒点(比如 10:50 才启动),不会补发之前的提醒。
- 时间触发依赖精确分钟匹配 检查间隔为 60 秒,所以如果某次循环刚好延迟超过一分钟,有可能错过提醒。
- 运行环境需常驻 需要在服务器、云主机或一直开的电脑上跑;本地临时运行不适合长期使用。
改进思路
- 启动时补发容错逻辑(错过不超过 X 分钟的提醒可补发)
- 支持节假日跳过
- 飞书卡片加互动按钮