You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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环境)

  1. 安装TDLib的Go绑定:
go get github.com/zelenin/go-tdlib/client
  1. 编写下载代码:
    首先需要从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:13:14