You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(列表索引越界)

错误根源

  1. 函数参数guild被遍历client.guilds的循环变量覆盖,逻辑混乱,本该处理新加入的服务器,却遍历了所有服务器
  2. 直接读取guild.categories[0],若服务器无任何分类(频道直接在根目录),会触发索引越界
  3. 即便有分类,也可能存在分类下无文本/语音频道的情况,现有异常处理覆盖不全
  4. 未检查机器人是否有创建邀请的权限,可能因权限不足导致隐性报错

修复后代码

#新服务器通知
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:50:23