一个月前写了i南航打卡的机器人,但 HeroKu 免费账户并不支持定时运行打卡函数,所以白嫖失败,HeroKu 会自动停止机器人的运行,所以利用 python schedule 无效,直到下一次用户发消息唤醒云函数。部署 HeroKu 的过程可见上一篇文章:
由此想到可以使用 vercel 部署 bot,虽然最后折腾成功了,但还是不支持定时唤醒。官方文档:
官方并不支持定时运行云函数,要是早点看到就好了,折腾了这么久。官方推荐使用 Github Actions 定时执行。下一篇文章就填坑使用 GitHub Actions 部署自动打卡函数。
折腾过程中发现中文互联网几乎没有关于部署 vercel 无服务器函数的文章,权当是一次部署 vercel 的经验做一个记录吧。项目地址:
GitHub - yym68686/tgbot at vercel
借用橄榄球的比喻,想想四分卫的所有职责:投掷传球、将球传给后卫,等等。如果说四分卫就像球队环境中的微服务(提供“四分卫”服务),那么这些较小的活动中的每一项都是一个函数。但是,微服务和函数之间的界限有时会模糊不清,就像球队中某些球员只执行一项动作(如踢球手)一样。
References
https://www.cloudflare.com/zh-cn/learning/serverless/glossary/serverless-microservice/
因为要部署到 vercel,私以为学习的最好办法就是照着开源项目自己看一遍源码,在 GitHub 找了一个 bot 部署到 vercel 的模板。
GitHub - odysseusmax/calculator-bot: Simple Serverless Telegram Bot on vercel.com
用到了 flask 做路由。通过设置 Webhook 唤醒云函数响应用户操作。在原项目的基础上做开发,并将代码上传到项目的 vercel 分支。
Settings → Git 设置构建不同分支Settings → Environment Variables 添加 DATABASEID BOT_TOKEN NotionToken 这三个环境变量,DATABASEID 是 Notion 数据库 ID,NotionToken 是 Notion 开发者 Token,具体见:Notion API 使用 获取block内容curl "https://api.telegram.org/bot/setWebhook?url=https://your-project-name.vercel.app/api/webhook/"
用户先通过客户端发消息给 bot,telegram 服务器通过开发者设置好的 Webhook 将消息转发到对应的 url,vercel 无服务器云函数被 url 访问唤醒,执行云函数。
免费账户是有限制的,比如无服务器函数响应时间只有十秒:
| Serverless Function Execution Timeout (Seconds) | 10s |
|---|
所以 HeroKu 版本中的打卡函数 nuaa.py 中的 delay 值为3,必然导致 vercel 无服务器函数超时,所以把 delay 改为1.5。
References