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

discord.py如何实现等待用户私信回复后继续发送消息

discord.py 私信场景等待用户回复实现方案

要实现机器人发私信后暂停流程、等用户回复再继续执行的逻辑,直接用框架自带的wait_for协程方法即可,不需要额外写状态存储。

实现要点

  • 用wait_for('message')监听消息事件,传入自定义校验函数,过滤掉无关消息
  • 校验规则必须同时匹配「消息发送者是触发命令的用户」「消息发送渠道是和该用户的私信频道」两个条件,避免收到其他频道/其他用户的消息导致流程错乱
  • 建议配置超时时间,避免机器人无限等待造成资源浪费
  • 提前捕获私信发送失败的异常,处理用户屏蔽机器人私信的场景

完整修改后的代码

import discord
from discord.ext import commands

# 你原有client初始化逻辑保持不变即可

@client.command()
async def order(ctx):
    # 公域回复提示
    await ctx.reply("Check your dm's")
    
    # 提前创建私信频道,捕获私信权限异常
    try:
        dm_channel = await ctx.author.create_dm()
    except discord.Forbidden:
        await ctx.reply("无法向你发送私信,请先调整隐私设置允许服务器成员发私信后重试")
        return
    
    # 发送第一条私信
    await dm_channel.send("hi")

    # 定义消息校验规则
    def check_valid_msg(msg):
        return msg.author.id == ctx.author.id and msg.channel.id == dm_channel.id

    try:
        # 等待用户回复,timeout为等待超时时间,单位秒,可自行调整
        user_reply = await client.wait_for("message", check=check_valid_msg, timeout=120)
    except TimeoutError:
        await dm_channel.send("等待回复超时,本次订单流程已终止,需要的话请重新触发/order命令")
        return

    # 到这一步已经成功拿到用户的私信回复,后续写自己的业务逻辑即可
    # 示例:打印用户回复内容、发送后续引导消息
    print(f"收到用户{ctx.author.id}的订单回复:{user_reply.content}")
    await dm_channel.send(f"已收到你发送的内容:{user_reply.content},接下来请完成下一步操作")

扩展说明

  • 如果需要多轮对话等待用户多次回复,重复调用wait_for、复用校验规则即可
  • 如果要等待的不是普通文本消息,是按钮点击、下拉选择等交互,把wait_for的第一个事件名换成对应的交互事件名、调整校验规则即可
  • 超时时间根据业务需求设置即可,比如订单类场景可以设2-5分钟,快速交互场景设30秒即可

内容的提问来源于stack exchange,提问作者Stack.py

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:39:20