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

Discord Python机器人调取数据时获取机器人自身ID而非命令执行者ID的问题求助

Discord Python机器人调取数据时获取机器人自身ID而非命令执行者ID的问题求助

兄弟,我看了你的代码,发现几个关键问题导致你拿到的是机器人自身ID,而且整体代码结构和SQL执行逻辑也有不少问题,咱们一步步来理顺:

核心问题分析

  • 命令与事件混写混乱:你把picked命令函数和on_message事件绑定到一起了,这会导致命令的上下文(ctx)和消息事件的message对象混淆,而且Discord.py的命令系统和on_message事件如果处理不当,会互相干扰。
  • SQL查询写法错误:你直接用字符串拼接ID的方式写SQL,不仅有SQL注入风险,而且执行查询后没有正确获取结果——cursor.execute()返回的是游标对象,不是查询到的数据。
  • 数据库资源处理不当:你直接在命令里关闭游标和数据库连接,这会导致后续命令无法再访问数据库,而且关闭的写法也不对(少了括号)。

修正后的代码示例

import discord
from discord.ext import commands
import logging

# 初始化日志
logger = logging.getLogger(__name__)

# 初始化机器人,替换成你的命令前缀
bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

# 用@bot.command()装饰器定义命令,这是Discord.py标准的命令写法
@bot.command(name="picked")
async def picked(ctx):
    # 通过ctx直接获取命令执行者的ID和信息
    user_id = ctx.author.id
    logger.info(f"User: '{user_id}' ran picked command")

    try:
        # 用参数化查询避免SQL注入,同时一次性查询三个字段更高效
        # 注意:如果用sqlite3,占位符是?;MySQL用%s,根据你的数据库调整
        cursor.execute("SELECT currentpick1, currentpick2, currentpick3 FROM nascarpool WHERE id = %s", (user_id,))
        result = cursor.fetchone()

        if result:
            pick1, pick2, pick3 = result
            await ctx.send(f"You have registered the following picks: '{pick1}', '{pick2}', and '{pick3}'")
        else:
            await ctx.send("You haven't submitted any picks yet!")
    except Exception as e:
        logger.error(f"Error fetching picks: {e}")
        await ctx.send("Oops, there was an error retrieving your picks.")

# 机器人就绪事件
@bot.event
async def on_ready():
    logger.info(f"Logged in as {bot.user} (ID: {bot.user.id})")
    print(f"Logged in as {bot.user}")

# 如果你保留on_message事件,必须加上这行才能让命令系统正常工作
@bot.event
async def on_message(message):
    # 跳过机器人自己发送的消息,避免循环触发
    if message.author == bot.user:
        return
    # 让命令系统处理消息中的命令
    await bot.process_commands(message)

# 替换成你的机器人令牌
bot.run("YOUR_BOT_TOKEN")

关键改动说明

  1. 命令定义规范:用@bot.command()装饰器定义picked命令,通过ctx上下文直接获取ctx.author.id,这才是正确获取命令发起用户ID的方式。
  2. 安全的SQL查询:用参数化占位符代替字符串拼接,既避免了SQL注入风险,又能正确匹配用户数据。
  3. 正确获取查询结果:执行查询后用cursor.fetchone()获取单条用户记录(每个用户ID对应一条数据),再解构结果中的字段。
  4. 事件与命令兼容:如果保留on_message事件,必须调用await bot.process_commands(message),否则Discord.py的命令系统会失效;同时跳过机器人自身的消息,避免不必要的触发。
  5. 数据库资源优化:建议不要在每次命令里关闭游标和数据库连接,最好在机器人启动时建立连接,关闭时统一释放,或者用with上下文管理器自动管理资源。

备注:内容来源于stack exchange,提问作者racin36er

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 16:00:28