起因
现在互联网平台上的“用户”其实不是“客户”而是平台的“资产”,互联网平台公司的估值以用户数为参考标准, “免费”平台通过分析和售卖用户数据来服务真正的“客户”获得盈利。
所以在 telegram 上花了非常多的时间,又因为 telegram 的 bot-api 功能强大,所以萌生了写一个自己的 bot 的想法, 因为网络和盒盖,不想部署在自己的电脑上,搞在 VPS 上还得费时间部署,所以直接部署在 vercel 上。
轮询方式
向 bot-father 申请,根据文档中的描述写就可以了。直接用别人封装好的 go-telegram-api。
非常简单,RTFD。
// /bot/bot.go bot.Run() function func Run() { u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates, err := global.Bot.GetUpdatesChan(u) if err != nil { log.Error("Get Updates Channel %+v", err) } for update := range updates { Handle(update) } }
这里用这个 Handle 函数把消息处理抽出来,因为不管是轮询还是 webhook 方式,消息处理都是通用的。
集成到 vercel
除了轮询方式,telegram bot api 还提供了 webhook 的方式。
vercel 是什么?
Vercel是一个用于静态网站和无服务器功能的云平台,与您的工作流程完美契合。
直接按照 vercel文档 里的流程, 在根目录下新建文件 api/bot-webhook.go,然后把项目导入 vercel。
非常简单,总之,RTFD
setWebhook
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 处理了。
用vercel处理消息
这里其实有点绕,因为这个库在这里做了一下封装,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 亿。希望优秀的产品越走越远,垃圾产品早点死掉。