基于PTB 13.x的本地Telegram Bot API文件路径重复问题求助
问题排查与解决办法
可能原因
- Telegram Bot API服务的
--local模式配置中,文件存储路径(--local-directory)与反向代理的URL路径前缀冲突,导致PTB拼接file_path时重复叠加路径。 - PTB 13.x版本对自定义Bot API服务的file_path解析逻辑存在缺陷,没有正确去除API服务返回的路径前缀,与Nginx配置的静态文件路径重复拼接。
解决办法
方法1:调整Telegram Bot API容器的启动参数
修改docker-compose中Telegram Bot API的启动命令,确保--local-directory的路径与Nginx映射的静态文件路径一致,同时添加--local-url参数指定正确的URL前缀,避免路径重复:
services: telegram-bot-api: image: aiogram/telegram-bot-api:latest command: [ "--api-id=YOUR_API_ID", "--api-hash=YOUR_API_HASH", "--bot-token=YOUR_BOT_TOKEN", "--local", "--local-directory=/var/lib/telegram-bot-api", "--local-url=http://nginx/file/" # 前缀需与Nginx静态文件路径对应 ] volumes: - telegram-bot-data:/var/lib/telegram-bot-api
配置后,API返回的file_path会以/file/TOKEN/...开头,而非完整本地路径,避免PTB重复拼接。
方法2:修改Nginx配置,添加路径重写规则
若无法调整API服务参数,在Nginx配置中添加重写规则,自动去除重复路径部分:
server { listen 80; server_name your-domain.com; location / { # 匹配重复路径前缀并替换为正确路径 rewrite ^/var/lib/telegram-bot-api/TOKEN/(.*)$ /var/lib/telegram-bot-api/TOKEN/$1 break; root /var/lib/telegram-bot-api; try_files $uri $uri/ =404; } }
将TOKEN替换为你的Bot实际令牌,这条规则会自动过滤重复前缀,确保Nginx能正确定位文件。
方法3:在PTB代码中手动修正file_path
调用get_file后,手动处理返回的file_path,去除重复路径前缀:
file = await context.bot.get_file(file_id) # 去除重复的路径前缀 duplicate_prefix = "/var/lib/telegram-bot-api/TOKEN/" if file.file_path.startswith(duplicate_prefix * 2): file.file_path = file.file_path[len(duplicate_prefix):] # 使用修正后的路径请求文件 file_url = context.bot.get_file_url(file.file_path)
这种方法直接在代码层处理,适合无法修改容器或Nginx配置的场景,确保请求路径正确。
内容的提问来源于stack exchange,提问作者Topper
相关产品推荐
相关产品推荐

