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)
}

获取更新

有两种获取更新的方法:

  1. 使用长轮询 (bot.UpdatesViaLongPolling)
  2. 使用 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/sonic
  • stdjson - 使用 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()
}

最佳实践

  1. 错误处理:始终检查并处理错误
  2. 并发控制:telego内部已经处理了并发,但要注意共享资源
  3. 日志记录:记录重要事件和错误
  4. 配置管理:使用环境变量或配置文件管理敏感信息
  5. 优雅关闭:确保在程序退出时正确关闭资源

telego提供了Telegram Bot API的完整实现,包括消息、命令、内联查询、支付、游戏等各种功能。通过合理组织代码结构,可以构建出功能强大且易于维护的Telegram机器人。

回到顶部