求助:使用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. 彻底重建依赖环境
可能存在依赖包损坏或版本冲突,执行以下步骤:
- 删除当前虚拟环境文件夹(
.venv) - 重新创建虚拟环境:
python -m venv .venv
- 激活虚拟环境后,安装指定版本的依赖:
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
相关产品推荐
相关产品推荐

