Discord.py如何列出机器人所在所有服务器?附代码报错排查
Discord机器人服务器文件夹自动同步修复方案
报错根因
- 代码执行顺序错误:
bot.run()是机器人启动的阻塞方法,你在启动前遍历bot.guilds时,机器人还未完成登录和服务器数据拉取,for循环不会执行,list2从未被赋值,因此触发未定义报错。 - 变量定义逻辑错误:即使循环能执行,你每次都将
list2覆盖为单个服务器名的字符串,而非存储所有服务器名的列表,后续转集合操作会把字符串拆分为单个字符,完全不符合需求。 - 额外语法错误:路径格式化时
format方法位置写反、直接用列表整体作为路径参数、删除逻辑的判断条件完全无关,都会导致后续功能报错。
修复后可运行代码
import discord from discord.ext import commands import os import shutil PREFIX = "$" # 开启必要的意图权限,需要同时在Discord开发者后台开启对应开关 intents = discord.Intents.default() intents.guilds = True bot = commands.Bot(command_prefix=PREFIX, description="Hi", intents=intents) # 所有上线后执行的逻辑要放在on_ready事件中 @bot.event async def on_ready(): folder_path = 'C:/Users/User/Desktop/BOT_FOLDER' # 读取本地已有的文件夹列表 local_folders = os.listdir(folder_path) # 收集机器人加入的所有服务器名称 guild_names = [] for guild in bot.guilds: print(f"已加入服务器:{guild.name}") guild_names.append(guild.name) set_local = set(local_folders) set_guild = set(guild_names) # 本地有但机器人已退出的服务器文件夹 missing_guilds = list(sorted(set_local - set_guild)) # 机器人新加入、本地还没创建文件夹的服务器 new_guilds = list(sorted(set_guild - set_local)) print('需要删除的冗余文件夹:', missing_guilds) print('需要新增的服务器文件夹:', new_guilds) # 为新加入的服务器创建文件夹 for guild_name in new_guilds: newpath = os.path.join(folder_path, guild_name) if not os.path.exists(newpath): os.makedirs(newpath) # 删除冗余的服务器文件夹 for guild_name in missing_guilds: del_path = os.path.join(folder_path, guild_name) if os.path.exists(del_path): # 非空文件夹用shutil.rmtree删除,如果只需要删文件可替换为os.remove shutil.rmtree(del_path) print("文件夹同步完成") bot.run('BOT_TOKEN_HERE')
注意事项
- 必须在Discord开发者后台的机器人设置页,开启
SERVERS MEMBERS INTENT权限,否则机器人无法拉取服务器列表。 - 如果不需要自动删除冗余文件夹,可以删掉对应逻辑块。
内容的提问来源于stack exchange,提问作者asaf meizner
相关产品推荐
相关产品推荐

