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

如何获取对机器人回复消息的反应用户并在创建的线程中提及他们

如何获取对机器人回复消息的反应用户并在创建的线程中提及他们

嘿,我来帮你搞定这个问题!咱们的核心需求就是:当用户给机器人发的那条回复消息加了指定反应后,把这些用户都提到机器人为该消息创建的线程里对吧?下面一步步来实现:

一、先把消息和线程的关联存起来

你原来的代码里创建线程后,最好把机器人发送的消息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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 14:55:33