Py-Cord Discord机器人创建工单频道时触发AttributeError错误
错误原因与解决方案
问题分析
报错AttributeError: 'int' object has no attribute 'id'来自两处核心错误:
- 权限覆盖的角色类型错误:
supportRole = config.support_role_id直接使用了整数ID,但PermissionOverwrite的键必须是discord.Role或discord.Member对象,而非纯ID数值。 - 分类参数类型不匹配:
create_text_channel的category参数传入了字符串"tickets",但该参数要求传入discord.CategoryChannel对象,不是分类名称字符串。
修正后的代码
class MyView(discord.ui.View): @discord.ui.button(label="Create Ticket", style=discord.ButtonStyle.primary, emoji="🎫") async def button_callback(self, button, interaction : discord.Interaction): # 把角色ID转换为Role对象 support_role = interaction.guild.get_role(config.support_role_id) if not support_role: await interaction.response.send_message("支持角色不存在!", ephemeral=True) return # 获取tickets分类的对象 ticket_category = discord.utils.get(interaction.guild.categories, name="tickets") if not ticket_category: await interaction.response.send_message("tickets分类不存在!", ephemeral=True) return # 构建权限覆盖规则(确保键为对象而非ID) overwrite = { interaction.guild.default_role: discord.PermissionOverwrite(view_channel=False), support_role: discord.PermissionOverwrite(view_channel=True, read_messages=True, send_messages=True, add_reactions=True), interaction.user: discord.PermissionOverwrite(view_channel=True, read_messages=True, send_messages=True) # 必须给创建者添加权限,否则无法访问 } ticket_creator = interaction.user.display_name # 使用正确的分类对象创建频道 await interaction.guild.create_text_channel( f"{ticket_creator} ticket", category=ticket_category, overwrites=overwrite ) await interaction.response.send_message("工单频道已创建!", ephemeral=True)
额外补充
- 新增了角色和分类的存在性检查,避免因资源缺失导致后续异常。
- 添加了工单创建者的频道权限,否则创建者自身无法访问新建的工单频道。
- 使用
ephemeral=True发送提示,只有点击按钮的用户能看到,避免刷屏。
内容的提问来源于stack exchange,提问作者Knife worm
相关产品推荐
相关产品推荐

