「自动换头像」机器人


发布于

|

分类

,

「自动换头像」机器人是2021年十一期间搞出的一个小创意。上线之后也没咋维护。目前用的人越来越多,就写篇博客记录一下。

起因

某同学在Twitter上说,组里有同事每天上班时候将头像换成彩色的,下班时候将头像换成黑白的。

我觉得这个创意很有意思,于是就想着能不能写个啥东西自动来搞。

选型

首先是Lark的接口支持。看到「通讯录-用户-修改用户部分信息」里面有「avatar_key」,觉得这事儿能成。申请了权限,竟然给批下来了。

然后是基础组件。那段时间刚刚学Go不久,本来想用Go来写,但找了一圈,没发现啥比较好用的crontab库(都是更高大上的定时任务平台。一牵扯「平台」就太重了)。但是Python里面发现了APScheduler这个库,看上去还比较好用。

开始写

整个项目不大,分成几个部分:

  1. 用户要能设置自己的头像。那么头像怎么来?第一想法是哪只个头像库,然后一想,哎,搞自定义上传多好呀。正好在「消息-图片信息-上传图片」那里可以设置成「avatar」,就是专门用来设置头像的。
  2. 上传好的头像,和用户关联起来,存数据库里面。
  3. APScheduler可以自行设置crontab,那么就用上这个能力,让用户自己写crontab。写好后,将「用户-crontab-头像」作为一个任务,存到数据库里。
  4. 剩下的东西,交给APScheduler来完成就好了:它自己从数据库里面读取每个任务,调用对应的API来换头像。
  5. 可管理。有时候需要删除一些任务,有时候需要删除旧头像。头像还好说,直接把Lark返回的key暴露给用户即可;任务的话,可以自己搞个UUID,和用户ID一起当作主键。管理接口用最经典的「命令」方式来实现,就是说,如果一条消息是「/」开头,那么认为是个命令。

于是整体流程就和设想的差不多:

  1. 用户给机器人发图片,图片直接送Lark的图片上传接口,拿到图片Key。
  2. 图片key和用户ID一起存数据库(偷懒,直接用了mongo)
  3. 用户可以用指令,查询自己ID所关联的所有图片key
  4. 用户可以设置换头像任务,格式是”/set <crontab> <avatar_key>”,然后是一些检查,例如这个头像key在不在库里、有没有和自己关联。如果检查通过,那么调用APScheduler创建一个任务,并把任务ID记录到数据库内
  5. 用户可以查询自己关联的所有任务
  6. APScheduler会在后台自动管理一切,包括定时触发、执行、设置任务下次运行时间。如果由于一些原因任务没执行(例如实例挂了),还能自动重新执行那些被错过的任务。

好了,完美。

问题

第一个大问题是审核……我哪知道还能碰到这问题啊……当时,有些人上传了一些能触发审核的图片,然后就触发审核了,然后头像就被自动删了,就404了。于是你在群里发言,全群人看到的都是「头像无法显示」的404,于是Lark后台开始报警「头像下载404增多」。于是Lark的人就找到我这儿来了……emmmmm

第二个问题是各种延迟/不同步。换头像之后,自己这边是立刻就更新了,别人大概率需要手动点击你的资料卡,才能看到你换头像了。这还不算,由于公司里系统众多,每个系统拉用户资料的时间都不太一致,所以公司里云平台的头像、Git的头像、模型训练平台的头像、sso的头像……同一时间全tm不一样。就很诡异。

后续本来想加上根据排班表来换头像,研究了一下API,似乎「不通用」。也想做自动跳过法定假日,但没找到合适的API,加上「能让用户输入进去」这事儿没想通,就也搁置了。

成就

我也没统计到底多少人用了这个东西、也没统计有多少换头像任务,反正没超QPS上限,说明文档三天两头被传播一圈儿。记得去年大概看了下,好像有400~500个任务在跑着。

功能比较单一,所以也不用咋维护,一个数据库,一个实例,跑了两年多了没宕机。得益于强大的APScheduler,甚至可以多搞几个实例做分布式。不过用户量不大,似乎没啥必要。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注