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

如何让Discord机器人就绪时发送私信?

解决Discord机器人就绪时发送私信的问题

嘿,我来帮你搞定这个需求!你当前代码里的问题在于手动创建discord.PrivateChannel实例是无效的——Discord.py不允许我们直接初始化这类频道对象,得通过正确的方式获取目标用户,再发送私信。

修正后的代码示例

import discord
from discord.ext import commands

# 先确保你正确初始化了机器人(这里是基础示例)
bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

@bot.event
async def on_ready():
    print("Ready when you are")
    print(f"I am running on: {bot.user.name}")
    print(f"With the ID: {bot.user.id}")
    
    # 替换成你的用户ID(注意是纯数字格式,比如你写的4803)
    your_user_id = 4803
    try:
        # 通过Discord API获取目标用户对象(即使不在同一服务器也能生效)
        target_user = await bot.fetch_user(your_user_id)
        # 直接给用户发送私信
        await target_user.send("Ready", tts=True)
        print("私信已成功发送!")
    except discord.NotFound:
        print("错误:找不到该用户,请检查用户ID是否正确!")
    except discord.Forbidden:
        print("错误:无法发送私信——可能用户屏蔽了机器人,或者机器人没有相关权限!")
    except Exception as e:
        print(f"发送私信时遇到未知错误:{str(e)}")

# 最后用你的机器人token启动
bot.run("YOUR_BOT_TOKEN_HERE")

关键细节说明

  • 不能手动创建频道对象:discord.PrivateChannel需要Discord服务器返回的有效数据支撑,手动实例化的对象没有实际通信能力,必须通过fetch_user或get_user获取合法的用户对象。
  • fetch_user vs get_user:
    • fetch_user:直接向Discord API请求用户数据,适合用户不在机器人所在服务器的场景,结果更可靠,但需要网络请求;
    • get_user:从机器人本地缓存读取用户数据,速度更快,但如果用户不在缓存中(比如没和机器人在同一服务器)会返回None。
  • 方法更新:Discord.py v2.x版本已经移除了send_message方法,现在标准写法是用user.send()直接给用户发消息。
  • 异常处理:加上try-except能帮你快速定位问题,比如ID写错、用户屏蔽机器人等情况都能给出明确提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:11