Discord机器人新服务器私信通知功能报错求助
Discord机器人新服务器私信通知报错修复方案
问题说明
此前正常运行的新服务器私信通知代码现出现报错,原代码如下:
#新服务器通知 @client.event async def on_guild_join( guild ): me = client.get_user(404915501727219723) emb = discord.Embed( title = f'我加入了新服务器' ) for guild in client.guilds: category = guild.categories[0] try: channel = category.text_channels[0] except: channel = category.voice_channels[0] link = await channel.create_invite() emb.add_field( name = guild.name, value = f"成员数: {len(guild.members)} 邀请链接: {link}" ) await me.send( embed = emb )
报错类型为 IndexError: list index out of range(列表索引越界)
错误根源
- 函数参数
guild被遍历client.guilds的循环变量覆盖,逻辑混乱,本该处理新加入的服务器,却遍历了所有服务器 - 直接读取
guild.categories[0],若服务器无任何分类(频道直接在根目录),会触发索引越界 - 即便有分类,也可能存在分类下无文本/语音频道的情况,现有异常处理覆盖不全
- 未检查机器人是否有创建邀请的权限,可能因权限不足导致隐性报错
修复后代码
#新服务器通知 @client.event async def on_guild_join(new_guild): # 获取要通知的目标用户 target_user = client.get_user(404915501727219723) if not target_user: print("无法找到目标通知用户") return emb = discord.Embed(title='我加入了新服务器') invite_link = None # 优先遍历所有文本频道,找有创建邀请权限的频道 for channel in new_guild.text_channels: if channel.permissions_for(new_guild.me).create_instant_invite: try: # 创建24小时过期的邀请链接,可根据需求调整max_age invite_link = await channel.create_invite(max_age=86400) break except discord.Forbidden: continue # 文本频道找不到的话,遍历语音频道尝试 if not invite_link: for channel in new_guild.voice_channels: if channel.permissions_for(new_guild.me).create_instant_invite: try: invite_link = await channel.create_invite(max_age=86400) break except discord.Forbidden: continue # 构造消息字段内容 member_count = len(new_guild.members) if invite_link: field_content = f"成员数: {member_count}\n邀请链接: {invite_link}" else: field_content = f"成员数: {member_count}\n无法创建邀请链接(权限不足或无可用频道)" emb.add_field(name=new_guild.name, value=field_content) await target_user.send(embed=emb)
修复要点
- 将函数参数重命名为
new_guild,避免变量覆盖,明确处理刚加入的服务器 - 不再依赖服务器分类,直接遍历所有频道,同时检查机器人的创建邀请权限
- 分优先级尝试文本/语音频道,添加异常捕获避免权限问题导致崩溃
- 设置邀请链接过期时间,提升安全性
- 增加目标用户不存在的判断,避免后续发送消息报错
内容的提问来源于stack exchange,提问作者XakeR
相关产品推荐
相关产品推荐

