discord.py on_reaction_add中获取embed描述发送至指定频道方法
实现方法
直接在原有逻辑基础上补充两个核心模块即可,具体修改点如下:
- 频道前置校验:在票数判断逻辑最开头,通过
reaction.message.channel.id匹配允许发起投票的频道ID,不匹配直接终止逻辑,避免非投票频道的反应误触发规则 - 跨频道消息发送:通过bot实例的
get_channel()方法拿到指定ID的目标频道对象,再提取原消息携带的embed内容发送即可,注意要先判断原消息是否存在embed,避免空值报错
修改后的可运行代码:
@commands.Cog.listener() async def on_reaction_add(self,reaction, user): # 过滤机器人自身的反应,避免自触发 if user.bot: return # 频道校验,替换为你自己的投票频道ID(整数类型,不要加引号) ALLOWED_VOTE_CHANNEL_ID = 123456789012345678 # 替换为投票结果要发送的目标频道ID TARGET_SEND_CHANNEL_ID = 876543210987654321 if reaction.message.channel.id != ALLOWED_VOTE_CHANNEL_ID: return if reaction.count == 2 and reaction.emoji == "✅": await reaction.message.reply(f"Votacion Aceptada") # 获取目标频道实例 target_channel = self.bot.get_channel(TARGET_SEND_CHANNEL_ID) # 提取原消息embed if reaction.message.embeds: vote_embed = reaction.message.embeds[0] # 仅发送embed描述就传content参数,需要发送完整embed直接传embed参数即可 await target_channel.send(content=vote_embed.description, embed=vote_embed) elif reaction.count == 2 and reaction.emoji == "❌": await reaction.message.delete()
注意事项:
- 所有频道ID必须传整数类型,不要加引号转成字符串,否则ID匹配会失败
- 如果运行后拿不到原消息的embed内容,需要去Discord开发者后台开启Message Content Intent权限,同时在bot实例初始化时配置对应intents参数
- 如果目标频道和bot不在同一个服务器,
get_channel会返回空值,需要提前确认bot已经加入目标频道所在服务器、且拥有目标频道的发送消息权限
内容的提问来源于stack exchange,提问作者user15558580
相关产品推荐
相关产品推荐

