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
相关产品推荐
相关产品推荐

