🐂🐎 牛马专列:用飞书 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 分钟的提醒可补发)
  • 支持节假日跳过
  • 飞书卡片加互动按钮