这玩意儿本质上是个自虐系统。我写了个爬虫每天凌晨三点去抓我体脂秤的数据,再用Selenium模拟登录Keep把运动时长扒下来,最后用Python的schedule模块搞了个定时任务把数据怼进Airtable。整个流程跑通那天我对着命令行笑了十分钟——这他妈不就是我去年给客户做的数据中台雏形吗,现在用来监控自己肚子上那几两肉。
最毒的是那个惩罚机制。我在代码里设了个if判断:如果连续三天日均运动时长低于30分钟,就自动调用支付宝的API往壹基金捐200块钱。不是那种手动扫码,是真·程序化捐赠,用的是支付宝开放平台的即时到账接口。为了拿到商户密钥我甚至注册了个体工商户执照,就为了让自己肉疼。上个月有次连续加班到凌晨,第三天晚上11点50分我手机突然震了一下,支付宝扣款成功的通知弹出来,我盯着屏幕愣了两秒,然后抓起瑜伽垫开始做波比跳——钱已经捐出去了,但那股屈辱感逼着我必须动起来。
团队里那帮小孩听说我在搞这个,眼神里都是“老板又他妈在折腾什么行为艺术”。他们不懂,这种代码层面的强制约束是我现在唯一能抓住的控制感。白天在公司被各种需求变更和客户催款搞得焦头烂额,晚上回家连自己的身体都管不住?那我还写什么代码当什么产品经理。爬虫部分最恶心的是体脂秤那个私有协议,厂家根本不给API文档,我逆向抓包发现数据是通过蓝牙同步到手机APP再上传云端的,最后干脆用mitmproxy劫持了APP的HTTPS流量,才拿到那个带着时间戳和体脂率的JSON结构。
Keep那边更离谱。他们前端用的是React,运动时长那个数字藏在三层嵌套的组件里,XPath路径长得能绕办公室一圈。我本来想用requests直接调接口,结果发现登录态验证用了动态token,每次请求都要带个加密参数,算法还混淆过。最后妥协了,用无头Chrome加载整个页面,等DOM渲染完了再用PyQuery去抠那个class名是“duration-num”的span标签。效率低得感人,但至少能跑起来。
数据进了Airtable之后才算有点意思。我搭了个看板,左边是折线图显示最近30天体脂率变化,右边是个日历热力图标记运动天数,中间用红色大字标着“本月已捐款金额”。有时候凌晨开完会回来,看着屏幕上那个刺眼的红色数字,会觉得这套系统像个冷酷的狱卒——但正是这种代码构建的绝对理性,在对抗着我日益失控的生活节奏。上周末团建喝酒到半夜,第二天早上六点爬虫准时执行,数据同步后看板自动变红,我眯着眼看到手机推送的“惩罚机制已触发”,宿醉瞬间醒了一半。
团队管理这摊子事让我意识到,人的变量太多太难控。但代码不会骗人,if else逻辑链不会跟你讨价还价,运动时长不够就是不够,到点就扣款。这种粗暴的确定性反而成了某种心理锚点。昨天有个程序员问我为什么不直接用现成的健康类APP,我说那些产品的提醒太温柔了,通知权限一关就形同虚设。而我的系统里,捐款接口的回调函数写死了无法撤销,就像射出去的箭没有回头路——这才是对抗人性惰性的核武器。
现在这套东西已经跑了47天,触发过3次捐款,累计600块。肉疼吗?真疼。但更疼的是看着自己写出来的代码像面镜子,照出我连最基本的身材管理都需要靠外部强制力才能维持。或许明年这时候,我会把这套系统开源,加个微信机器人提醒功能,甚至集成到钉钉打卡里。但眼下,它只是我私人订制的数字牢笼,而我是自愿走进去的那个囚徒。














