discord.py 1.7.3创建Discord频道报TypeError错误问题
报错原因
- 核心错误是对
discord.Guild的引用方式错误:代码里guild = discord.Guild拿到的是discord.py内置的Guild类本身,不是用户发送消息时所在的真实服务器实例。调用类的实例方法create_text_channel()时,第一个隐式参数self本应自动传入实例对象,直接用类调用方法时,你传入的第一个值(拆分得到的频道名)会被识别为self参数,真正需要的name参数没有拿到,因此抛出缺少必填参数的异常。 - 原代码未做边界判断:如果用户只输入
$new不跟频道名,msg.split(' ',1)[1]会直接触发索引越界错误。 - 原代码未做权限校验:如果机器人没有服务器的「管理频道」权限,就算参数正确也会调用失败。
修复方法
将获取服务器实例的逻辑替换为从消息对象中取当前所属服务器,同时补充参数校验、权限判断逻辑,修正后的可运行代码如下:
import discord import os client = discord.Client() @client.event async def on_message(message): if message.author == client.user: return msg = message.content if msg.startswith('$new'): cmd_split = msg.split(' ', 1) # 校验是否传入频道名 if len(cmd_split) < 2: await message.channel.send("指令格式错误,请使用`$new 频道名`的格式创建频道") return channel_name = cmd_split[1].strip() # 获取当前消息所属的真实服务器实例 current_guild = message.guild # 校验机器人权限 if not current_guild.me.guild_permissions.manage_channels: await message.channel.send("权限不足,我需要「管理频道」权限才能创建新频道") return # 执行创建频道操作 await current_guild.create_text_channel(name=channel_name) await message.channel.send(f"文本频道`{channel_name}`创建成功")
额外注意:邀请机器人加入服务器时,需要在邀请链接的权限选项中勾选「管理频道」权限,否则接口会返回403无权限错误。
内容的提问来源于stack exchange,提问作者AJay
相关产品推荐
相关产品推荐

