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

如何让Discord机器人发送格式提醒私信时附带用户原始消息

Discord机器人私信附带用户原始发帖实现方案

核心前置要求:必须在执行消息删除操作前缓存原始消息内容,删除完成后message实例的内容属性可能无法正常读取,导致拿不到用户原发帖内容。

两种实现方式按需选择即可:

方案1:原始消息直接拼接在格式提醒内容中

适合用户发帖长度普遍较短的场景,用户只需要看一条私信就能收到全部信息,阅读成本低。
修改后的代码如下:

if valid_check:
    if re.match(self.regex, message.content) or re.match(self.regex2, message.content) and not gutted:
        pass
    else:
        if not message.author.bot:
            try:
                # 先缓存原始消息内容,再执行删除
                original_content = message.content
                await message.delete()
                content = "Please use the following Format when posting:\n" \
                          "[Location] [H] [W]\n" \
                          "\nExample:\n" \
                          "[USA-CA] Narnia [H] Faun Hoof" \
                          "[W] Lions Tears.\n" \
                          "\n---\n" \
                          "The content you posted is as follows:\n" \
                          f"> {original_content}" # 用引用块包裹原内容,和提醒规则做区分
                await message.author.send(content=content)
            except:
                pass

如果用户发帖带图片、附件,可以在拼接内容时额外遍历message.attachments把附件链接追加到original_content后面,避免附件信息丢失。
注意如果拼接后的总内容超过Discord单条消息2000字符上限,会导致私信发送失败,这种场景请用第二种方案。

方案2:格式提醒和原始消息分两条私信发送

适合用户发帖长度不确定、可能存在长文的场景,两条消息分开推送不容易触发字符上限。
修改后的代码如下:

if valid_check:
    if re.match(self.regex, message.content) or re.match(self.regex2, message.content) and not gutted:
        pass
    else:
        if not message.author.bot:
            try:
                # 提前缓存原始内容
                original_content = message.content
                await message.delete()
                # 第一条发格式提醒
                remind_content = "Please use the following Format when posting:\n" \
                          "[Location] [H] [W]\n" \
                          "\nExample:\n" \
                          "[USA-CA] Narnia [H] Faun Hoof" \
                          "[W] Lions Tears.\n"
                await message.author.send(content=remind_content)
                # 第二条单独发用户原始发帖
                await message.author.send(content="The content you posted is as follows:\n" + original_content)
            except:
                pass

额外优化点

  • 附件补全逻辑:如果需要展示原消息带的图片、文件,在缓存original_content之后追加附件链接即可:
    if message.attachments:
        original_content += "\n[Attachments]\n"
        for att in message.attachments:
            original_content += f"{att.url}\n"
    
  • 正则逻辑修复:现有判断存在运算符优先级问题,and优先级高于or,实际执行逻辑会变成「匹配regex1 或者 (匹配regex2 且 不是gutted)」。如果预期逻辑是「两个正则匹配任意一个,且满足not gutted」,需要给or的两个条件加括号:(re.match(self.regex, message.content) or re.match(self.regex2, message.content)) and not gutted,避免误删合规帖子。

内容的提问来源于stack exchange,提问作者twilight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:24:15