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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:57:49