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
相关产品推荐
相关产品推荐

