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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:36:04