golang实现Telegram Bot API完整功能的插件库telego的使用
Golang 实现 Telegram Bot API 完整功能的插件库 telego 的使用
Telego 是一个用于 Golang 的 Telegram Bot API 库,实现了完整的 API 功能(一对一映射)。
安装
go get github.com/mymmrac/telego
基本设置
首先需要创建 bot 实例并指定 token。
package main
import (
"context"
"fmt"
"os"
"github.com/mymmrac/telego"
)
func main() {
// 从环境变量获取 Bot token
botToken := os.Getenv("TOKEN")
// 创建 bot 并启用调试信息
// 注意:默认日志可能暴露敏感信息,仅在开发环境使用
bot, err := telego.NewBot(botToken, telego.WithDefaultDebugLogger())
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 调用 getMe 方法 (https://core.telegram.org/bots/api#getme)
botUser, err := bot.GetMe(context.Background())
if err != nil {
fmt.Println("Error:", err)
}
// 打印 Bot 信息
fmt.Printf("Bot user: %+v\n", botUser)
}
获取更新
有两种获取更新的方法:
- 使用长轮询 (
bot.UpdatesViaLongPolling
) - 使用 webhook (
bot.UpdatesViaWebhook
,推荐方式)
长轮询示例
package main
import (
"context"
"fmt"
"os"
"github.com/mymmrac/telego"
)
func main() {
botToken := os.Getenv("TOKEN")
// 注意:默认日志可能暴露敏感信息,仅在开发环境使用
bot, err := telego.NewBot(botToken, telego.WithDefaultDebugLogger())
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 获取更新通道
updates, _ := bot.UpdatesViaLongPolling(context.Background(), nil)
// 循环处理所有更新
for update := range updates {
fmt.Printf("Update: %+v\n", update)
}
}
Webhook 示例
package main
import (
"context"
"fmt"
"net/http"
"os"
"github.com/mymmrac/telego"
)
func main() {
ctx := context.Background()
botToken := os.Getenv("TOKEN")
// 注意:默认日志可能暴露敏感信息,仅在开发环境使用
bot, err := telego.NewBot(botToken, telego.WithDefaultDebugLogger())
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 在 Telegram 端设置 webhook
_ = bot.SetWebhook(ctx, &telego.SetWebhookParams{
URL: "https://example.com/bot",
SecretToken: bot.SecretToken(),
})
// 获取 webhook 信息
info, _ := bot.GetWebhookInfo(ctx)
fmt.Printf("Webhook Info: %+v\n", info)
// 创建 http serve mux
mux := http.NewServeMux()
// 从 webhook 获取更新通道
updates, _ := bot.UpdatesViaWebhook(ctx, telego.WebhookHTTPServeMux(mux, "/bot", bot.SecretToken()))
// 启动服务器接收 Telegram 请求
go func() {
_ = http.ListenAndServe(":443", mux)
}()
// 循环处理所有更新
for update := range updates {
fmt.Printf("Update: %+v\n", update)
}
}
使用 Telegram 方法
所有 Telegram Bot API 方法都可以通过该库使用。它们具有相同的名称和相同的参数。
package main
import (
"context"
"fmt"
"os"
"github.com/mymmrac/telego"
tu "github.com/mymmrac/telego/telegoutil"
)
func main() {
ctx := context.Background()
botToken := os.Getenv("TOKEN")
// 注意:默认日志可能暴露敏感信息,仅在开发环境使用
bot, err := telego.NewBot(botToken, telego.WithDefaultDebugLogger())
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 调用 getMe 方法
botUser, _ := bot.GetMe(ctx)
fmt.Printf("Bot User: %+v\n", botUser)
updates, _ := bot.UpdatesViaLongPolling(ctx, nil)
for update := range updates {
if update.Message != nil {
// 获取聊天 ID
chatID := update.Message.Chat.ID
// 调用 sendMessage 方法
// 向发送者发送相同文本的消息(回声机器人)
sentMessage, _ := bot.SendMessage(ctx,
tu.Message(
tu.ID(chatID),
update.Message.Text,
),
)
fmt.Printf("Sent Message: %v\n", sentMessage)
}
}
}
工具方法
Telego 提供了 telegoutil
包来简化操作:
import tu "github.com/mymmrac/telego/telegoutil"
机器人处理器
Telego 提供了类似 net/http
的处理程序,但使用谓词而不是路径。
package main
import (
"context"
"fmt"
"os"
"github.com/mymmrac/telego"
th "github.com/mymmrac/telego/telegohandler"
tu "github.com/mymmrac/telego/telegoutil"
)
func main() {
ctx := context.Background()
botToken := os.Getenv("TOKEN")
// 注意:默认日志可能暴露敏感信息,仅在开发环境使用
bot, err := telego.NewBot(botToken, telego.WithDefaultDebugLogger())
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// 获取更新通道
updates, _ := bot.UpdatesViaLongPolling(ctx, nil)
// 创建机器人处理器并指定更新来源
bh, _ := th.NewBotHandler(bot, updates)
// 停止处理更新
defer func() { _ = bh.Stop() }()
// 注册新处理器,匹配命令 `/start`
bh.Handle(func(ctx *th.Context, update telego.Update) error {
// 发送消息
_, _ = ctx.Bot().SendMessage(ctx, tu.Message(
tu.ID(update.Message.Chat.ID),
fmt.Sprintf("Hello %s!", update.Message.From.FirstName),
))
return nil
}, th.CommandEqual("start"))
// 注册新处理器,匹配任何命令
bh.Handle(func(ctx *th.Context, update telego.Update) error {
// 发送消息
_, _ = ctx.Bot().SendMessage(ctx, tu.Message(
tu.ID(update.Message.Chat.ID),
"Unknown command, use /start",
))
return nil
}, th.AnyCommand())
// 开始处理更新
_ = bh.Start()
}
构建配置
Telego 支持通过 Go 的构建标签进行多种构建配置:
- 无标签 - 使用 goccy/go-json
sonic
- 使用 bytedance/sonicstdjson
- 使用 encoding/json
许可证
Telego 采用 MIT 许可证分发。
更多关于golang实现Telegram Bot API完整功能的插件库telego的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实现Telegram Bot API完整功能的插件库telego的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用telego实现Telegram Bot API完整功能
telego是一个功能强大的Go语言库,用于实现Telegram Bot API的全部功能。下面我将介绍如何使用telego库来构建一个功能完整的Telegram机器人。
安装telego
首先,安装telego库:
go get github.com/mymmrac/telego
基本机器人设置
package main
import (
"log"
"os"
"github.com/mymmrac/telego"
th "github.com/mymmrac/telego/telegohandler"
tu "github.com/mymmrac/telego/telegoutil"
)
func main() {
// 从环境变量获取Bot Token
botToken := os.Getenv("TELEGRAM_BOT_TOKEN")
if botToken == "" {
log.Fatal("TELEGRAM_BOT_TOKEN环境变量未设置")
}
// 创建Bot实例
bot, err := telego.NewBot(botToken)
if err != nil {
log.Fatalf("创建Bot失败: %v", err)
}
// 获取更新通道
updates, err := bot.UpdatesViaLongPolling(nil)
if err != nil {
log.Fatalf("获取更新失败: %v", err)
}
defer bot.StopLongPolling()
// 创建处理器
bh, err := th.NewBotHandler(bot, updates)
if err != nil {
log.Fatalf("创建处理器失败: %v", err)
}
defer bh.Stop()
// 注册处理函数
bh.HandleMessage(func(bot *telego.Bot, message telego.Message) {
chatID := tu.ID(message.Chat.ID)
_, _ = bot.SendMessage(tu.Message(chatID, "收到你的消息: "+message.Text))
}, th.AnyMessage())
// 开始处理更新
bh.Start()
}
高级功能实现
1. 命令处理
// 注册命令处理器
bh.HandleMessage(func(bot *telego.Bot, message telego.Message) {
chatID := tu.ID(message.Chat.ID)
switch message.Text {
case "/start":
_, _ = bot.SendMessage(tu.Message(
chatID,
"欢迎使用本机器人!\n可用命令:\n/help - 帮助\n/echo - 回声",
))
case "/help":
_, _ = bot.SendMessage(tu.Message(
chatID,
"帮助信息:\n/start - 开始\n/help - 帮助\n/echo - 回声",
))
case "/echo":
_, _ = bot.SendMessage(tu.Message(
chatID,
"请输入要回显的文本",
).WithReplyMarkup(tu.ForceReply()))
}
}, th.CommandEqual())
2. 按钮和键盘
// 发送带按钮的消息
func sendButtons(bot *telego.Bot, chatID int64) {
// 创建内联键盘
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton("按钮1").WithCallbackData("btn1"),
tu.InlineKeyboardButton("按钮2").WithCallbackData("btn2"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton("Google").WithURL("https://google.com"),
),
)
// 创建回复键盘
replyKeyboard := tu.ReplyKeyboard(
tu.KeyboardRow(
tu.KeyboardButton("选项1"),
tu.KeyboardButton("选项2"),
),
tu.KeyboardRow(
tu.KeyboardButton("取消").WithRequestContact(),
),
).WithResizeKeyboard()
// 发送带内联键盘的消息
_, _ = bot.SendMessage(tu.Message(
tu.ID(chatID),
"请选择一个选项:",
).WithReplyMarkup(inlineKeyboard))
// 发送带回复键盘的消息
_, _ = bot.SendMessage(tu.Message(
tu.ID(chatID),
"或者从键盘中选择:",
).WithReplyMarkup(replyKeyboard))
}
// 处理回调查询
bh.HandleCallbackQuery(func(bot *telego.Bot, query telego.CallbackQuery) {
chatID := tu.ID(query.Message.Chat.ID)
switch query.Data {
case "btn1":
_, _ = bot.SendMessage(tu.Message(chatID, "你点击了按钮1"))
_ = bot.AnswerCallbackQuery(tu.CallbackQuery(query.ID).WithText("按钮1已处理"))
case "btn2":
_, _ = bot.SendMessage(tu.Message(chatID, "你点击了按钮2"))
_ = bot.AnswerCallbackQuery(tu.CallbackQuery(query.ID).WithText("按钮2已处理"))
}
})
3. 文件处理
// 处理照片
bh.HandleMessage(func(bot *telego.Bot, message telego.Message) {
if message.Photo != nil {
chatID := tu.ID(message.Chat.ID)
// 获取最大尺寸的照片
photo := message.Photo[len(message.Photo)-1]
file, err := bot.GetFile(&telego.GetFileParams{
FileID: photo.FileID,
})
if err != nil {
log.Printf("获取文件失败: %v", err)
return
}
// 发送文件URL
fileURL := "https://api.telegram.org/file/bot" + bot.Token() + "/" + file.FilePath
_, _ = bot.SendMessage(tu.Message(
chatID,
"照片URL: "+fileURL,
))
}
}, th.AnyMessageWithPhoto())
4. Webhook模式
func webhookExample() {
botToken := os.Getenv("TELEGRAM_BOT_TOKEN")
webhookURL := os.Getenv("WEBHOOK_URL")
bot, err := telego.NewBot(botToken)
if err != nil {
log.Fatal(err)
}
// 设置Webhook
err = bot.SetWebhook(&telego.SetWebhookParams{
URL: webhookURL,
})
if err != nil {
log.Fatal(err)
}
// 获取Webhook更新
updates, err := bot.UpdatesViaWebhook("/bot")
if err != nil {
log.Fatal(err)
}
// 创建处理器
bh, err := th.NewBotHandler(bot, updates)
if err != nil {
log.Fatal(err)
}
// 注册处理函数
bh.HandleMessage(func(bot *telego.Bot, message telego.Message) {
chatID := tu.ID(message.Chat.ID)
_, _ = bot.SendMessage(tu.Message(chatID, "Webhook模式下的回复"))
}, th.AnyMessage())
// 启动HTTP服务器
go func() {
_ = http.ListenAndServe(":8443", nil)
}()
bh.Start()
}
最佳实践
- 错误处理:始终检查并处理错误
- 并发控制:telego内部已经处理了并发,但要注意共享资源
- 日志记录:记录重要事件和错误
- 配置管理:使用环境变量或配置文件管理敏感信息
- 优雅关闭:确保在程序退出时正确关闭资源
telego提供了Telegram Bot API的完整实现,包括消息、命令、内联查询、支付、游戏等各种功能。通过合理组织代码结构,可以构建出功能强大且易于维护的Telegram机器人。