Nextcord:不依赖on_message事件或命令实现用户DM消息发送
问题分析与解决
错误原因
- Bot未就绪时执行任务:你在
bot.run()之前就通过bot.loop.create_task(send_dm())启动了发送DM的任务,此时Bot还未完成登录和初始化,内部API连接未建立,调用bot.get_user()会返回_MissingSentinel(表示未找到用户或Bot未就绪),进而调用send()时触发错误。 - 用户ID类型错误:
bot.get_user()的参数需要是整数类型的用户ID,你传了字符串"0123456789",这也会导致无法正确获取用户对象。
修正后的代码
import nextcord from nextcord.ext import commands intents = nextcord.Intents.default() intents.message_content = True bot = commands.Bot(command_prefix="/", intents=intents) @bot.event async def on_ready(): print(f"Logged in as {bot.user.name} ({bot.user.id})") # Bot就绪后再执行发送DM的任务 await send_dm() async def send_dm(): try: # 用户ID改为整数类型 user = await bot.get_user(123456789) # 替换成实际用户ID if user: await user.send("网站已更新!") print("DM发送成功") else: print("未找到目标用户") except nextcord.Forbidden: print("无法发送DM:用户已关闭DM或Bot无权限") except Exception as e: print(f"发送DM时出错:{str(e)}") bot.run("你的Bot令牌")
关键修改点
- 将发送DM的逻辑移到
on_ready事件中,确保Bot完全就绪后再执行API操作。 - 用户ID从字符串改为整数,符合
get_user()的参数要求。 - 添加异常捕获,处理DM发送失败的常见情况(如用户拒收、权限不足)。
扩展说明
如果需要在监控到网站更新时触发DM(而非仅Bot启动时),可以将send_dm()函数作为独立的触发逻辑,比如在你的网站监控代码检测到变更时,调用这个异步函数即可。注意要确保Bot处于运行状态,且调用时在事件循环中执行(可以用asyncio.run()或者Bot的事件循环调度)。
内容的提问来源于stack exchange,提问作者xeny
相关产品推荐
相关产品推荐

