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

Discord.py如何通过ID获取discord.Message对象 用于抽奖机器人开发

问题解答

你的代码核心问题出在bot.get_channel的调用方式上,另外还要注意几个权限和参数类型的问题:

错误原因

  • bot.get_channel是同步方法,不需要加await关键字。你额外加了await后,因为该方法不是异步协程,执行到这一步会直接中断,你没有看到报错大概率是上层调用giveaway_end函数的逻辑捕获了全局异常但没有打印错误栈。
  • 请确认你存储的fb_giveaway_channel_ID、db_giveaway_message_ID都是整数类型,discord.py所有ID相关的参数都要求传入int,传入字符串会直接报错。
  • 请确认你的机器人拥有对应频道的查看频道、读取消息历史权限,没有权限的情况下fetch_message会返回403错误,同样会被吞异常导致无输出。

修改后的可用代码

async def giveaway_end(giveaway_db_fetch):
    print('Giveaway End startet')
    db_giveaway_message_ID = giveaway_db_fetch[4]
    db_giveaway_starter = giveaway_db_fetch[3]
    # 注意先把ID转成int,避免数据库查出来是字符串
    fb_giveaway_channel_ID = int(giveaway_db_fetch[5])
    db_giveaway_price = giveaway_db_fetch[1]
    print(db_giveaway_message_ID)
    
    # get_channel是同步方法,去掉await
    giveaway_msg_channel = bot.get_channel(fb_giveaway_channel_ID)
    # 先做非空判断,避免频道不存在
    if not giveaway_msg_channel:
        print(f"未找到ID为{fb_giveaway_channel_ID}的频道")
        return
    print(f'Giveaway Message Channel = {giveaway_msg_channel.name}')
    try:
        # 这里fetch_message是异步方法,要保留await,同时加异常捕获
        giveaway_msg = await giveaway_msg_channel.fetch_message(int(db_giveaway_message_ID))
        print(f'Message found: {giveaway_msg.id}')
    except Exception as e:
        # 打印错误信息方便排查
        print(f"获取消息失败:{str(e)}")

额外排查建议

如果修改后还是有问题,给你上层调用giveaway_end的位置加上异常捕获打印,就能看到具体的报错信息:

try:
    await giveaway_end(your_db_data)
except Exception as e:
    print(f"执行抽奖结束逻辑报错:{str(e)}")
    # 可以加traceback打印完整错误栈
    import traceback
    traceback.print_exc()

内容的提问来源于stack exchange,提问作者SoldØut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:06:05