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

使用说明

  1. 设置代理和Bot Token
  2. 选择需要测试的功能,在main函数中取消对应函数的注释
  3. 运行程序
  4. 在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()
}

主要中间件说明:

  1. Recover()

    // 防止程序崩溃的中间件
    b.Use(middleware.Recover())
  2. Throttle()

    // 限制用户请求频率
    b.Use(middleware.Throttle(time.Second * 2)) // 每2秒允许一次请求
  3. Whitelist()/Blacklist()

    // 白名单 - 只允许特定用户
    whitelist := middleware.Whitelist(123456, 789012)
    b.Use(whitelist)
    
    // 黑名单 - 禁止特定用户
    blacklist := middleware.Blacklist(111111, 222222)
    b.Use(blacklist)
  4. Logger()

    // 记录所有请求日志
    b.Use(middleware.Logger())
  5. AutoRespond()

    // 自动响应回调查询
    b.Use(middleware.AutoRespond())
  6. 组合使用中间件

    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()) // 这个处理器只在私聊中生效
    }
  7. 自定义中间件

    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)

使用建议:

  1. Recover() 中间件建议始终使用,防止程序崩溃
  2. Logger() 在开发时很有用,可以看到所有请求日志
  3. Throttle() 可以防止用户滥用机器人
  4. 中间件的执行顺序是按照添加顺序来的
  5. 可以为不同的处理器设置不同的中间件组合

这些中间件可以帮助你更好地控制和管理机器人的行为,提高安全性和可靠性。

中间件是在处理消息的"中间"执行的代码,它在原始处理函数执行前后都可以进行操作。让我用一个具体的例子来说明:

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

执行流程如下:

  1. 用户发送消息 "hello" 给机器人
  2. 消息处理顺序:

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

在这个例子中:

  1. 如果用户发送消息太频繁(小于5秒),中间件会拦截并提示等待
  2. 只有当用户发送消息的间隔大于5秒时,消息才会被实际的处理函数处理

中间件的主要用途:

  • 日志记录
  • 权限验证
  • 速率限制
  • 消息过滤
  • 错误处理
  • 性能监控
  • 等等...

中间件让你可以在不修改原有处理逻辑的情况下,添加各种通用功能。

每日更新-免费小火箭账号
不要错过任何机会,探索最新的应用和游戏,就在我们的平台。
立即访问
最后修改:2024 年 12 月 19 日
如果觉得我的文章对你有用,请随意赞赏