Telegram Bot 示例文档
目录
基础设置
package main
import (
"fmt"
"log"
"os"
"time"
tele "gopkg.in/telebot.v4"
)
func main() {
os.Setenv("HTTP_PROXY", "socks5://127.0.0.1:7890")
os.Setenv("HTTPS_PROXY", "socks5://127.0.0.1:7890")
os.Setenv("TOKEN", "你的Bot Token")
}
创建基础Bot实例
func createBasicBot() *tele.Bot {
token := os.Getenv("TOKEN")
b, err := tele.NewBot(tele.Settings{
Token: token,
Poller: &tele.LongPoller{Timeout: 10 * time.Second},
})
if err != nil {
log.Fatal(err)
}
return b
}
基本功能演示
文本消息处理
func demoTextHandler() {
b := createBasicBot()
b.Handle(tele.OnText, func(c tele.Context) error {
return c.Reply("收到你的消息: " + c.Text())
})
b.Start()
}
命令处理
func demoCommands() {
b := createBasicBot()
// 设置命令菜单
b.SetCommands([]tele.Command{
{Text: "start", Description: "开始使用"},
{Text: "help", Description: "获取帮助"},
})
// 处理 /start 命令
b.Handle("/start", func(c tele.Context) error {
return c.Send("你好!")
})
b.Start()
}
内联键盘
func demoInlineButtons() {
b := createBasicBot()
menu := &tele.ReplyMarkup{}
btnHelp := menu.Data("帮助", "help")
btnSettings := menu.Data("设置", "settings")
menu.Inline(
menu.Row(btnHelp, btnSettings),
)
b.Handle("/start", func(c tele.Context) error {
return c.Send("请选择:", menu)
})
b.Handle(&btnHelp, func(c tele.Context) error {
return c.Send("这是帮助信息")
})
b.Handle(&btnSettings, func(c tele.Context) error {
return c.Send("这是设置信息")
})
b.Start()
}
回复键盘
func demoReplyKeyboard() {
b := createBasicBot()
menu := &tele.ReplyMarkup{
ReplyKeyboard: [][]tele.ReplyButton{
{{Text: "按钮1"}, {Text: "按钮2"}},
{{Text: "按钮3"}},
},
ResizeKeyboard: true,
}
b.Handle("/start", func(c tele.Context) error {
return c.Send("选择一个按钮:", menu)
})
b.Handle(tele.OnText, func(c tele.Context) error {
switch c.Text() {
case "按钮1":
return c.Send("你点击了按钮1")
case "按钮2":
return c.Send("你点击了按钮2")
case "按钮3":
return c.Send("你点击了按钮3")
default:
return c.Send("请使用键盘按钮")
}
})
b.Start()
}
图片处理
接收并保存图片
func demoPhotoHandler() {
b := createBasicBot()
// 创建保存图片的目录
if err := os.MkdirAll("./images", 0755); err != nil {
log.Fatal(err)
}
b.Handle(tele.OnPhoto, func(c tele.Context) error {
photo := c.Message().Photo
// 使用时间戳创建唯一的文件名
fileName := fmt.Sprintf("./images/%d.jpg", time.Now().Unix())
err := b.Download(&photo.File, fileName)
if err != nil {
return err
}
return c.Reply("图片已保存到: " + fileName)
})
b.Start()
}
发送图片
func demoSendPhoto() {
b := createBasicBot()
b.Handle("/photo", func(c tele.Context) error {
photo := &tele.Photo{File: tele.FromDisk("./downloaded.jpg")}
return c.Send(photo)
})
b.Start()
}
群组功能
func demoGroupFeatures() {
b := createBasicBot()
// 新成员加入
b.Handle(tele.OnUserJoined, func(c tele.Context) error {
return c.Send("欢迎新成员!")
})
// 成员离开
b.Handle(tele.OnUserLeft, func(c tele.Context) error {
return c.Send("再见!")
})
b.Start()
}
投票功能
func demoPoll() {
b := createBasicBot()
b.Handle("/poll", func(c tele.Context) error {
return c.Send(&tele.Poll{
Question: "你喜欢这个机器人吗?",
Options: []tele.PollOption{
{Text: "喜欢"},
{Text: "非常喜欢"},
},
})
})
b.Start()
}
使用说明
- 设置代理和Bot Token
- 选择需要测试的功能,在main函数中取消对应函数的注释
- 运行程序
- 在Telegram中与机器人交互测试功能
注意事项
- 确保设置了正确的Bot Token
- 如果需要使用代理,请确保代理服务器正常运行
- 图片会保存在程序运行目录的images文件夹中
- 每个功能演示都是独立的,一次只能运行一个演示函数
telebot.v4 的 middleware 包提供了一些常用的中间件功能。以下是主要的中间件及其用法:
package main
import (
"log"
"time"
tele "gopkg.in/telebot.v4"
"gopkg.in/telebot.v4/middleware"
)
func demoMiddleware() {
b := createBasicBot()
// 1. 自动恢复中间件 - 防止程序崩溃
b.Use(middleware.Recover())
// 2. 访问限制中间件 - 限制请求频率
b.Use(middleware.AutoRespond()) // 自动响应回调查询
b.Use(middleware.Throttle(time.Second)) // 限制用户每秒只能发送一次请求
// 3. 用户权限验证
// 只允许特定用户访问
whitelist := middleware.Whitelist(123456, 789012) // 用户ID
b.Use(whitelist)
// 4. 日志记录
b.Use(middleware.Logger())
// 5. 仅允许私聊
b.Use(middleware.PrivateOnly())
// 6. 仅允许群组消息
// b.Use(middleware.GroupOnly())
// 7. 自定义中间件示例
b.Use(func(next tele.HandlerFunc) tele.HandlerFunc {
return func(c tele.Context) error {
// 在处理消息前执行
log.Printf("收到来自用户 %d 的消息", c.Sender().ID)
// 调用下一个处理器
err := next(c)
// 在处理消息后执行
log.Printf("消息处理完成")
return err
}
})
// 处理消息
b.Handle(tele.OnText, func(c tele.Context) error {
return c.Reply("收到你的消息!")
})
b.Start()
}
主要中间件说明:
Recover()
// 防止程序崩溃的中间件 b.Use(middleware.Recover())
Throttle()
// 限制用户请求频率 b.Use(middleware.Throttle(time.Second * 2)) // 每2秒允许一次请求
Whitelist()/Blacklist()
// 白名单 - 只允许特定用户 whitelist := middleware.Whitelist(123456, 789012) b.Use(whitelist) // 黑名单 - 禁止特定用户 blacklist := middleware.Blacklist(111111, 222222) b.Use(blacklist)
Logger()
// 记录所有请求日志 b.Use(middleware.Logger())
AutoRespond()
// 自动响应回调查询 b.Use(middleware.AutoRespond())
组合使用中间件
func demoMultipleMiddleware() { b := createBasicBot() // 组合多个中间件 b.Use(middleware.Recover()) b.Use(middleware.Logger()) b.Use(middleware.AutoRespond()) b.Use(middleware.Throttle(time.Second)) // 特定处理器的中间件 b.Handle(tele.OnText, func(c tele.Context) error { return c.Reply("你好!") }, middleware.PrivateOnly()) // 这个处理器只在私聊中生效 }
自定义中间件
func customMiddleware(next tele.HandlerFunc) tele.HandlerFunc { return func(c tele.Context) error { // 前置处理 log.Printf("用户 %d 发送了消息", c.Sender().ID) // 调用下一个处理器 err := next(c) // 后置处理 log.Printf("消息处理完成") return err } } // 使用自定义中间件 b.Use(customMiddleware)
使用建议:
Recover()
中间件建议始终使用,防止程序崩溃Logger()
在开发时很有用,可以看到所有请求日志Throttle()
可以防止用户滥用机器人- 中间件的执行顺序是按照添加顺序来的
- 可以为不同的处理器设置不同的中间件组合
这些中间件可以帮助你更好地控制和管理机器人的行为,提高安全性和可靠性。
中间件是在处理消息的"中间"执行的代码,它在原始处理函数执行前后都可以进行操作。让我用一个具体的例子来说明:
func demoMiddleware() {
b := createBasicBot()
// 1. 创建一个日志中间件
logMiddleware := func(next tele.HandlerFunc) tele.HandlerFunc {
return func(c tele.Context) error {
// 处理前的操作
log.Printf("⬇️ 收到消息: %s", c.Text())
// 执行实际的处理函数
err := next(c)
// 处理后的操作
log.Printf("⬆️ 消息处理完成")
return err
}
}
// 2. 创建一个权限检查中间件
authMiddleware := func(next tele.HandlerFunc) tele.HandlerFunc {
return func(c tele.Context) error {
// 在处理消息前检查权限
if c.Sender().ID != 123456 { // 假设只允许ID为123456的用户
return c.Reply("❌ 您没有权限使用此功能")
}
return next(c)
}
}
// 3. 使用中间件
b.Use(logMiddleware)
b.Use(authMiddleware)
// 4. 实际的消息处理函数
b.Handle(tele.OnText, func(c tele.Context) error {
return c.Reply("👋 收到你的消息:" + c.Text())
})
b.Start()
}
执行流程如下:
- 用户发送消息 "hello" 给机器人
消息处理顺序:
logMiddleware (前置操作) ↓ 打印 "⬇️ 收到消息: hello" ↓ authMiddleware (权限检查) ↓ 检查用户ID是否为123456 ↓ 实际的消息处理函数 ↓ 发送回复 "👋 收到你的消息:hello" ↓ logMiddleware (后置操作) ↓ 打印 "⬆️ 消息处理完成"
一个更实用的例子:限制用户发送消息的频率
func demoRateLimit() {
b := createBasicBot()
// 创建一个简单的速率限制中间件
var lastMsg = make(map[int64]time.Time)
rateLimitMiddleware := func(next tele.HandlerFunc) tele.HandlerFunc {
return func(c tele.Context) error {
userID := c.Sender().ID
// 检查用户上次发送消息的时间
if last, exists := lastMsg[userID]; exists {
if time.Since(last) < time.Second*5 {
return c.Reply("⚠️ 请等待5秒后再发送消息")
}
}
// 更新最后发送时间
lastMsg[userID] = time.Now()
// 继续处理消息
return next(c)
}
}
// 使用中间件
b.Use(rateLimitMiddleware)
// 消息处理
b.Handle(tele.OnText, func(c tele.Context) error {
return c.Reply("收到消息:" + c.Text())
})
b.Start()
}
在这个例子中:
- 如果用户发送消息太频繁(小于5秒),中间件会拦截并提示等待
- 只有当用户发送消息的间隔大于5秒时,消息才会被实际的处理函数处理
中间件的主要用途:
- 日志记录
- 权限验证
- 速率限制
- 消息过滤
- 错误处理
- 性能监控
- 等等...
中间件让你可以在不修改原有处理逻辑的情况下,添加各种通用功能。