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

使用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')

关键优化点

  1. 增加状态判断:主动跳过离线状态的机器人账号,从源头避免触发400错误。
  2. 异常捕获机制:用try-except捕获发送过程中的异常,便于排查其他可能的失败原因(比如目标用户关闭了私信权限)。
  3. 简化逻辑:直接使用member.send()发送消息,移除冗余的client.get_user()调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:55:15