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

Discord机器人Cog加载报错:setup()缺失ctx和message参数

Discord机器人Economy Cog问题修复指南

一、核心错误:setup()参数不匹配

你收到的setup()缺少2个必需参数错误,是因为discord.py加载扩展时,setup函数只需要接收bot这一个参数,你额外添加的ctx和message完全多余,导致调用时参数不匹配。

修复后的setup函数:

async def setup(bot):
    await bot.add_cog(EconCog(bot))
    print("Economy cog has been loaded successfully!")

二、addtokens命令的参数逻辑错误

  1. 命令定义里的message参数是冗余的,discord.py命令的第一个固定参数是ctx,要指定目标用户应该用member: discord.Member作为参数,而非message。
  2. ctx.send()必须加await,否则会触发协程未执行的错误。
  3. 你当前的逻辑没有处理用户已存在的情况,直接插入会导致主键冲突(后续优化表结构后)。

修复后的addtokens命令示例:

@commands.command()
async def addtokens(self, ctx, member: discord.Member, number: int = None):
    if ctx.author.guild_permissions.ban_members:
        if number is None:
            await ctx.send("请输入要添加的代币数量")
            return
        db = sqlite3.connect("economy.sqlite")
        cursor = db.cursor()
        # 先查询用户是否已存在于数据库
        cursor.execute("SELECT Tokens FROM economy WHERE user_id = ?", (member.id,))
        result = cursor.fetchone()
        if result:
            # 用户存在则更新代币数量
            cursor.execute("UPDATE economy SET Tokens = Tokens + ? WHERE user_id = ?", (number, member.id))
        else:
            # 用户不存在则插入新记录
            cursor.execute("INSERT INTO economy(user_id, Tokens, Weapons) VALUES (?, ?, ?)", (member.id, number, ""))
        db.commit()
        await ctx.send("操作完成!")
        cursor.close()
        db.close()
    else:
        await ctx.send("想多了,你没有执行这个操作的权限。")

三、SQLite代码的问题与优化

  1. 建表语句语法错误:原SQL最后一列后多了一个逗号,会触发语法错误:
-- 错误写法
CREATE TABLE IF NOT EXISTS economy(
    Tokens INTEGER,
    Weapons TEXT,
    user_id INTEGER,  -- 这里的逗号要删除
)

修复并优化(添加主键和默认值):

CREATE TABLE IF NOT EXISTS economy(
    Tokens INTEGER DEFAULT 0,
    Weapons TEXT DEFAULT "",
    user_id INTEGER PRIMARY KEY  -- 设为主键,避免同一用户重复插入
)
  1. SQL注入风险:不要用字符串拼接SQL(f"SELECT ... {author.id}"),必须用?占位符做参数化查询,这是数据库操作的标准安全做法。
  2. 列数不匹配错误:原插入语句中,SQL只指定了2个列,但你传入了3个值(比如(author.id, 0, 0)),会直接触发执行错误。

四、其他细节问题

  • on_ready事件会在机器人每次重连时触发,建表逻辑可以保留,但建议把数据库连接的逻辑封装成工具函数,避免重复代码。
  • removetokens命令目前只有权限判断,没有具体的代币移除逻辑,可以参考addtokens的逻辑实现,同样使用参数化查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:01:13