tgbotapi.newbotapi初始化需校验token非空且无空格,避免panic;timeout应设30秒防漏消息;处理update须判空和类型分支;发大文件需预检大小并分步上传。

Telegram Bot 在 Go 里没有官方 SDK,tgbotapi 是最稳定、更新勤、文档最贴近实际用法的第三方库,别被名字误导——它不是 Telegram 官方维护的,但生产环境跑得比多数“官方风”封装更稳。
如何初始化 tgbotapi.NewBotAPI 并避免 panic
常见错误是传入空字符串或带空格的 token,导致 tgbotapi.NewBotAPI 直接 panic,而不是返回 error。它内部不做 token 格式校验,只做基础 HTTP client 初始化,但一旦 token 错,后续 GetUpdates 或 Send 会收到 401 Unauthorized 并在 Update 解析时崩溃。
- 确保 token 来自 @BotFather 分配,形如
123456789:ABC-DEF1234ghIkl-zyx57W2v1u123ew11,不含前后空格 - 初始化前加一层检查:
if strings.TrimSpace(token) == "" { log.Fatal("BOT_TOKEN is empty") } - 不要把 token 硬编码进 main.go;用
os.Getenv("BOT_TOKEN")+.env文件管理,否则部署到服务器时容易漏配
为什么 tgbotapi.NewUpdateConfig 不该设太小的 Timeout
默认 Timeout 是 30 秒,这是 Long Polling 的关键。设成 5 秒看似响应快,实则引发两个问题:频繁重连消耗连接数、漏掉用户连续发送的多条消息(Telegram 服务端可能批量推送,但客户端超时中断后丢弃剩余部分)。
- 生产环境建议保持 30 秒;开发调试可临时设为 10 秒,但上线前必须改回
- 如果用了反向代理(如 Nginx),要同步调大
proxy_read_timeout,否则它会在 60 秒断开,早于 bot 的 timeout,造成连接复位 - 不推荐用
GetUpdatesChan模式替代,它底层仍是轮询,且 channel 缓冲区默认为 100,溢出时会丢 update
Update.Message.Text 为空?先检查 Update.Message.IsCommand() 和类型分支
Telegram 的 Update 结构体非常松散:一条消息可能是文本、照片、位置、语音、甚至编辑过的旧消息。直接读 Update.Message.Text 而不判空,会导致 panic;更隐蔽的是,用户发 /start 是 Message.Command(),但 Text 字段值是 "/start@your_bot",不是 "/start"。
- 务必先判断
update.Message != nil,再判断update.Message.IsCommand() - 提取命令用
update.Message.Command()(自动去 @ 后缀和空格),不是strings.Split(update.Message.Text, " ")[0] - 处理非文本消息时,优先检查
update.Message.Photo、update.Message.Document、update.EditedMessage等字段,别假设所有输入都是 Text
如何安全地发大图/文件而不触发 413 Request Entity Too Large
Telegram Bot API 对单次请求体大小限制约 20MB,但 Go 的 tgbotapi.NewPhotoUpload 默认走 form-data 上传,若文件路径本地不存在或权限不足,会静默失败;更大的坑是:直接传 filepath 给 NewPhotoUpload,它不会校验文件大小,直到 POST 时才被服务端拒绝并返回 413。
- 发图前先用
os.Stat检查文件大小:if info, err := os.Stat(path); err == nil && info.Size() > 20*1024*1024 { log.Printf("file too large: %s (%d bytes)", path, info.Size()) return } - 超过 20MB 的文件,必须用
tgbotapi.NewFileUpload+FileID方式分步上传:先getFile获取 URL,再用 HTTP GET 下载,最后用NewDocumentUpload提交 URL(需开启AllowCustomURL) - 别忽略
ParseMode对文件描述的影响:设成"MarkdownV2"时,文件名里的下划线、星号要手动转义,否则发不出
Bot 的健壮性不在功能多,而在每条 Update 都能走到明确的类型分支、每个 Send 前都预检参数合法性、每次 HTTP 调用后都看 err 而不是只打印 response body。Go 的简洁语法容易让人忽略这些细节,但 Telegram API 的松散结构恰恰放大了疏忽的代价。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











