用 vercel 构建自己的 telegram bot

Created
Mar 28, 2022 06:05 AM
Tags
除了轮询方式,telegram bot api 还提供了 webhook 的方式。
Vercel是一个用于静态网站和无服务器功能的云平台,与您的工作流程完美契合。
直接按照 vercel文档 里的流程, 在根目录下新建文件 api/bot-webhook.go,然后把项目导入 vercel。
非常简单,总之,RTFD
GET /bot<id>:<key>/setWebhook?url=https://your-url.now.sh/api/bot-webhook HTTP/1.1 Host: api.telegram.org
可以直接用 curl 或者 postman 发请求过去设置就行了,因为只用这一次。然后 bot 的消息就被转发到这个 URL 处理了。
这里其实有点绕,因为这个库在这里做了一下封装,bot.ListenForWebhook():
// ListenForWebhook registers a http handler for a webhook. func (bot *BotAPI) ListenForWebhook(pattern string) UpdatesChannel { ch := make(chan Update, bot.Buffer) http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { bytes, _ := ioutil.ReadAll(r.Body) var update Update json.Unmarshal(bytes, &update) ch <- update }) return ch }
但如果要部署在 vercel 而不是服务器上的话是不需要这层封装的,直接写个 Handler 把之前写的 bot.Handle() 暴露出来就行了。
// /api/api-webhook.go Handler function func Handler(w http.ResponseWriter, req *http.Request) { bytes, _ := ioutil.ReadAll(req.Body) var update tgbotapi.Update err = json.Unmarshal(bytes, &update) if err != nil { log.Error("Unmarshal update: ", err) } log.Debug("Update: %+v %+v", update.Message.Text, update) bot.Handle(update) }
可以申请两个 bot,本地开发和测试直接用轮询就可以,Y型结构,消息处理共用,轻松愉快。
在 vercel 上部署,优点如下:
  • 全天在线,不会因为网络或物理原因,动不动就挂
  • 和 github 集成,把代码 push 上去就行,不用管部署的事情
  • 免费每月 100G 的流量,很适合这种玩票场景
至于具体用来做什么,就发挥自己想象吧。
PS:bot 作为对话式 UI 的具体应用,如果能用在日常的工作流中,还是很爽的,连用户系统都可以直接用。telegram 与某些 所谓的“天才”产品经理设计的所谓的“国民级聊天软件”对开发者友好程度、文档清晰程度、功能强大程度简直是天壤之别,telegram 近日更新中说用户数已超过 5 亿。希望优秀的产品越走越远,垃圾产品早点死掉。