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

Discord机器人能否将消息从一个频道复制到另一频道且不删除原消息?

功能实现说明

该功能完全可以实现,核心逻辑为读取源频道的历史消息后在目标频道重新发送,全程不会对源频道原有消息执行修改、删除操作,不会影响源频道的消息数据。

前置准备

你需要先完成两项配置,确保机器人有权限完成相关操作:

  • 前往Discord开发者平台的机器人管理页,开启Message Content Intent(消息内容意图),否则机器人无法读取频道内的消息内容
  • 给机器人授予源频道的「查看消息/查看消息历史」权限,以及目标频道的「发送消息、上传文件」权限
核心实现代码示例
import discord
from discord.ext import commands

# 初始化机器人并声明所需权限
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)

# 定义触发命令,入参为源频道、目标频道,支持直接@频道或者传入频道ID调用
@bot.command(name="copy_channel_msg")
async def copy_channel_messages(ctx, source_channel: discord.TextChannel, target_channel: discord.TextChannel):
    # 权限校验:仅服务器管理员可以触发该命令,可根据需求调整规则
    if not ctx.author.guild_permissions.administrator:
        await ctx.send("你没有权限使用该命令")
        return

    await ctx.send("消息复制任务已启动,正在处理中...")
    # 拉取源频道消息,limit为拉取数量,设置为None可拉取频道全部历史消息
    # 反转列表保证发送顺序和源频道消息顺序一致(从旧到新)
    message_list = [msg async for msg in source_channel.history(limit=100)]
    message_list.reverse()

    for msg in message_list:
        # 原样保留原消息的文本内容、附件、嵌入卡片
        send_content = msg.content
        send_files = [await attachment.to_file() for attachment in msg.attachments]
        send_embeds = msg.embeds
        # 若需要标注原消息发送者,可替换上面的send_content为下方代码:
        # send_content = f"**原发送者:{msg.author.display_name}**\n{msg.content}"
        await target_channel.send(content=send_content, files=send_files, embeds=send_embeds)
    
    await ctx.send(f"任务完成,共成功复制{len(message_list)}条消息")

bot.run("替换为你的机器人Token")
注意事项
  • 短时间内复制大量消息会触发Discord的速率限制,discord.py已内置自动等待限速逻辑,无需额外开发处理
  • 你可以根据需求调整命令前缀、消息拉取数量、权限校验规则、是否展示原发送者信息等逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:21:02