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

如何使用discord.py实现Discord机器人编辑历史消息添加文本

解决方案:discord.py 实现策略游戏预约机器人的消息编辑功能

核心逻辑

要完成需求,关键是先获取原始消息的完整内容,定位到目标国家的行进行修改,再将修改后的内容重新同步到原消息,而不是直接用message.edit()盲目替换内容。

具体实现步骤

1. 获取原始消息对象

既然你已经拿到了原始消息ID,先通过ID获取对应的消息实例:

# 先获取频道对象(可通过bot.get_channel(频道ID)提前获取)
channel = bot.get_channel(CHANNEL_ID)
# 根据ID拉取原始消息
original_message = await channel.fetch_message(ORIGINAL_MESSAGE_ID)

2. 解析并修改消息内容

将原始消息按行拆分,遍历找到目标国家的行,追加用户标识:

# 把消息内容拆成每行的列表
content_lines = original_message.content.split('\n')
# 从用户指令中提取目标国家(比如!reserve 德意志,就提取"德意志")
target_country = "用户指定的国家名称"
# 遍历修改行内容
for idx, line in enumerate(content_lines):
    # 这里可以根据你的列表格式调整匹配规则,比如精确匹配行内容、或者行以目标国家开头
    if line.strip() == target_country:
        # 用ctx.author.mention生成@用户的格式
        content_lines[idx] = f"{line} - {ctx.author.mention}"
        break
# 把修改后的行重新拼接成字符串
new_content = '\n'.join(content_lines)

3. 执行消息编辑

最后用修改后的内容更新原始消息:

await original_message.edit(content=new_content)

实用优化点

  • 避免重复预约:可以在遍历的时候判断当前行是否已经包含用户的mention,如果有就返回提示“你已经预约过这个国家了”。
  • 匹配规则容错:如果你的国家列表带前缀(比如- 法兰西),可以用line.endswith(target_country)或者正则匹配,避免误改类似名称的国家。
  • 状态持久化:如果需要重启机器人后保留预约记录,修改完消息后可以把新内容写回host-template.txt文件。

完整指令示例

把上述逻辑整合到!reserve指令中:

@bot.command()
async def reserve(ctx, *, country):
    try:
        # 替换成你的频道ID和原始消息ID
        channel = bot.get_channel(1234567890)
        original_msg = await channel.fetch_message(9876543210)
        
        content_lines = original_msg.content.split('\n')
        updated = False
        
        for idx, line in enumerate(content_lines):
            # 假设原始行格式是“国家名称”,如果有前缀请调整判断逻辑
            if country in line and ctx.author.mention not in line:
                content_lines[idx] = f"{line} - {ctx.author.mention}"
                updated = True
                break
        
        if not updated:
            await ctx.send("这个国家不存在,或者你已经预约过了!")
            return
        
        await original_msg.edit(content='\n'.join(content_lines))
        await ctx.send(f"成功预约{country}!")
    except Exception as e:
        await ctx.send(f"预约失败:{str(e)}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:30:01