Discord.py更新后状态切换代码报错,求助asyncio相关修复方案
解决discord.py更新后状态切换任务的错误
错误原因是discord.py v2.x版本移除了在同步上下文直接访问client.loop的支持,必须使用异步初始化钩子或异步主函数来创建后台任务。以下是两种可行的解决方法:
方法一:使用Client.setup_hook(推荐)
setup_hook是discord.py提供的异步初始化钩子,适合用来注册后台任务:
import discord import asyncio import random # 初始化客户端,需指定必要的intents client = discord.Client(intents=discord.Intents.default()) @client.event async def on_ipc_error(endpoint, error): # 移除多余的self参数 print(endpoint, "raised", error) async def ch_pr(): await client.wait_until_ready() statuses = [ discord.Game(name=f"on {len(client.guilds)} servers! | >help"), discord.Game(name="discord.py"), discord.Activity(type=discord.ActivityType.streaming, name="ChezLondo on Youtube", url="https://www.youtube.com/channel/UCE8aHxOOXspTeC0Lm5vx2KA"), discord.Activity(type=discord.ActivityType.streaming, name="ChezLondo_ on Twitch", url="https://www.twitch.tv/chezlondo_"), discord.Activity(type=discord.ActivityType.listening, name="Freker on top.gg!"), discord.Activity(type=discord.ActivityType.watching, name="over you fools") ] while not client.is_closed(): status = random.choice(statuses) await client.change_presence(activity=status) await asyncio.sleep(10) @client.event async def setup_hook(): # 在异步初始化钩子中创建后台任务 client.loop.create_task(ch_pr()) # 启动机器人 client.run("你的机器人令牌")
方法二:使用异步main函数
把客户端启动和任务创建都放在异步主函数中,通过asyncio.run执行:
import discord import asyncio import random client = discord.Client(intents=discord.Intents.default()) @client.event async def on_ipc_error(endpoint, error): # 移除多余的self参数 print(endpoint, "raised", error) async def ch_pr(): await client.wait_until_ready() statuses = [ discord.Game(name=f"on {len(client.guilds)} servers! | >help"), discord.Game(name="discord.py"), discord.Activity(type=discord.ActivityType.streaming, name="ChezLondo on Youtube", url="https://www.youtube.com/channel/UCE8aHxOOXspTeC0Lm5vx2KA"), discord.Activity(type=discord.ActivityType.streaming, name="ChezLondo_ on Twitch", url="https://www.twitch.tv/chezlondo_"), discord.Activity(type=discord.ActivityType.listening, name="Freker on top.gg!"), discord.Activity(type=discord.ActivityType.watching, name="over you fools") ] while not client.is_closed(): status = random.choice(statuses) await client.change_presence(activity=status) await asyncio.sleep(10) async def main(): async with client: # 在启动客户端前注册后台任务 client.loop.create_task(ch_pr()) await client.start("你的机器人令牌") asyncio.run(main())
关键注意点
- 移除
on_ipc_error函数中的self参数:用@client.event装饰的事件函数不需要传入self,否则会触发参数不匹配错误。 - 必须指定intents:discord.py v2.x版本强制要求设置机器人intents,否则无法正常连接到Discord服务器。
内容的提问来源于stack exchange,提问作者Londo.py.
相关产品推荐
相关产品推荐

