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

aiogram发送图片失败及代理配置问题求助

问题描述

使用aiogram发送图片时出现错误:Failed to send bytes into the underlying connection Connection,尝试配置代理后仍报错。运行/start命令正常,但发送消息触发图片发送时出现以下错误:

aiogram.exceptions.TelegramNetworkError: HTTP Client says - ClientConnectionError: Failed to send bytes into the underlying connection Connection<ConnectionKey(host='api.telegram.org', port=443, is_ssl=True, ssl=True, proxy=None, proxy_auth=None, proxy_headers_hash=7572682526898458434)>

从错误信息看机器人并未使用代理,现提出两个问题:

  1. 如何配置aiogram机器人以使用代理?
  2. 是否存在无需代理即可发送图片的方法?

运行代码如下:

API_TOKEN = 'token'
session = AiohttpSession(proxy='https://<user>:<pass>@<proxy>:<port>')
bot = Bot(token=API_TOKEN, session=session)
dp = Dispatcher(storage=MemoryStorage())
def make_picture():
    # Твоя логика обработки сообщения
    # Например, создаем картинку (здесь просто как пример черного изображения)
    img = BytesIO()
    img.name = 'result.png'
    # Генерируем картинку как черное изображение
    from PIL import Image
    image = Image.new('RGB', (200, 200), color='black')
    image.save(img, 'PNG')
    img.seek(0)
    return img
router = Router()
@router.message(Command("start"))
async def start_handler(msg: Message):
    await msg.answer("Hi!")
@router.message()
async def message_handler(message: Message):
    img = make_picture()
    await message.answer_photo(BufferedInputFile(file ='test',filename='result.png'))
async def main():
    dp.include_router(router)
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)
if __name__ == "__main__":
    await main()
解决方案

1. 正确配置aiogram代理

你的代码存在两个核心问题:一是代理配置未生效的潜在问题,二是message_handler中调用BufferedInputFile时传入了无效的字符串'test'而非生成的图片对象,这也是发送失败的直接原因之一。

正确的代理配置步骤:

  • 替换代理地址中的占位符为实际的用户名、密码、代理IP和端口
  • 若代理需要关闭SSL验证,添加verify_ssl=False参数
  • 若使用socks5代理,需安装aiohttp-socks库,改用Socks5Session

修正后的完整代码:

from aiogram import Bot, Dispatcher, Router, types
from aiogram.filters.command import Command
from aiogram.types import BufferedInputFile
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.storage.memory import MemoryStorage
from io import BytesIO
from PIL import Image

API_TOKEN = '你的token'
# 替换为实际代理信息
proxy_url = 'https://<user>:<pass>@<proxy>:<port>'
# 若代理需关闭SSL验证,添加verify_ssl=False
session = AiohttpSession(proxy=proxy_url, verify_ssl=False)
bot = Bot(token=API_TOKEN, session=session)
dp = Dispatcher(storage=MemoryStorage())
router = Router()

def make_picture():
    img = BytesIO()
    img.name = 'result.png'
    image = Image.new('RGB', (200, 200), color='black')
    image.save(img, 'PNG')
    img.seek(0)
    return img

@router.message(Command("start"))
async def start_handler(msg: types.Message):
    await msg.answer("Hi!")

@router.message()
async def message_handler(message: types.Message):
    img = make_picture()
    # 修正:传入图片的字节数据,而非无效字符串
    await message.answer_photo(BufferedInputFile(file=img.getvalue(), filename='result.png'))

async def main():
    dp.include_router(router)
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

若使用socks5代理,替换session部分代码:

from aiogram.client.session.socks import Socks5Session
session = Socks5Session(proxy='socks5://<user>:<pass>@<proxy>:<port>')

2. 无需代理发送图片的方法

如果你的网络可以直接访问Telegram API(api.telegram.org),无需代理即可发送图片,需完成以下排查和修正:

  • 验证网络连通性:通过浏览器访问https://api.telegram.org/bot<你的token>/getMe,确认能正常返回JSON结果
  • 修复代码中BufferedInputFile的参数错误,传入实际的图片字节数据(参考上面修正后的message_handler代码)
  • 检查防火墙、杀毒软件是否拦截了Python程序的网络请求

无代理版本只需去掉代理配置:

session = AiohttpSession()
bot = Bot(token=API_TOKEN, session=session)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:32:09