如何实现Telegram机器人间的文件交换?跨机器人文件ID调用失败及无数据库存储的解决方案咨询
这确实是Telegram API的一个典型限制——每个机器人的文件标识符(比如photo_id)都是专属且与机器人Token绑定的,无法直接跨机器人复用。不过不用把文件存到数据库也能解决这个问题,这里有两种可行的方案:
方案1:内存中转文件二进制数据
核心思路是让第一个机器人把文件下载到内存,再将二进制数据传递给第二个机器人直接上传,全程不落地存储:
第一个机器人获取文件并下载:
拿到photo_id后,调用Telegram API的getFile方法,获取文件的file_path。然后用第一个机器人的Token拼接成下载链接:https://api.telegram.org/file/bot<第一个机器人Token>/<file_path>,请求这个链接获取文件的二进制数据(比如用Python的requests.get().content)。示例代码(Python):
import requests # 第一个机器人的Token BOT1_TOKEN = "your_bot1_token" photo_id = "拿到的图片ID" # 获取文件路径 get_file_url = f"https://api.telegram.org/bot{BOT1_TOKEN}/getFile?file_id={photo_id}" file_response = requests.get(get_file_url).json() file_path = file_response["result"]["file_path"] # 下载文件二进制数据 download_url = f"https://api.telegram.org/file/bot{BOT1_TOKEN}/{file_path}" file_data = requests.get(download_url).content第二个机器人上传二进制数据:
把拿到的file_data直接传给第二个机器人的sendPhoto接口,作为photo参数(以二进制流形式上传,不用文件ID)。示例代码:
# 第二个机器人的Token BOT2_TOKEN = "your_bot2_token" chat_id = "要发送的聊天ID" send_photo_url = f"https://api.telegram.org/bot{BOT2_TOKEN}/sendPhoto" requests.post(send_photo_url, data={"chat_id": chat_id}, files={"photo": ("image.jpg", file_data)})
方案2:机器人间转发文件获取专属ID
如果你的两个机器人可以互相通信(比如有一个私有聊天会话),可以让第一个机器人把文件转发给第二个机器人,第二个机器人从转发的消息中提取属于自己的photo_id,存入数据库后续使用:
- 第一个机器人调用
forwardMessage,把包含图片的消息转发到第二个机器人的聊天ID(你需要先让两个机器人建立对话,获取第二个机器人的聊天ID)。 - 第二个机器人监听新消息,当收到转发的图片时,提取自己的
photo_id,替换数据库中原来的ID。
这个方案的好处是后续第二个机器人可以直接用自己的photo_id发送图片,不用每次都中转数据,但需要机器人之间能交互。
为什么直接用跨机器人的文件ID会失败?
Telegram的文件标识符是与机器人的Token关联的——每个机器人的文件索引是独立的,API会通过Token验证文件的归属权。当你用第二个机器人的Token去请求第一个机器人的photo_id时,Telegram找不到对应权限下的文件,就会抛出Bad Request: wrong file identifier错误。
而你尝试直接用文件链接发送失败,是因为Telegram的文件下载链接需要对应机器人的Token鉴权,第二个机器人用自己的Token无法访问这个链接,所以必须由第一个机器人先下载数据再传递。
内容的提问来源于stack exchange,提问作者Alexander Zoly

