起因

现在互联网平台上的“用户”其实不是“客户”而是平台的“资产”,互联网平台公司的估值以用户数为参考标准, “免费”平台通过分析和售卖用户数据来服务真正的“客户”获得盈利。

所以在 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 亿。希望优秀的产品越走越远,垃圾产品早点死掉。