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!")
}))

最佳实践

  1. 使用环境变量存储敏感信息如Token
  2. 为长时间运行的操作添加超时
  3. 合理使用中间件处理公共逻辑
  4. 考虑使用数据库存储用户状态而非内存
  5. 添加错误处理和日志记录

Telebot提供了丰富的功能,可以轻松实现各种Telegram机器人需求。更多高级用法可以参考其官方文档和示例代码。

回到顶部