使用discord.py-self无法发送私信,报400 Bad Request错误求助
问题排查与解决
核心原因分析
- 离线机器人无法接收私信:Discord的机器人账号(非普通用户账号)处于离线状态时,Discord服务器会拒绝向其发送私信的请求,直接触发
400 Bad Request错误。 - 代码冗余调用:你已通过
member对象获取到目标成员,无需再调用client.get_user(member.id),多余的调用不仅无意义,还可能引发潜在逻辑问题。
修改后的代码
import discord class MyClient(discord.Client): async def on_ready(self): print(f'Logged in as {self.user} (ID: {self.user.id})') print('BOT IS RUNNING') async def on_message(self, message): if message.content.startswith('.hello'): await message.channel.send('Hello!', mention_author=True) for member in message.guild.members: if member.id != self.user.id: # 跳过离线机器人,避免触发400错误 if member.bot and member.status == discord.Status.offline: print(f"Skipping offline bot: {member.name}") continue try: await member.send('hello') print(f"Message sent to {member.name} successfully") except discord.HTTPException as e: print(f"Failed to send message to {member.name}: {str(e)}") client = MyClient() client.run('my token')
关键优化点
- 增加状态判断:主动跳过离线状态的机器人账号,从源头避免触发400错误。
- 异常捕获机制:用
try-except捕获发送过程中的异常,便于排查其他可能的失败原因(比如目标用户关闭了私信权限)。 - 简化逻辑:直接使用
member.send()发送消息,移除冗余的client.get_user()调用。
内容的提问来源于stack exchange,提问作者CYCNO
相关产品推荐
相关产品推荐

