Serverless定时任务实现每日自动签到:接口分析与云函数部署实践
把手动签到改成自动定时任务这件事,我是在连续第三天忘记点开 Trae 签到页面之后才下决心搞的。倒不是说积分有多值钱,而是这种“明明可以自动化却每天手动点一下”的事情,一旦开始在意,就会非常难受。Trae 这类 AI 编程工具的每日签到本质上是调用一个后端接口,服务器只要收到正确的请求,就会返回今日积分获取成功的响应。既然这样,任务就变成了三件事:把这个接口找到、按它的规则构造请求、在固定的时间自动跑一遍。
当时我第一反应是丢在服务器上用 cron,后来想了想,也看了下手上那台 ECS 的到期时间,还是决定用 Serverless 定时任务来做。整个项目从逆向请求到上线运行不到一天,后面运维了半个多月,整体非常稳定。这篇复盘我会把选型理由、接口分析、代码实现、云函数部署、定时触发器配置,以及我实际踩过的几个坑全部串起来讲,希望能给想把类似签到、打卡、定时推送做成自动化的人一点参考。
1. 从“每天手点一次”到“彻底放手”:为什么选 Serverless 而不是挂机
很多人的第一反应是:写个 Python 脚本,放到自己的服务器或电脑上,用 crontab 定时跑不就行了。这个思路没错,但对“签到”这种低频、轻量、要求不高的小任务来说,Serverless 其实是更合适的载体。我从成本、可用性和维护负担三个维度展开讲一下。
1.1 签到任务本质上是什么
一个签到请求的生命周期非常简单:定时器触发 -> 拼装请求参数 -> 发送 HTTP 请求 -> 接收响应 -> 判断成功或失败 -> 记录日志。
整个过程通常只需要几秒钟,占用内存很小,网络开销也基本可以忽略。这正好踩中了 Serverless 的理想使用场景,短时、低频、可重试、无状态。
更关键的一点是:签到任务有时间点要求。Trae 的每日签到奖励是按自然日计算的,意味着我必须在北京时间每天某个固定时间之前完成请求。而我那台云服务器和我的作息并不同步,万一当晚有发布操作影响了网络,或者服务器被某个定时备份占满 IO,签到就悄悄失败了。
而云函数天然支持配置规则触发,到点就拉起一个短暂运行的实例,执行完自动销毁。整个过程不依赖任何常驻进程,也不占用机器的进程和端口。
1.2 本机/服务器方案的问题出在哪
用本机跑主要有两个问题:
第一是定时可靠性。笔记本合盖、休眠、断电、系统重启,都可能让 cron 错失执行点。就算你用 mac 的 launchd 或者 Windows 任务计划程序,也无法避免“当时没开机”这个物理事实。把脚本放远程服务器会好一些,但服务器本身也有维护成本:要装 Python 环境、配 venv、处理依赖升级、写日志轮转,还要定期检查进程是否活着。
第二是安全边界。签到请求携带登录凭证,也就是 Cookie 或者 Token。如果这个凭证躺在你的服务器磁盘上,而你的服务器同时又跑着 Web 服务、数据库或者别的东西,一旦出现漏洞,凭证就可能被顺带拖走。放本机相对安全,但同样存在磁盘读取面。
相比之下,云函数代码里不保存任何文件,凭证放在环境变量中,调用时只有该函数的执行环境能读取,这个隔离级别对敏感信息非常友好。
1.3 Serverless 的实际成本账单
以腾讯云函数和阿里云函数计算为例,每个月都有免费额度。签到任务每次运行大概 2~5 秒,配置 64MB 内存,一天两次(加一个重试补偿)也就是每个月 300 次调用左右,资源用量小到可以忽略,基本处于免费额度内。
对比一台最低配的云服务器动辄六七十块的月租,这里就省下了整笔开销。而且云函数的计费单位是“调用次数 × 内存 × 执行时长”,你不需要为“一个几乎总是空闲的进程”付费。
我最终选了腾讯云 SCF。一个原因是它的 Python 运行时更新比较及时,内置 requests、pycryptodome 这些常用库的依赖安装也非常直接;另一个原因是它的定时触发器配置页面支持直接选“每天”这种模板,对只想配一个签到任务的人更友好。
2. 签到请求的逆向与分析:先把单次调通再谈自动化
自动化之前,我必须先搞清楚 Trae 的签到接口到底长什么样。这一节的内容适用于绝大多数网页端签到类产品,不只是 Trae。
2.1 抓包:从浏览器控制台入手
我这里的操作路径是:打开 Trae 网页版登录后台,调出浏览器开发者工具,切到 Network 面板,刷新页面并手动点击签到按钮,观察网络请求。
因为签到是一个明显的异步动作,页面不会整页跳转,所以过滤 XHR/Fetch 请求后,几乎一眼就能看到那个签到接口。通常 URL 中包含 checkin、sign、daily 之类关键词,响应体一般直接返回 {"code": 0, "data": {}} 或者带积分数字的 JSON。
把请求头和请求体整体复制下来,后面构造代码时的所有参数都以这里为准。
由于我抓到的接口涉及内部字段,不便完整暴露,这里给一个通用的结构模板,原理一致,具体字段名请以实际抓包结果为准: