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

Nextcord:不依赖on_message事件或命令实现用户DM消息发送

问题分析与解决

错误原因

  1. Bot未就绪时执行任务:你在bot.run()之前就通过bot.loop.create_task(send_dm())启动了发送DM的任务,此时Bot还未完成登录和初始化,内部API连接未建立,调用bot.get_user()会返回_MissingSentinel(表示未找到用户或Bot未就绪),进而调用send()时触发错误。
  2. 用户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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:32:47