go-telegram-bot-api库的使用
2024-05-14 16:21:12
自动回复消息
package main import ( "log" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) func main() { // 创建一个新的 Telegram Bot API 客户端 bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") if err != nil { log.Panic(err) } // 开启调试模式,输出日志 bot.Debug = true // 输出 Bot 的用户名 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) // 设置回复消息的 ID,使回复消息能够与原消息进行关联 msg.ReplyToMessageID = update.Message.MessageID // 发送回复消息 bot.Send(msg) } } }
使用 Webhooks
(比如你想在 Google App Engine 上运行),你可以使用稍微不同的方法。
package main import ( "log" "net/http" "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) func main() { // 创建一个新的 Telegram Bot API 客户端 bot, err := tgbotapi.NewBotAPI("MyAwesomeBotToken") if err != nil { log.Fatal(err) } // 开启调试模式,输出日志 bot.Debug = true // 输出 Bot 的用户名 log.Printf("Authorized on account %s", bot.Self.UserName) // 创建一个新的 Webhook 对象,并使用自签名证书 wh, _ := tgbotapi.NewWebhookWithCert("https://www.example.com:8443/"+bot.Token, "cert.pem") // 向 Telegram 发送设置 Webhook 的请求 _, 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 callback failed: %s", info.LastErrorMessage) } // 监听 Telegram 发送的 Webhook 更新 updates := bot.ListenForWebhook("/" + bot.Token) // 启动 HTTPS 服务器并监听指定端口,使用 cert.pem 和 key.pem 作为证书和私钥 go http.ListenAndServeTLS("0.0.0.0:8443", "cert.pem", "key.pem", nil) // 处理接收到的更新 for update := range updates { log.Printf("%+v\n", update) } }
命令处理
package main import ( "log" "os" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) func main() { // 创建新的Telegram Bot API客户端 bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_APITOKEN")) if err != nil { log.Panic(err) } // 开启调试模式,输出日志 bot.Debug = true // 输出Bot的用户名 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 { continue } // 如果消息不是命令类型,跳过处理 if !update.Message.IsCommand() { continue } // 创建一个新的消息配置对象 msg := tgbotapi.NewMessage(update.Message.Chat.ID, "") // 从消息中提取命令 switch update.Message.Command() { case "help": // 如果收到 /help 命令,回复帮助信息 msg.Text = "我理解 /sayhi 和 /status." case "sayhi": // 如果收到 /sayhi 命令,回复问候消息 msg.Text = "Hi :)" case "status": // 如果收到 /status 命令,回复状态信息 msg.Text = "我很好." default: // 对于其他未知命令,回复提示信息 msg.Text = "我不知道这个命令" } // 发送回复消息 if _, err := bot.Send(msg); err != nil { log.Panic(err) } } }
键盘
package main import ( "log" "os" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) // 定义一个数字键盘 var numericKeyboard = tgbotapi.NewReplyKeyboard( tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("1"), tgbotapi.NewKeyboardButton("2"), tgbotapi.NewKeyboardButton("3"), ), tgbotapi.NewKeyboardButtonRow( tgbotapi.NewKeyboardButton("4"), tgbotapi.NewKeyboardButton("5"), tgbotapi.NewKeyboardButton("6"), ), ) func main() { // 创建新的Telegram Bot API客户端 bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_APITOKEN")) if err != nil { log.Panic(err) } // 开启调试模式,输出日志 bot.Debug = true // 输出Bot的用户名 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 { continue } // 创建一个新的消息对象,回复的消息内容与收到的消息内容相同 msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text) // 根据收到的消息内容进行判断 switch update.Message.Text { case "open": // 如果收到 "open" 命令,显示数字键盘 msg.ReplyMarkup = numericKeyboard case "close": // 如果收到 "close" 命令,关闭键盘 msg.ReplyMarkup = tgbotapi.NewRemoveKeyboard(true) } // 发送回复消息 if _, err := bot.Send(msg); err != nil { log.Panic(err) } } }
内联键盘
package main import ( "log" "os" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) // 定义一个内联键盘 var numericKeyboard = tgbotapi.NewInlineKeyboardMarkup( // 第一行按钮 tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonURL("1.com", "http://1.com"), // URL按钮 tgbotapi.NewInlineKeyboardButtonData("2", "2"), // 数据按钮 tgbotapi.NewInlineKeyboardButtonData("3", "3"), // 数据按钮 ), // 第二行按钮 tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardButtonData("4", "4"), // 数据按钮 tgbotapi.NewInlineKeyboardButtonData("5", "5"), // 数据按钮 tgbotapi.NewInlineKeyboardButtonData("6", "6"), // 数据按钮 ), ) func main() { // 创建新的Telegram Bot API客户端 bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_APITOKEN")) if err != nil { log.Panic(err) } // 开启调试模式,输出日志 bot.Debug = true // 输出Bot的用户名 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 { // 根据收到的消息构造一个新的消息对象 msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text) // 如果收到的消息是 "open",添加数字键盘 switch update.Message.Text { case "open": msg.ReplyMarkup = numericKeyboard } // 发送消息 if _, err = bot.Send(msg); err != nil { panic(err) } } else if update.CallbackQuery != nil { // 回复回调查询,告诉Telegram向用户显示包含收到数据的消息 callback := tgbotapi.NewCallback(update.CallbackQuery.ID, update.CallbackQuery.Data) if _, err := bot.Request(callback); err != nil { panic(err) } // 最后,发送包含收到数据的消息 msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Data) if _, err := bot.Send(msg); err != nil { panic(err) } } } }