使用 Vercel 实现 Habitica 自动接受新任务 - 02 存储机制及开发语言
01. 系列主题
Habitica是一个游戏化的 GTD 工具,支持组队打怪,我计划开发一个适合小白用户部署的开源 Web 应用,让用户可以自动接受任务。
02. 本期目标
上期末尾,我计划下一步敲定如何存储用户调用 Habitica API 的 key 和 token
而 Habitica 的 API 验证机制又比较奇葩,它会生成且只生成一个 token,并且要重置的话,还需要给网站客服写信,这导致用户可能并不那么放心把 token 交给第三方,除非是它自己能够一键配置一个 Vercel App,数据存储在自己的 Vercel 账号中。
下期,我将努力敲定这个存储 token 的方案。
除了存储方案,这波我也将决定使用什么开发语言和框架。
03. 决定存储方案
应用本身不需要存储特别多的数据,只有 api key 和 api token 而已,所以存储当然是越简单越好。
询问了 DeepSeek,它给了几个方案。
但是在 Vercel 中了解后得知,这些都需要预先创建 Storage 实例,然后配置相关的 Key 和 密钥,对于小白用户来说,比较麻烦。
既然逃不开配置环境变量,那么有什么什么可以方便的让用户填写环境变量的方法呢?几经探索后,发现是有的。Vercel 官方提供了非常易于操作的方案:Deploy Button
官方有一个例子:
https://calcom.mintlify.dev/docs/self-hosting/deployments/vercel
这个 例子,可以一键部署 github 仓库到 Vercel, 并且同时填写环境变量。这完全满足我的需求,小白用户也可以轻易操作。
04. 开发语言和框架
虽然 Vercel 中最适合的语言和框架是 TypeScript + Next.js, 不过我个人实在不喜欢 node_modules 这套东西,而且开发这些小工具,也是想以学习为目的之一,最近又对 Golang 比较感兴趣,所以决定使用 Golang + Gin
虽然 Vercel 本身对 Hobby Plan 只提供 12 个 Serverless Function 限额,不过这个应用足够简单,应该是完全够用的(印象中, Next.js 是有一些优化的,可以支持更多一些)。
我在 Vercel 的 Function Limits 文档中,并没有找到这个数量的说明。
https://vercel.com/docs/functions/limitations
但是官方论坛中有相关的讨论,不过时间比较久远了。
大概半年前,我部署一个 Flask 应用也遇到了类似的问题,可能这个限定仍然是存在的。具体遇到再想办法吧。
下面是一个 Golang + Gin 的例子,写起来还是蛮简洁的。
// api/index.go
package handler
import (
"net/http"
"github.com/gin-gonic/gin"
)
var r *gin.Engine
func init() {
r = gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello, World from Gin on Vercel!",
})
})
}
func Handler(w http.ResponseWriter, req *http.Request) {
r.ServeHTTP(w, req)
}
// vercel.json
{
"functions": {
"api/index.go": {
"maxDuration": 30
}
},
"routes": [
{
"src": "/(.*)",
"dest": "/api/index.go"
}
]
}
05. 下期计划
决定了存储和语言框架,下面就可以动手开发了,下期,准备先实现 webhook 的自动安装。
POST https://habitica.com/api/v3/user/webhook
文章同步发表于微信公众号老狗拾光,欢迎关注。