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

求助:使用aiohttp的Discord.py Bot运行时错误修复

解决Discord.py中aiohttp的ClientPayloadError问题

问题描述

在Discord.py机器人开发中,使用nest_asyncio和aiohttp调用API时触发运行时错误,报错追踪信息如下:

Traceback (most recent call last):
  File "c:\Users\\Desktop\TPLbot\main.py", line 296, in <module>
    client.run(os.getenv("DISCORD_TOKEN"))
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\discord\client.py", line 869, in run
    asyncio.run(runner())
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.1264.0_x64__qbz5n2kfra8p0\Lib\asyncio\runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.1264.0_x64__qbz5n2kfra8p0\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.1264.0_x64__qbz5n2kfra8p0\Lib\asyncio\base_events.py", line 687, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\discord\client.py", line 858, in runner
    await self.start(token, reconnect=reconnect)
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\discord\client.py", line 786, in start
    await self.login(token)
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\discord\client.py", line 620, in login
    data = await self.http.static_login(token)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\discord\http.py", line 816, in static_login
    data = await self.request(Route('GET', '/users/@me'))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\discord\http.py", line 642, in request
    data = await json_or_text(response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\discord\http.py", line 107, in json_or_text
    text = await response.text(encoding='utf-8')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\aiohttp\client_reqrep.py", line 1086, in text
    await self.read()
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\aiohttp\client_reqrep.py", line 1044, in read
    self._body = await self.content.read()
                 ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\\Desktop\TPLbot\.venv\Lib\site-packages\aiohttp\streams.py", line 357, in read
    raise self._exception
aiohttp.client_exceptions.ClientPayloadError: DeflateBuffer.feed_data() takes 2 positional arguments but 3 were given

已尝试的操作:

  • 更新nest_asyncio、aiohttp等相关包
  • 重置Discord令牌
    问题仍未解决,需修复方案。

修复方案

1. 对齐Python与aiohttp版本兼容性

报错显示使用Python 3.12,部分旧版aiohttp对3.12的deflate压缩处理存在兼容问题。可选择:

  • 降级Python至3.11版本,该版本与多数aiohttp版本适配更稳定
  • 升级aiohttp至3.9.0及以上版本,该版本开始完善对Python 3.12的支持

2. 禁用aiohttp的压缩功能

报错根源是deflate压缩的方法参数不匹配,可直接禁用压缩来规避:

  • 自定义aiohttp请求时,创建ClientSession传入compression=False:
import aiohttp

async def call_api():
    async with aiohttp.ClientSession(compression=False) as session:
        async with session.get("你的API地址") as resp:
            return await resp.json()
  • 针对Discord.py内部HTTP请求,可修改HttpClient的压缩配置:
from discord import HttpClient, HTTPBasicAuth
from discord.ext import commands

client = commands.Bot(command_prefix="!")
# 覆盖默认HTTP客户端的压缩设置
client.http = HttpClient(auth=HTTPBasicAuth(client.token), compression=None)

3. 彻底重建依赖环境

可能存在依赖包损坏或版本冲突,执行以下步骤:

  1. 删除当前虚拟环境文件夹(.venv)
  2. 重新创建虚拟环境:
python -m venv .venv
  1. 激活虚拟环境后,安装指定版本的依赖:
pip install discord.py aiohttp==3.9.3 nest_asyncio==1.5.8

4. 移除不必要的nest_asyncio

如果你的代码没有嵌套事件循环的需求,直接删除nest_asyncio.apply()相关代码。Discord.py本身已内置事件循环管理,额外引入nest_asyncio可能引发循环冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:29:53