You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

discord.py 1.7.3版本向固定特定用户发送私信(DM)失败问题求助

解决discord.py 1.7.3发送私信(DM)失败的问题

你遇到的核心问题是client.get_user()返回了None,导致调用send()时触发AttributeError。我来给你拆解原因和靠谱的解决办法:

为什么会出现这个错误?

在discord.py 1.7.x版本中,client.get_user()是从机器人的本地用户缓存里查找用户的。如果这个用户和机器人不在同一个服务器,或者机器人刚启动还没加载到该用户的缓存数据,get_user()就会返回None,自然没法调用send()方法。

可靠的解决方法

方法1:用fetch_user()替代get_user()

fetch_user()会直接向Discord API请求用户数据,不依赖本地缓存,这是1.7.3版本里获取固定用户最稳妥的方式。同时建议加上异常处理,方便排查其他可能的问题:

import discord
from discord.ext import commands

@client.command()
async def dm(ctx):
    try:
        # 替换成你要发送的目标用户ID
        user = await client.fetch_user(1234567891011)
        await user.send("Hi")
        await ctx.send("私信已经成功发送啦!")
    except discord.NotFound:
        await ctx.send("找不到这个用户哦,请检查用户ID是否正确!")
    except discord.Forbidden:
        await ctx.send("没办法给这个用户发私信,可能是对方关闭了陌生人私信,或者把我拉黑了😅")
    except Exception as e:
        await ctx.send(f"发送失败啦,错误信息:{str(e)}")

方法2:确认用户与机器人的互动关系

如果用了fetch_user()还是失败,要注意Discord的API限制:

  • 机器人只能给和自己在同一个服务器的用户发私信,或者用户先给机器人发过消息的用户发私信。
  • 如果用户和机器人没有任何互动或共同服务器,机器人是无法主动发起私信的,这是Discord的安全机制限制。

额外注意事项

  • 确保你的机器人已经正确登录,并且拥有基本的“发送消息”权限。
  • 如果一定要用get_user(),可以尝试启用intents.members(需要在Discord开发者后台开启成员意图,同时在代码中配置)让机器人加载目标用户所在服务器的成员缓存,但这种方式不如fetch_user()直接可靠。

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

火山引擎 最新活动