1. 首页
  2. 技术
  3. Linux

使用golang实现telegram机器人

使用golang实现telegram机器人,这里提供简单的demo,可以根据内容开发适合的telegram机器人程序,例如抽奖或者群组加群验证机器人

telegram 的机器人接口很开放,使用简单,100%开放无限制,相对微信服务号、公众号好很多。用来做一些小应用也很方便。下面是使用golang sdk 开发telegram 机器人的经验。

telegram-bot-api

telegram-bot-api https://github.com/go-telegram-bot-api/telegram-bot-api197 是目前较好的sdk,使用方便。

获取机器人

机器人账号的获取直接跟BotFather 对话,token的或取、快捷命令的设置、机器人的信息设置等均可通过与BotFather 的对话完成。

6184d1ac7970f562637603ee0ddce58b

http poll 或 webhook

http poll 是客户端向telegram 服务器定时不断的请求,使用简单,一般用于测试,在本地机器即可完成。老外们的经验说,这种模式经常卡,导致业务处理延迟。

webhook 是telegram 服务器主动发消息到自己指定的网址,一般用于真实环境,而且对外需要HTTPS / TLS 协议,用户延迟小、并发高。

http poll 模式

package main

import (
  "log"

  "github.com/go-telegram-bot-api/telegram-bot-api"
)

func main() {
  bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
  if err != nil {
    log.Panic(err)
  }

  bot.Debug = true

  log.Printf("Authorized on account %s", bot.Self.UserName)

  u := tgbotapi.NewUpdate(0)
  u.Timeout = 60

  updates, err := bot.GetUpdatesChan(u)

  for update := range updates {
    if update.Message == nil { // ignore any non-Message Updates
      continue
    }

    log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)

    msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
    msg.ReplyToMessageID = update.Message.MessageID

    bot.Send(msg)
  }
}

 

webhook 模式

package main

import (
  "log"
  "net/http"

  "github.com/go-telegram-bot-api/telegram-bot-api"
)

func main() {
  bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken")
  if err != nil {
    log.Fatal(err)
  }

  bot.Debug = true

  log.Printf("Authorized on account %s", bot.Self.UserName)

  _, err = bot.SetWebhook(tgbotapi.NewWebhookWithCert("https://www.google.com:8443/"+bot.Token, "cert.pem"))
  if err != nil {
    log.Fatal(err)
  }
  info, err := bot.GetWebhookInfo()
  if err != nil {
    log.Fatal(err)
  }
  if info.LastErrorDate != 0 {
    log.Printf("Telegram callback failed: %s", info.LastErrorMessage)
  }
  updates := bot.ListenForWebhook("/" + bot.Token)
  go http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil)

  for update := range updates {
    log.Printf("%+v\n", update)
  }
}

 

 

可以使用自签名的证书;也可以使用前端代理,证书让前端处理,比如 Caddy、nginx ;也可以使用 Let’s Encrypt 。区别在于生成 WebhookConfig 的方式:

 

Go: 使用自签名证书
1
2
tgbotapi.NewWebhookWithCert("https://example.com/"+bot.Token, "cert.pem")
tgbotapi.NewWebhook("https://example.com/"+bot.Token)

 

相关项目

原创文章,作者:admin,如若转载,请注明出处:https://www.huiyingwu.com/4339/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注