golang简单高效的Telegram机器人客户端插件库telegram-bot-api的使用

Golang简单高效的Telegram机器人客户端插件库telegram-bot-api的使用

telegram-bot-api是一个Golang封装的Telegram Bot API库,提供了简单高效的方式来开发Telegram机器人。

安装

首先确保库已安装并更新到最新版本:

go get -u github.com/go-telegram-bot-api/telegram-bot-api/v5

基本示例

这是一个简单的机器人示例,它会显示接收到的所有更新,并回复相同的消息:

package main

import (
	"log"

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

func main() {
	// 使用你的Bot Token初始化Bot
	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 := bot.GetUpdatesChan(u)

	// 处理收到的消息
	for update := range updates {
		if update.Message != nil { // 如果有新消息
			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示例

如果你需要使用Webhooks(例如在Google App Engine上运行),可以使用以下方法:

package main

import (
	"log"
	"net/http"

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

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)

	// 设置Webhook
	wh, _ := tgbotapi.NewWebhookWithCert("https://www.example.com:8443/"+bot.Token, "cert.pem")

	_, err = bot.Request(wh)
	if err != nil {
		log.Fatal(err)
	}

	// 检查Webhook状态
	info, err := bot.GetWebhookInfo()
	if err != nil {
		log.Fatal(err)
	}

	if info.LastErrorDate != 0 {
		log.Printf("Telegram callback failed: %s", info.LastErrorMessage)
	}

	// 监听Webhook更新
	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)
	}
}

生成自签名证书

使用Webhook需要HTTPS/TLS,可以使用以下命令生成自签名证书:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3560 -subj "//O=Org\CN=Test" -nodes

功能特点

  1. 所有方法都简单明了,易于理解
  2. 提供了完整的Telegram Bot API封装
  3. 支持长轮询和Webhook两种方式
  4. 可以轻松处理消息、命令和其他更新类型

这个库专注于提供API的封装,不包含额外的功能如插件系统或命令处理器,保持了简单高效的特性。


更多关于golang简单高效的Telegram机器人客户端插件库telegram-bot-api的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单高效的Telegram机器人客户端插件库telegram-bot-api的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用telegram-bot-api构建高效的Telegram机器人

telegram-bot-api是Go语言中一个简单高效的Telegram Bot API封装库,它提供了简洁的接口来与Telegram Bot API交互。下面我将详细介绍如何使用这个库构建Telegram机器人。

安装

首先安装telegram-bot-api库:

go get github.com/go-telegram-bot-api/telegram-bot-api/v5

基本使用

1. 创建机器人实例

package main

import (
	"log"
	"os"

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

func main() {
	// 从环境变量获取token
	botToken := os.Getenv("TELEGRAM_BOT_TOKEN")
	if botToken == "" {
		log.Panic("TELEGRAM_BOT_TOKEN环境变量未设置")
	}

	// 创建机器人实例
	bot, err := tgbotapi.NewBotAPI(botToken)
	if err != nil {
		log.Panic(err)
	}

	// 设置调试模式
	bot.Debug = true

	log.Printf("已授权账号 %s", bot.Self.UserName)
}

2. 接收和处理消息

// 继续上面的main函数

	// 设置更新配置
	u := tgbotapi.NewUpdate(0)
	u.Timeout = 60

	// 获取更新通道
	updates := bot.GetUpdatesChan(u)

	// 处理更新
	for update := range updates {
		if update.Message == nil {
			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

		// 发送消息
		if _, err := bot.Send(msg); err != nil {
			log.Println(err)
		}
	}

高级功能

1. 发送不同类型的消息

// 发送图片
func sendPhoto(bot *tgbotapi.BotAPI, chatID int64) {
	photo := tgbotapi.NewPhoto(chatID, tgbotapi.FilePath("example.jpg"))
	if _, err := bot.Send(photo); err != nil {
		log.Println(err)
	}
}

// 发送带按钮的回复
func sendWithButtons(bot *tgbotapi.BotAPI, chatID int64) {
	msg := tgbotapi.NewMessage(chatID, "请选择一个选项:")
	msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup(
		tgbotapi.NewInlineKeyboardRow(
			tgbotapi.NewInlineKeyboardButtonData("选项1", "option1"),
			tgbotapi.NewInlineKeyboardButtonData("选项2", "option2"),
		),
	)
	if _, err := bot.Send(msg); err != nil {
		log.Println(err)
	}
}

2. 处理回调查询

// 在更新处理循环中添加回调处理
for update := range updates {
    if update.CallbackQuery != nil {
        // 处理回调
        callback := tgbotapi.NewCallback(update.CallbackQuery.ID, update.CallbackQuery.Data)
        if _, err := bot.Request(callback); err != nil {
            log.Println(err)
        }

        // 发送消息通知用户
        msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, 
            fmt.Sprintf("你选择了: %s", update.CallbackQuery.Data))
        if _, err := bot.Send(msg); err != nil {
            log.Println(err)
        }
        continue
    }
    
    // 原有的消息处理...
}

3. 使用Webhook模式

func webhookExample(bot *tgbotapi.BotAPI) {
    // 设置webhook
    wh, _ := tgbotapi.NewWebhook("https://yourdomain.com/" + bot.Token)
    _, err := bot.Request(wh)
    if err != nil {
        log.Fatal(err)
    }

    // 获取webhook更新信息
    info, err := bot.GetWebhookInfo()
    if err != nil {
        log.Fatal(err)
    }

    // 如果webhook设置有问题
    if info.LastErrorDate != 0 {
        log.Printf("Telegram回调失败: %s", info.LastErrorMessage)
    }

    // 通过webhook接收更新
    updates := bot.ListenForWebhook("/" + bot.Token)
    go http.ListenAndServe(":8443", nil)

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

最佳实践

  1. 错误处理:始终检查API调用的错误
  2. 并发处理:对于耗时操作,使用goroutine避免阻塞
  3. 状态管理:对于复杂交互,使用有限状态机或数据库跟踪用户状态
  4. 日志记录:记录重要事件和错误
  5. 速率限制:遵守Telegram API的速率限制

完整示例

package main

import (
	"log"
	"os"

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

func main() {
	botToken := os.Getenv("TELEGRAM_BOT_TOKEN")
	if botToken == "" {
		log.Panic("请设置TELEGRAM_BOT_TOKEN环境变量")
	}

	bot, err := tgbotapi.NewBotAPI(botToken)
	if err != nil {
		log.Panic(err)
	}

	bot.Debug = true
	log.Printf("已授权账号 %s", bot.Self.UserName)

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

	updates := bot.GetUpdatesChan(u)

	for update := range updates {
		if update.CallbackQuery != nil {
			handleCallback(bot, update.CallbackQuery)
			continue
		}

		if update.Message == nil {
			continue
		}

		if !update.Message.IsCommand() {
			handleMessage(bot, update.Message)
			continue
		}

		handleCommand(bot, update.Message)
	}
}

func handleCallback(bot *tgbotapi.BotAPI, callback *tgbotapi.CallbackQuery) {
	callbackCfg := tgbotapi.NewCallback(callback.ID, callback.Data)
	if _, err := bot.Request(callbackCfg); err != nil {
		log.Println(err)
	}

	msg := tgbotapi.NewMessage(callback.Message.Chat.ID, 
		"你选择了: "+callback.Data)
	if _, err := bot.Send(msg); err != nil {
		log.Println(err)
	}
}

func handleMessage(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
	msg := tgbotapi.NewMessage(message.Chat.ID, "你发送了: "+message.Text)
	msg.ReplyToMessageID = message.MessageID

	if _, err := bot.Send(msg); err != nil {
		log.Println(err)
	}
}

func handleCommand(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
	switch message.Command() {
	case "start":
		msg := tgbotapi.NewMessage(message.Chat.ID, "欢迎使用本机器人!")
		bot.Send(msg)
	case "help":
		msg := tgbotapi.NewMessage(message.Chat.ID, "帮助信息...")
		bot.Send(msg)
	case "menu":
		sendMenu(bot, message.Chat.ID)
	default:
		msg := tgbotapi.NewMessage(message.Chat.ID, "未知命令")
		bot.Send(msg)
	}
}

func sendMenu(bot *tgbotapi.BotAPI, chatID int64) {
	msg := tgbotapi.NewMessage(chatID, "请选择:")
	msg.ReplyMarkup = tgbotapi.NewInlineKeyboardMarkup(
		tgbotapi.NewInlineKeyboardRow(
			tgbotapi.NewInlineKeyboardButtonData("选项1", "opt1"),
			tgbotapi.NewInlineKeyboardButtonData("选项2", "opt2"),
		),
	)
	bot.Send(msg)
}

telegram-bot-api库提供了简单直观的API,使得开发Telegram机器人变得非常高效。通过上述示例,你可以快速构建功能丰富的Telegram机器人。

回到顶部