GolangNote

Golang笔记

Golang telegram 机器人小试

Permalink2

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 的对话完成。

BotFather

http poll 或 webhook

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

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

http poll 模式

Go: 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 模式

Go: 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 的方式:

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

相关项目

本文网址: https://golangnote.com/topic/252.html 转摘请注明来源

Related articles

Golang sync.WaitGroup 的 Wait 超时处理

sync.WaitGroup 使用 `Add(1)`、`Done()`、`Wait()`组合来实现多协程等待,如果某一协程未能合理处理错误,导致无法退出,此时需要引入超时机制。下面是一种超时处理方法。...

Golang 生成防识别的图片验证码

验证码 captcha 是对抗密码强力破解、垃圾信息的有效方式,一般用于用户注册、登录,当检测到频繁发帖时也会启用验证码。下面介绍用golang 生成防机器识别的图片验证码。...

golang共享数据用Mutex 或 Channel

在go 里,多线程对共享数据的操作一般要使用Mutex 或 Channel 来加锁或隔离通信。下面是一个使用Mutex 和 Channel 比较的例子。...

Golang 时区时差处理方式

个人习惯用 0 时区时间戳记录时间,可以方便转到不同时区,下面介绍 Golang 时区时差处理...

Golang quicktemplate 模版快速入门

Golang 有很多的模版引擎,自带的 `html/template` 也很好,大多数情况都能满足需求,只是有些逻辑、条件判断不好在模版里实现, `quicktemplate` 是个很好的选择。...

Comments

There are 2 Comments to "Golang telegram 机器人小试"

1 no says:
回复

没有提到国内本地开发是如何解决墙的问题。 比如通过引入socks5库来让go程序走代理。

2 GolangNote says:
回复

@no 国内本地开发,如果是 http poll 模式 搞个全局代理最方便,webhook 模式 还是放在国外的服务器方便。

Write a Comment to "Golang telegram 机器人小试"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.22.3 Processed in 1ms