discord.py如何实现投票达指定✅反应数自动转发到其他频道
实现方案
核心通过监听on_reaction_add事件实现,不需要依赖asyncio定时轮询,触发逻辑:
- 事件触发后逐层过滤:仅处理指定投票频道内、由机器人自身发送的投票Embed消息的
✅表情反应 - 统计有效票数时扣除机器人自己添加的初始反应,避免计数偏差
- 增加去重标记,防止投票达标后重复转发
- 有效票数达到5阈值时,自动把对应投票的Embed转发到目标频道
代码修改示例
首先在你的Cog类初始化方法中添加必要的配置项:
def __init__(self, bot): self.bot = bot self.forwarded_polls = set() # 存储已转发的投票消息ID,实现去重 self.vote_channel_id = 123456789 # 替换为实际投票频道的ID self.target_channel_id = 987654321 # 替换为接收转发内容的目标频道ID
在Cog中添加反应事件监听方法:
@commands.Cog.listener() async def on_reaction_add(self, reaction, user): # 非目标表情直接跳过 if str(reaction.emoji) != "✅": return # 非投票频道的消息直接跳过 if reaction.message.channel.id != self.vote_channel_id: return # 非机器人发送的消息直接跳过 if reaction.message.author.id != self.bot.user.id: return # 已经转发过的投票直接跳过 if reaction.message.id in self.forwarded_polls: return # 计算有效赞同票:总反应数减去机器人自己加的初始1票 valid_approve_count = reaction.count - 1 if valid_approve_count >= 5: # 标记为已转发 self.forwarded_polls.add(reaction.message.id) # 获取目标频道对象 target_channel = self.bot.get_channel(self.target_channel_id) # 转发投票Embed,可根据需求额外添加说明文本 await target_channel.send(embed=reaction.message.embeds[0])
原有poll命令不需要做核心修改,保留原有发送Embed、添加初始反应的逻辑即可。
注意事项
- 需要在Discord开发者后台开启机器人的
Server Members Intent和Message Content Intent,同时在机器人初始化代码中配置对应intents,否则on_reaction_add事件可能无法正常触发。 - 用内存集合存储已转发投票ID的方式,会在机器人重启后清空记录,如果需要重启后也不重复转发,可以把已处理的消息ID存储到本地文件或数据库中。
- 如果需要兼容机器人重启前发送的未达标投票,可以在Cog加载完成时拉取投票频道最近的历史消息完成缓存,常规场景下机器人运行期间创建的投票不需要额外处理。
- 如果需要同步处理用户撤销反应的场景,可以额外监听
on_reaction_remove事件更新计数,因为达标后会标记为已转发不再处理,不影响核心触发逻辑。
内容的提问来源于stack exchange,提问作者user15558580
相关产品推荐
相关产品推荐

