如何在pycord中实现点击后删除消息的特定表情反应?
解决PyCord/Discord.py中点击表情后删除用户反应的问题
完全可以实现用户点击特定表情后删除其对应的反应,你的代码存在几个关键问题,下面逐一修正:
代码问题分析
- 缺少
asyncio导入,使用asyncio.TimeoutError会触发报错 - 表情符号用了占位符(
"SomeEmoji"、空字符串""),导致判断逻辑完全失效 reaction.delete()会删除所有用户对该表情的反应,而非点击者自己的反应,应该用reaction.remove(user)wait_for仅监听一次反应,无法处理用户多次点击的场景(如果有需要)- 重复添加了同一个表情,应该替换为两个不同的目标表情
修正后的代码
import discord import asyncio # 新增必要导入 from discord.ext import commands intents = discord.Intents.all() intents.message_content = True # 必须开启消息内容意图,否则无法读取用户消息 bot = commands.Bot(command_prefix="!", intents=intents) @bot.event async def on_message(message): if message.author == bot.user: return if message.content == 'test': reply_msg = await message.reply('Is this cool?') # 替换成你实际需要的表情,这里用👍和👎做示例 like_emoji = "👍" dislike_emoji = "👎" await reply_msg.add_reaction(like_emoji) await reply_msg.add_reaction(dislike_emoji) def check(reaction, user): # 只监听消息作者的反应,且是指定表情,且反应在机器人的回复消息上 return user == message.author and str(reaction.emoji) in [like_emoji, dislike_emoji] and reaction.message.id == reply_msg.id try: # 循环监听,支持用户多次点击表情直到超时 while True: reaction, user = await bot.wait_for("reaction_add", check=check, timeout=30.0) # 删除当前点击者的该反应 await reaction.remove(user) # 根据点击的表情回复对应内容 if str(reaction.emoji) == like_emoji: await message.reply('Like it.') else: await message.reply("NO like") except asyncio.TimeoutError: await message.reply("Timeout bro.") # 替换成你的机器人Token bot.run("YOUR_BOT_TOKEN")
关键说明
- 精准删除用户反应:
reaction.remove(user)只会移除当前点击者的该表情反应,而reaction.delete()会删除这条消息上所有用户的该表情,务必区分使用 - 自定义表情处理:如果用的是服务器自定义表情,需要用
discord.PartialEmoji对象,格式为discord.PartialEmoji(name="表情名称", id=表情ID) - 单次/多次监听:如果只需要用户点击一次就结束,去掉
while True循环即可 - 权限配置:一定要在Discord开发者门户开启
Message Content Intent,否则机器人无法读取用户发送的test消息
内容的提问来源于stack exchange,提问作者BatteTarte
相关产品推荐
相关产品推荐

