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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:45:17