如何让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_uservsget_user:fetch_user:直接向Discord API请求用户数据,适合用户不在机器人所在服务器的场景,结果更可靠,但需要网络请求;get_user:从机器人本地缓存读取用户数据,速度更快,但如果用户不在缓存中(比如没和机器人在同一服务器)会返回None。
- 方法更新:Discord.py v2.x版本已经移除了
send_message方法,现在标准写法是用user.send()直接给用户发消息。 - 异常处理:加上
try-except能帮你快速定位问题,比如ID写错、用户屏蔽机器人等情况都能给出明确提示。
内容的提问来源于stack exchange,提问作者Sacha Terry
相关产品推荐
相关产品推荐

