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

PyMongo报错Not a valid ObjectId,Discord机器人黑名单功能异常

错误根因
  • MongoDB的ObjectId有严格的格式限制,仅支持12字节二进制值或24位十六进制字符串,而Discord用户ID为18位十进制数值,不符合ObjectId的格式要求,强制转换会触发bson.errors.InvalidId报错
  • 原有代码存在逻辑硬错误:if True的判断永远成立,无论用户是否在黑名单都会被拦截
解决方案

不需要强制使用ObjectId作为MongoDB文档的_id,直接将Discord原生的用户ID数值作为_id存储和查询即可,同时修正判断逻辑、补充边界校验。

修正后代码
@bot.event
async def on_message(message):
    # 过滤机器人自身消息,避免死循环
    if message.author.bot:
        return
    author_id = message.author.id
    # 直接用Discord用户ID查询,无需转换为ObjectId
    check_blacklist = collection.find_one({"_id": author_id})
    if check_blacklist:
        await message.channel.send("You have been blacklisted from using the bot commands")
    else:
        await bot.process_commands(message)


@bot.command(aliases=["bl"])
async def blacklist(ctx, *, member: discord.Member = None):
    if member is None:
        await ctx.send("Mention a member to blacklist them!")
        return
    # 重复校验,避免插入重复ID触发报错
    if collection.find_one({"_id": member.id}):
        await ctx.send("This user is already in the blacklist")
        return
    post = {"_id": member.id}
    collection.insert_one(post)
    await ctx.send(f"Successfully added {member.mention} to blacklist")

注意:如果集合中已有旧的黑名单数据,需要先清理格式不匹配的记录,保证所有_id都为Discord原生数值类型的用户ID,避免查询不匹配。

内容的提问来源于stack exchange,提问作者0xMukesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:45:08