如何让 Discord 机器人通过命令编辑自己之前发送的消息

陌芳姑娘_6194

陌芳姑娘_6194

2026-06-29

344人浏览

原创

如何让 Discord 机器人通过命令编辑自己之前发送的消息

本文详解如何在 discord.py 中实现“动态定位并编辑机器人历史消息”的核心需求,通过持久化存储消息 id(如文本文件或数据库),解决因消息重发导致 id 变更带来的编辑失效问题。

本文详解如何在 discord.py 中实现“动态定位并编辑机器人历史消息”的核心需求,通过持久化存储消息 id(如文本文件或数据库),解决因消息重发导致 id 变更带来的编辑失效问题。

在构建交互式 Discord 游戏管理机器人(例如用于《Hearts of Iron》或《Civilization》类大战略游戏的国家预约系统)时,一个常见且关键的需求是:让机器人能持续更新同一则公告消息——比如初始发送一条 Reservations: ? USA,后续用户执行 !reserve Japan 后,自动将内容追加为 Reservations: ? USA ? Japan @User。难点在于:每次新局开始时,原消息会被删除并重发,ID 完全不可预测,无法硬编码。

✅ 正确方案:持久化存储 + 动态读取消息 ID

fetch_message() 本身没有问题,问题在于缺乏对目标消息 ID 的可靠追踪机制。解决方案不是避免使用它,而是为其提供稳定的 ID 来源。最轻量、易上手的方式是使用本地文本文件暂存最新公告消息的 ID:

Giga Coding Agent
Giga Coding Agent

一款AI工具,主要用于通过后台进程运行 Codex CLI、Claude Code、OpenCode 或 Pi Coding Agent,实现程序化控制,适合需要提升相关任务效率的用户。

下载
import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True  # 确保能读取消息内容(如需解析参数)
client = commands.Bot(command_prefix='!', intents=intents)

# 假设公告频道 ID 已知(请替换为实际 ID)
ANNOUNCE_CHANNEL_ID = 123456789012345678

@client.command()
async def host(ctx):
    """发送初始预约列表,并保存其消息 ID 到文件"""
    channel = client.get_channel(ANNOUNCE_CHANNEL_ID)
    if not channel:
        await ctx.send("❌ 错误:未找到公告频道,请检查 CHANNEL_ID 配置。")
        return
    msg = await channel.send("Reservations: ? USA")

    # 将消息 ID 写入 message_id.txt(覆盖写入,确保只存最新一条)
    with open("message_id.txt", "w") as f:
        f.write(str(msg.id))
    await ctx.send(f"✅ 预约列表已创建!ID 已保存:`{msg.id}`")

@client.command()
async def reserve(ctx, *, nation: str = None):
    """用户预约国家:读取 ID → 获取消息 → 编辑内容"""
    if not nation:
        await ctx.send("⚠️ 用法:`!reserve `,例如 `!reserve Japan`")
        return

    # 1. 从文件读取最新消息 ID
    try:
        with open("message_id.txt", "r") as f:
            msg_id = int(f.read().strip())
    except (FileNotFoundError, ValueError, OSError):
        await ctx.send("❌ 错误:未找到有效的预约列表消息。请先由管理员运行 `!host` 创建列表。")
        return

    # 2. 获取目标频道和消息
    channel = client.get_channel(ANNOUNCE_CHANNEL_ID)
    if not channel:
        await ctx.send("❌ 错误:公告频道不可访问。")
        return

    try:
        msg = await channel.fetch_message(msg_id)
    except discord.NotFound:
        await ctx.send("❌ 错误:目标消息不存在(可能已被删除)。请重新运行 `!host`。")
        return
    except discord.Forbidden:
        await ctx.send("❌ 错误:机器人缺少 `Read Message History` 权限。")
        return

    # 3. 安全编辑内容(保留原始结构,追加新条目)
    new_entry = f" ? {nation.strip()} @{ctx.author.display_name}"
    updated_content = msg.content + new_entry
    await msg.edit(content=updated_content)
    await ctx.send(f"✅ `{nation.strip()}` 已由 {ctx.author.mention} 预约成功!")

⚠️ 重要注意事项

  • 权限要求:机器人必须在目标频道拥有 Send Messages、Read Message History 和 Manage Messages(编辑他人消息非必需,但编辑自身消息需 View Channel + Read Message History)权限。
  • 文件可靠性局限:文本文件适用于单实例、开发/小规模场景;生产环境强烈建议升级为 SQLite 或 PostgreSQL 数据库存储 channel_id + message_id + game_session_id,支持多频道、多游戏并发。
  • 竞态风险:若多人高频调用 !reserve,可能因异步 IO 导致读写冲突。进阶方案可引入 asyncio.Lock 或改用原子性更强的数据库操作。
  • 内容维护建议:实际项目中,推荐用 Markdown 表格或有序列表格式组织预约信息,并配合 discord.ui.View 添加按钮式交互,而非纯文本追加,提升可读性与可维护性。

通过将“消息定位”与“消息编辑”解耦,并引入轻量持久化层,你就能稳定实现动态公告系统的闭环逻辑——无论消息重发多少次,ID 总能被准确捕获,真正让机器人具备“记忆”与“响应”能力。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1631

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4004

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1629

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23157

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2847

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2867

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1123

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
midjourney AI绘画手册
midjourney AI绘画手册

共0课时 | 0人学习