Discord.py 服务器频道复制粘贴paste命令报50035错误问题
代码问题逐点拆解
- 核心触发报错的存储逻辑错误:原
copy命令将整个频道对象列表直接通过str(channels)转成字符串后存入备份数据,没有提取单个频道的名称等有效属性;执行paste时又直接将整个备份频道列表传入create_text_channel的名称参数,导致Discord无法将整段列表文本解析为合法频道名,触发400错误,与报错堆栈中Could not interpret "[<TextChannel ...>]" as string的提示完全对应。 - 批量创建逻辑缺失:原
paste命令没有对备份的频道列表做循环遍历,即使存储逻辑正确,也只能尝试创建1个频道,无法完成批量迁移的目标。 - 冗余判断逻辑:原
copy命令连续两次判断用户数据存在性,本质上每次执行都会强制重置该用户的备份数据,属于无意义的重复代码,容易引发存储覆盖的问题。
修复方案与可直接运行的代码
逻辑调整说明
- 存储阶段:遍历每个文本频道,提取频道名称、NSFW标记、频道主题等可跨服务器复用的属性,组织为结构化列表存入备份数据,不再存储Discord频道对象的序列化文本。
- 还原阶段:取出备份的结构化频道列表,通过循环逐个调用
create_text_channel方法创建频道,补充数据存在性校验避免触发键值不存在的异常。
@commands.command() @commands.has_guild_permissions(administrator=True) async def copy(self, ctx): # 直接初始化用户备份数据,替代原两次冗余判断 Server.server_data[str(ctx.author.id)] = Server.create_new_data() backup_channel_list = [] for channel in ctx.guild.text_channels: # 提取跨服务器可用的频道属性 channel_item = { "name": channel.name, "nsfw": channel.nsfw, "topic": channel.topic } backup_channel_list.append(channel_item) Server.server_data[str(ctx.author.id)]["Channels"] = backup_channel_list embed = discord.Embed(color=discord.Color.blue(), description=f"{ctx.guild.name} 的频道备份已保存") await ctx.send(embed=embed) @commands.command() @commands.has_guild_permissions(administrator=True) async def paste(self, ctx): # 校验备份数据是否存在,避免KeyError user_backup = Server.server_data.get(str(ctx.author.id), {}).get("Channels", []) if not user_backup: await ctx.send("未查询到已保存的频道备份,请先在源服务器执行 s!copy") return # 循环遍历逐个创建频道 for channel_info in user_backup: await ctx.guild.create_text_channel( name=channel_info["name"], nsfw=channel_info["nsfw"], topic=channel_info["topic"] ) embed = discord.Embed(color=discord.Color.blue(), description="所有备份频道已在当前服务器创建完成") await ctx.send(embed=embed)
扩展提示:如果需要同步迁移频道的分类归属、权限覆写规则,可在存储阶段额外提取分类名称、权限覆写的键值对内容,在还原阶段先创建对应分类、匹配权限规则,即可完成更完整的频道结构迁移。
内容的提问来源于stack exchange,提问作者AdoptedKitty
相关产品推荐
相关产品推荐

