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

基于pyTelegramBotAPI的Telegram图片缩放机器人开发问题:上传图片后无法通过Pillow进行处理

解决Telegram Bot中用Pillow处理图片的问题

我来帮你理清这个问题,你遇到的核心问题是对Telegram Bot API的文件处理机制理解有偏差,再加上代码里的作用域问题,咱们一步步解决:

为什么会报错?

你拿到的file_id只是Telegram服务器用来标识文件的字符串,不是本地文件路径,所以直接传给Image.open()肯定会报找不到文件的错误——Pillow以为你给的是本地电脑上的文件路径,但实际上这个字符串只是Telegram内部的ID而已。

Telegram Bot API处理文件的正确流程

当用户给Bot发送图片后,你需要按以下步骤操作:

  • 通过file_id获取Telegram上的文件对象(包含下载链接)
  • 把文件下载到本地(或者直接获取字节流)
  • 用Pillow处理下载后的文件
  • 把处理后的文件发回给用户

另外,你代码里的sent_photo变量是在image_resize函数里定义的,第二个resize函数根本访问不到它——这是Python的作用域问题,得用register_next_step_handler来传递上下文,而不是分开写两个独立的handler。

修改后的完整代码

import telebot
from PIL import Image
import os
from io import BytesIO

# 替换成你的Bot Token
bot = telebot.TeleBot("YOUR_BOT_TOKEN")

# 处理用户发送的图片
@bot.message_handler(content_types=['photo'])
def image_resize(message):
    # 取分辨率最高的那张图(message.photo按分辨率从小到大排列)
    highest_res_photo = message.photo[-1]
    file_id = highest_res_photo.file_id
    # 提示用户输入尺寸,同时用register_next_step_handler等待输入并传递file_id
    msg = bot.send_message(message.chat.id, "Enter the desired dimensions (WIDTHxHEIGHT), for example 300x150.")
    bot.register_next_step_handler(msg, process_resize, file_id)

# 处理用户输入的尺寸并缩放图片
def process_resize(message, file_id):
    try:
        # 解析宽高,转成整数
        width_str, height_str = message.text.split("x")
        width = int(width_str)
        height = int(height_str)
        
        # 1. 通过file_id获取文件对象
        file_info = bot.get_file(file_id)
        # 2. 下载文件为字节流
        downloaded_file = bot.download_file(file_info.file_path)
        
        # 3. 用BytesIO直接读取字节流,避免写入本地磁盘
        with BytesIO(downloaded_file) as img_buffer:
            im = Image.open(img_buffer)
            resized_img = im.resize((width, height))
        
        # 4. 把处理后的图片转成字节流发送
        with BytesIO() as output_buffer:
            resized_img.save(output_buffer, format='JPEG')
            output_buffer.seek(0)
            bot.send_photo(message.chat.id, output_buffer)
        
    except ValueError:
        bot.send_message(message.chat.id, "Invalid format! Please use WIDTHxHEIGHT, like 300x150.")
    except Exception as e:
        bot.send_message(message.chat.id, f"An error occurred: {str(e)}")

# 启动Bot
bot.polling()

代码关键点解释

  • register_next_step_handler:pyTelegramBotAPI专门用来处理多步交互的方法,它会等待用户的下一条消息,同时把你需要传递的参数(这里是file_id)一起传给处理函数,完美解决了作用域问题。
  • BytesIO优化:用字节流直接处理图片,不用写入本地临时文件,既节省磁盘空间又提升处理速度。
  • 异常处理:捕获格式错误和其他异常,给用户清晰的反馈,避免Bot崩溃。

这样修改后,你的Bot就能正常接收图片、处理缩放并返回结果啦!

内容的提问来源于stack exchange,提问作者Rahul Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:19:09