telegram 的机器人接口很开放,使用简单,100%开放无限制,相对微信服务号、公众号好很多。用来做一些小应用也很方便。下面是使用golang sdk 开发telegram 机器人的经验。
telegram-bot-api
telegram-bot-api https://github.com/go-telegram-bot-api/telegram-bot-api 是目前较好的sdk,使用方便。
获取机器人
机器人账号的获取直接跟BotFather 对话,token的或取、快捷命令的设置、机器人的信息设置等均可通过与BotFather 的对话完成。
http poll 或 webhook
http poll 是客户端向telegram 服务器定时不断的请求,使用简单,一般用于测试,在本地机器即可完成。老外们的经验说,这种模式经常卡,导致业务处理延迟。
webhook 是telegram 服务器主动发消息到自己指定的网址,一般用于真实环境,而且对外需要HTTPS / TLS
协议,用户延迟小、并发高。
http poll 模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
的方式:
1
2
tgbotapi.NewWebhookWithCert("https://example.com/"+bot.Token, "cert.pem")
tgbotapi.NewWebhook("https://example.com/"+bot.Token)
相关项目
- telegram-bot-api https://github.com/go-telegram-bot-api/telegram-bot-api
- caddy https://github.com/mholt/caddy
- ssldocker https://github.com/wqihai/ssldocker
- nginx http://nginx.org/
- Let's Encrypt https://letsencrypt.org/
本文网址: https://golangnote.com/topic/252.html 转摘请注明来源
There are 2 Comments to "Golang telegram 机器人小试"
没有提到国内本地开发是如何解决墙的问题。 比如通过引入socks5库来让go程序走代理。
@no 国内本地开发,如果是
http poll 模式
搞个全局代理最方便,webhook 模式
还是放在国外的服务器方便。