如何通过Telegram Bot Go SDK下载超过20MB的文件?
解决Telegram Bot下载大文件的问题
针对你用Telebot Go SDK遇到的20MB文件大小限制问题,有两种可靠的解决方案:
方案一:使用TDLib(Telegram原生库)下载
Telegram Bot API的getFile接口确实存在20MB的下载限制,但官方的**TDLib(Telegram Database Library)**不受此限制,它是Telegram的原生客户端库,支持直接通过文件ID下载任意大小的文件。
实现步骤(Go环境)
- 安装TDLib的Go绑定:
go get github.com/zelenin/go-tdlib/client
- 编写下载代码:
首先需要从Telegram开发者平台获取API ID和API Hash(注册一个应用即可获得),然后初始化TDLib客户端并完成Bot授权,最后通过文件ID下载文件:
package main import ( "context" "fmt" "os" "github.com/zelenin/go-tdlib/client" ) func main() { // 配置TDLib参数 config := client.Config{ APIID: 123456, // 替换为你的API ID APIHash: "your_api_hash", // 替换为你的API Hash DatabaseDirectory: "./tdlib-db", FilesDirectory: "./tdlib-files", UseTestDataCenter: false, } // 初始化客户端 tdClient, err := client.NewClient(config) if err != nil { fmt.Printf("创建客户端失败: %v\n", err) return } // 使用Bot Token授权 _, err = tdClient.SetBotToken(&client.SetBotTokenRequest{ BotToken: "your_bot_token", // 替换为你的Bot Token }) if err != nil { fmt.Printf("Bot授权失败: %v\n", err) return } // 替换为你从Telebot更新中获取的文件ID targetFileID := "your_file_id" // 获取文件信息 file, err := tdClient.GetFile(&client.GetFileRequest{FileID: targetFileID}) if err != nil { fmt.Printf("获取文件信息失败: %v\n", err) return } // 处理下载逻辑 if file.Local.IsDownloadingCompleted { // 文件已缓存,直接读取 fileData, err := os.ReadFile(file.Local.Path) if err != nil { fmt.Printf("读取缓存文件失败: %v\n", err) return } // 此处将fileData上传至你的存储服务 fmt.Println("文件读取完成,可上传至存储服务") } else { // 订阅下载进度,等待完成 ctx, cancel := context.WithCancel(context.Background()) defer cancel() go func() { updates := tdClient.GetUpdatesChannel(ctx, 100) for update := range updates { if updateType, ok := update.(*client.UpdateFile); ok { if updateType.File.ID == targetFileID && updateType.File.Local.IsDownloadingCompleted { // 下载完成,读取文件 fileData, err := os.ReadFile(updateType.File.Local.Path) if err != nil { fmt.Printf("读取下载文件失败: %v\n", err) return } // 此处将fileData上传至你的存储服务 fmt.Println("大文件下载完成,可上传至存储服务") cancel() } } } }() // 启动下载 _, err = tdClient.DownloadFile(&client.DownloadFileRequest{ FileID: targetFileID, Priority: 1, ForceDownload: true, }) if err != nil { fmt.Printf("启动下载失败: %v\n", err) return } } }
方案二:避免依赖(不推荐)
如果你不想引入TDLib,理论上可以通过解析Telegram网页分享链接获取下载地址,但这种方式依赖网页结构,Telegram随时可能修改页面布局,稳定性无法保证,不建议用于生产环境。
内容的提问来源于stack exchange,提问作者Harun Sasmaz
相关产品推荐
相关产品推荐

