golang Telegram机器人框架插件库telebot的使用
Golang Telegram机器人框架插件库telebot的使用
Telebot是一个用于Telegram Bot API的机器人框架,提供了简洁的API、命令路由、中间件、透明文件API和无缝机器人回调等功能。
安装
go get -u gopkg.in/telebot.v4
快速开始
下面是一个基本的Telebot设置示例:
package main
import (
"log"
"os"
"time"
tele "gopkg.in/telebot.v4"
)
func main() {
pref := tele.Settings{
Token: os.Getenv("TOKEN"), // 从环境变量获取Token
Poller: &tele.LongPoller{Timeout: 10 * time.Second}, // 使用长轮询器
}
b, err := tele.NewBot(pref)
if err != nil {
log.Fatal(err)
return
}
// 处理/hello命令
b.Handle("/hello", func(c tele.Context) error {
return c.Send("Hello!")
})
b.Start() // 启动机器人
}
上下文(Context)
Context类型封装了更新结构,表示当前事件的上下文:
b.Handle(tele.OnText, func(c tele.Context) error {
// 处理所有未被其他处理器捕获的文本消息
user := c.Sender()
text := c.Text()
// 使用完整机器人功能发送消息
msg, err := b.Send(user, text)
if err != nil {
return err
}
// 或者使用上下文快捷方式
return c.Send(text)
})
b.Handle(tele.OnPhoto, func(c tele.Context) error {
// 只处理照片
photo := c.Message().Photo
// ...
})
中间件
Telebot支持中间件:
import "gopkg.in/telebot.v4/middleware"
// 全局中间件
b.Use(middleware.Logger())
b.Use(middleware.AutoRespond())
// 组中间件
adminOnly := b.Group()
adminOnly.Use(middleware.Whitelist(adminIDs...))
adminOnly.Handle("/ban", onBan)
adminOnly.Handle("/kick", onKick)
// 处理器级中间件
b.Handle(tele.OnText, onText, middleware.IgnoreVia())
自定义中间件示例:
// AutoResponder自动响应每个回调更新
func AutoResponder(next tele.HandlerFunc) tele.HandlerFunc {
return func(c tele.Context) error {
if c.Callback() != nil {
defer c.Respond()
}
return next(c) // 继续执行链
}
}
命令处理
Telebot支持两种命令语法:直接(/command
)和分组式(/command@botname
),并支持提取payload:
// 命令: /start <PAYLOAD>
b.Handle("/start", func(c tele.Context) error {
fmt.Println(c.Message().Payload) // <PAYLOAD>
return nil
})
// 多参数命令: /tags <tag1> <tag2> <...>
b.Handle("/tags", func(c tele.Context) error {
tags := c.Args() // 空格分隔的参数列表
for _, tag := range tags {
// 处理每个参数
}
return nil
})
文件处理
Telebot支持上传和下载文件:
a := &tele.Audio{File: tele.FromDisk("file.ogg")}
fmt.Println(a.OnDisk()) // true
fmt.Println(a.InCloud()) // false
// 上传文件并发送
b.Send(recipient, a)
// 再次发送时使用Telegram FileID而不重新上传
b.Send(otherRecipient, a)
fmt.Println(a.OnDisk()) // true
fmt.Println(a.InCloud()) // true
fmt.Println(a.FileID) // <Telegram file ID>
发送选项
// 常规发送选项
b.Send(user, "text", &tele.SendOptions{
// ...
})
// 只使用ReplyMarkup
b.Send(user, "text", &tele.ReplyMarkup{
// ...
})
// 使用标志: 无通知 && 无网页预览
b.Send(user, "text", tele.Silent, tele.NoPreview)
键盘
Telebot支持回复键盘和内联键盘:
var (
// 通用标记构建器
menu = &tele.ReplyMarkup{ResizeKeyboard: true}
selector = &tele.ReplyMarkup{}
// 回复按钮
btnHelp = menu.Text("ℹ Help")
btnSettings = menu.Text("⚙ Settings")
// 内联按钮
btnPrev = selector.Data("⬅", "prev", ...)
btnNext = selector.Data("➡", "next", ...)
)
menu.Reply(
menu.Row(btnHelp),
menu.Row(btnSettings),
)
selector.Inline(
selector.Row(btnPrev, btnNext),
)
// 处理内联按钮回调
b.Handle(&btnPrev, func(c tele.Context) error {
return c.Respond()
})
完整示例
package main
import (
"log"
"os"
"time"
tele "gopkg.in/telebot.v4"
)
func main() {
pref := tele.Settings{
Token: os.Getenv("TELEGRAM_BOT_TOKEN"),
Poller: &tele.LongPoller{Timeout: 10 * time.Second},
}
b, err := tele.NewBot(pref)
if err != nil {
log.Fatal(err)
return
}
// 定义键盘
menu := &tele.ReplyMarkup{ResizeKeyboard: true}
btnHelp := menu.Text("ℹ Help")
btnSettings := menu.Text("⚙ Settings")
menu.Reply(menu.Row(btnHelp), menu.Row(btnSettings))
// 处理命令
b.Handle("/start", func(c tele.Context) error {
return c.Send("Welcome!", menu)
})
// 处理按钮点击
b.Handle(&btnHelp, func(c tele.Context) error {
return c.Send("Here is some help...")
})
// 处理文本消息
b.Handle(tele.OnText, func(c tele.Context) error {
msg := c.Message()
log.Printf("Received text: %s from %s", msg.Text, msg.Sender.Username)
return nil
})
// 处理照片
b.Handle(tele.OnPhoto, func(c tele.Context) error {
photo := c.Message().Photo
return c.Send("Nice photo!")
})
b.Start()
}
Telebot提供了丰富的功能来构建强大的Telegram机器人,包括命令处理、中间件、文件操作、键盘和回调处理等。通过其简洁的API,可以轻松实现各种机器人功能。
更多关于golang Telegram机器人框架插件库telebot的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang Telegram机器人框架插件库telebot的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Telebot - Golang Telegram机器人框架使用指南
Telebot是一个功能强大且易用的Golang Telegram Bot API框架。下面我将详细介绍其基本用法和常见功能实现。
安装
首先安装telebot库:
go get gopkg.in/telebot.v3
基本用法
package main
import (
"log"
"time"
"gopkg.in/telebot.v3"
)
func main() {
// 创建bot实例
pref := telebot.Settings{
Token: "YOUR_TELEGRAM_BOT_TOKEN",
Poller: &telebot.LongPoller{Timeout: 10 * time.Second},
}
bot, err := telebot.NewBot(pref)
if err != nil {
log.Fatal(err)
return
}
// 处理/start命令
bot.Handle("/start", func(c telebot.Context) error {
return c.Send("Hello, I'm a Telegram bot!")
})
// 处理普通文本消息
bot.Handle(telebot.OnText, func(c telebot.Context) error {
text := c.Text()
return c.Send("You said: " + text)
})
// 启动bot
bot.Start()
}
主要功能实现
1. 命令处理
// 带参数的命令
bot.Handle("/greet", func(c telebot.Context) error {
name := c.Message().Payload // 获取命令后的参数
if name == "" {
name = "stranger"
}
return c.Send(fmt.Sprintf("Hello, %s!", name))
})
// 多个命令
bot.Handle("/help", func(c telebot.Context) error {
helpText := `Available commands:
/start - Start the bot
/help - Show this help
/greet [name] - Greet someone`
return c.Send(helpText)
})
2. 按钮和键盘
// 内联键盘
bot.Handle("/menu", func(c telebot.Context) error {
menu := &telebot.ReplyMarkup{}
btn1 := menu.Text("Button 1")
btn2 := menu.Text("Button 2")
menu.Reply(
menu.Row(btn1, btn2),
)
return c.Send("Choose an option:", menu)
})
// 处理按钮点击
bot.Handle(&btn1, func(c telebot.Context) error {
return c.Respond(&telebot.CallbackResponse{Text: "Button 1 clicked"})
})
3. 发送不同类型消息
// 发送图片
bot.Handle("/photo", func(c telebot.Context) error {
photo := &telebot.Photo{File: telebot.FromURL("https://example.com/image.jpg")}
return c.Send(photo)
})
// 发送文档
bot.Handle("/doc", func(c telebot.Context) error {
doc := &telebot.Document{File: telebot.FromDisk("file.pdf")}
return c.Send(doc)
})
// 发送带按钮的消息
bot.Handle("/sendbtn", func(c telebot.Context) error {
inlineKeys := [][]telebot.InlineButton{
{
telebot.InlineButton{
Text: "Visit Website",
URL: "https://example.com",
},
},
}
return c.Send("Click the button below:", &telebot.ReplyMarkup{
InlineKeyboard: inlineKeys,
})
})
4. 中间件
// 记录日志的中间件
func logger(next telebot.HandlerFunc) telebot.HandlerFunc {
return func(c telebot.Context) error {
log.Printf("Received update from %d: %s", c.Sender().ID, c.Text())
return next(c)
}
}
// 使用中间件
bot.Use(logger)
5. 用户会话管理
// 简单的状态管理
var userStates = make(map[int64]string)
bot.Handle("/register", func(c telebot.Context) error {
userStates[c.Sender().ID] = "awaiting_name"
return c.Send("Please enter your name:")
})
bot.Handle(telebot.OnText, func(c telebot.Context) error {
if state, ok := userStates[c.Sender().ID]; ok && state == "awaiting_name" {
name := c.Text()
delete(userStates, c.Sender().ID)
return c.Send(fmt.Sprintf("Thank you, %s! Registration complete.", name))
}
return nil
})
高级功能
1. Webhook模式
pref := telebot.Settings{
Token: "YOUR_TOKEN",
Offline: true, // 必须设置为true才能使用Webhook
}
bot, err := telebot.NewBot(pref)
if err != nil {
log.Fatal(err)
}
// 设置Webhook
_, err = bot.SetWebhook(&telebot.Webhook{
Listen: ":8443",
Endpoint: &telebot.WebhookEndpoint{PublicURL: "https://yourdomain.com/bot"},
})
if err != nil {
log.Fatal(err)
}
// 开始处理更新
bot.Start()
2. 自定义中间件
// 管理员检查中间件
func adminOnly(next telebot.HandlerFunc) telebot.HandlerFunc {
return func(c telebot.Context) error {
if c.Sender().ID != ADMIN_ID {
return c.Send("You are not authorized to use this command.")
}
return next(c)
}
}
// 使用中间件
bot.Handle("/admin", adminOnly(func(c telebot.Context) error {
return c.Send("Welcome, admin!")
}))
最佳实践
- 使用环境变量存储敏感信息如Token
- 为长时间运行的操作添加超时
- 合理使用中间件处理公共逻辑
- 考虑使用数据库存储用户状态而非内存
- 添加错误处理和日志记录
Telebot提供了丰富的功能,可以轻松实现各种Telegram机器人需求。更多高级用法可以参考其官方文档和示例代码。