如何获取对机器人回复消息的反应用户并在创建的线程中提及他们
如何获取对机器人回复消息的反应用户并在创建的线程中提及他们
嘿,我来帮你搞定这个问题!咱们的核心需求就是:当用户给机器人发的那条回复消息加了指定反应后,把这些用户都提到机器人为该消息创建的线程里对吧?下面一步步来实现:
一、先把消息和线程的关联存起来
你原来的代码里创建线程后,最好把机器人发送的消息ID和对应的线程ID绑定保存,这样后面收到反应时,能快速找到要发消息的线程。咱们可以用一个全局字典来存这个映射:
# 全局定义字典,用来关联消息ID和对应的线程ID message_thread_map = {} # 修改你原有的代码块,创建线程后保存映射 if user == reaction.message.author and str(reaction.emoji) == "💴": channel = client.get_channel(1285915841254395956) # 过滤开头的提及内容(你的原有逻辑保留) mention_regex = re.compile(r"^<@&(\d+)> ") filtered_content = mention_regex.sub("", reaction.message.content, 1) print(filtered_content) message = await channel.send(f"{filtered_content} by {reaction.message.author.mention}") await message.add_reaction("💴") # 创建线程时保存线程对象,并存入字典 thread = await message.channel.create_thread( name=message.content, message=None, auto_archive_duration=1440, reason=None ) message_thread_map[message.id] = thread.id
二、监听反应事件,收集用户并提及
接下来要监听用户给消息加反应的事件,这里推荐用on_raw_reaction_add,它能监听所有消息的反应(包括机器人重启前发的旧消息,比普通的on_reaction_add更靠谱):
@client.event async def on_raw_reaction_add(payload): # 先判断是不是咱们要的那个💴表情 if str(payload.emoji) != "💴": return # 获取触发反应的消息 message = await client.get_channel(payload.channel_id).fetch_message(payload.message_id) # 确认这条消息是机器人自己发的,避免处理无关消息 if message.author != client.user: return # 检查这条消息有没有对应的线程(在咱们的映射字典里) if message.id not in message_thread_map: return # 收集所有反应的用户,排除机器人自己 reacted_users = [] async for user in message.reactions[0].users(): if user != client.user: reacted_users.append(user.mention) # 拿到对应的线程,发送提及消息 thread = await client.get_channel(message_thread_map[message.id]) if reacted_users: await thread.send(f"感谢以下小伙伴的互动:{' '.join(reacted_users)}")
三、额外小提示
- 如果不想每次有新反应都发一条消息,你可以改成只发一次,或者在线程的初始消息里更新内容,具体看你的需求调整。
- 要是机器人重启后,
message_thread_map里的内容会丢失,要是需要持久化保存这个关联,可以用本地文件或者简单的数据库来存。 - 记得确保你的机器人有对应的权限:比如创建线程、发送消息、提及用户的权限。
这样改完之后,用户给机器人的回复消息加💴反应时,机器人就会自动把这些用户提到对应的线程里啦!
备注:内容来源于stack exchange,提问作者Rivendare
相关产品推荐
相关产品推荐

