Discord.py后台任务:如何为消息反应传递正确上下文?代码求助
解决Discord机器人后台任务中添加消息反应的上下文问题
我明白你现在遇到的问题了——在后台定时任务里发送图片后,不知道怎么正确给消息添加反应对吧?咱们先拆解下你代码里的问题,再一步步修正。
你的代码里的核心问题
- 调用
bot.add_reaction时,你传的是discord.message,这是Discord.py里的消息类,不是你刚发送出去的那条实际消息对象,机器人根本不知道要给哪条消息加反应 bot.is_closed少了括号,应该是bot.is_closed()——这是个方法调用,不然会一直判断为True,循环根本停不下来- 用
discord.Object创建频道对象不够稳妥,最好用bot.get_channel获取真实的频道实例,避免后续操作因为对象无效出错
修正后的完整代码
import asyncio import discord async def my_background_task(): await bot.wait_until_ready() counter = 0 # 用get_channel获取真实的频道对象,比discord.Object更可靠 channel = bot.get_channel(446782521070321664) # 调用is_closed()方法判断机器人状态,必须加括号 while not bot.is_closed(): counter += 1 with open('vbuck.png', 'rb') as f: # 保存send_file返回的消息对象,这就是刚发出去的那条消息 sent_message = await bot.send_file(channel, f) # 用保存的sent_message作为第一个参数,给目标消息加反应 await bot.add_reaction(sent_message, '<:vbuck:441740047897591809>') # 7分钟=420秒,定时逻辑没问题 await asyncio.sleep(420) bot.loop.create_task(my_background_task())
关键修改点解释
- 获取有效频道对象:
bot.get_channel会从机器人的缓存里拉取真实的频道实例,确保后续发送消息、操作消息都能正常执行,而discord.Object只是一个空壳对象,没有实际的频道数据支撑 - 保存发送的消息实例:
send_file方法会返回发送成功的Message对象,我们把它存在sent_message变量里,这就是后续要加反应的具体目标 - 正确调用add_reaction:第一个参数必须是实际的
Message对象,而不是discord.message类,这样机器人才能精准定位到要操作的消息 - 修复循环终止条件:
bot.is_closed()是判断机器人是否已关闭的方法,必须加括号调用,不然循环会无限执行下去
额外版本兼容提示
如果你的Discord.py版本比较新(v1.0+),send_file已经被官方弃用了,建议改用channel.send方法,代码可以改成这样:
with open('vbuck.png', 'rb') as f: sent_message = await channel.send(file=discord.File(f))
这样更符合新版本的API规范,避免后续版本更新后出现兼容问题。
内容的提问来源于stack exchange,提问作者Jordan Rose
相关产品推荐
相关产品推荐

