使用Discord.py向指定用户ID发送私信 现有代码无法运行如何解决?
代码问题及修复方案
原代码存在的问题
- discord.py v2.0+ 版本中,
Client初始化不能直接传入token参数,token需要在start()或者run()方法中传入,且必须启用必要的网关意图,至少要开启members意图才能正常获取用户对象。 client.get_user()方法要求传入整数类型的用户ID,原代码传入的是字符串格式的"USER_ID",类型不匹配会返回None,后续调用send方法会直接报错。- 异步函数
sendDm没有被调度执行,且client没有启动连接到Discord网关,在客户端未完成登录初始化之前调用get_user也会返回None。 - 没有做异常捕获逻辑,用户不存在、无权限发私信等场景都会导致代码直接崩溃。
调整后可正常运行的代码
import discord # 启用必要的意图 intents = discord.Intents.default() intents.members = True # 成员意图需要同时在Discord开发者后台的机器人设置页开启对应开关 client = discord.Client(intents=intents) async def send_dm(user_id: int, content: str): # 等待客户端完成登录初始化 await client.wait_until_ready() user = client.get_user(user_id) if not user: # 缓存中无用户时尝试通过接口主动拉取 try: user = await client.fetch_user(user_id) except discord.NotFound: print("目标用户不存在") return try: await user.send(content) print("私信发送成功") except discord.Forbidden: print("无法向该用户发送私信,可能是未加好友、对方屏蔽了私信或机器人无对应权限") # 客户端登录完成后触发 @client.event async def on_ready(): print(f"已登录为 {client.user}") # 替换为实际的整数类型用户ID和消息内容 await send_dm(user_id=123456789012345678, content="Hello there!") # 发送完成后关闭客户端 await client.close() # 替换为你的机器人Token,注意不要泄露给他人 client.run("MY_TOKEN")
额外注意事项
- 必须先到Discord开发者后台的机器人设置页,开启
Privileged Gateway Intents下的Server Members Intent开关,否则成员意图不会生效,无法正常获取用户对象。 - 确保你的机器人和目标用户至少有一个共同的Discord服务器,或者已经是好友关系,否则无法发送私信。
- 不要将机器人Token硬编码到公开可访问的代码中,避免Token被盗用导致账号被滥用。
内容的提问来源于stack exchange,提问作者grusso
相关产品推荐
相关产品推荐

