Discord.py中invites_from未返回预期列表的问题求助
解决Discord.py邀请链接统计的生成器与遍历错误问题
嘿,我来帮你搞定这个问题!你遇到的两个问题其实都是discord.py异步API和对象使用的常见坑,我一步步给你拆解:
问题出在哪?
- 直接输出生成器:
invites_from()返回的是异步生成器对象,不是现成的列表,直接发给频道当然会显示那个奇怪的<generator object...>字符串 - 传错参数类型:你把服务器ID字符串传给了
invites_from(),但这个方法需要的是Guild(旧版叫Server)对象,不是ID,所以才会报AttributeError: 'str' object has no attribute 'id' - 冗余实例混淆:你同时初始化了
discord.Client()和commands.Bot(),其实Bot是Client的子类,完全用Bot就能搞定所有操作,没必要搞两个实例给自己添乱
修正后的完整代码(兼容旧版discord.py)
import discord from discord.ext import commands # 只保留Bot实例,去掉多余的Client client = commands.Bot(command_prefix="!") @client.event async def on_ready(): print("Bot Connected!") @client.command() async def inv(ctx): # 兼容新旧版本的服务器对象获取 guild = ctx.guild if hasattr(ctx, 'guild') else ctx.server invites_list = [] total_uses = 0 # 必须用async for遍历异步生成器 async for invite in client.invites_from(guild): # 收集每个邀请的链接和使用次数 invites_list.append(f"🔗 {invite.url} | 使用次数:{invite.uses}") total_uses += invite.uses # 构建友好的回复消息 if invites_list: reply = f"📋 当前服务器邀请链接统计:\n{'\n'.join(invites_list)}\n\n🔢 所有邀请总使用次数:{total_uses}" else: reply = "⚠️ 服务器目前没有任何有效的邀请链接哦" await ctx.send(reply) client.run("你的Bot Token")
关键修改说明
- 移除冗余实例:只用
commands.Bot就能处理所有事件和命令,避免实例冲突 - 使用命令装饰器:用
@client.command()替代on_message的手动判断,更简洁规范,还能自动处理上下文 - 传递正确对象:用
ctx.guild(或旧版ctx.server)直接拿到服务器对象,而不是提取ID字符串 - 异步遍历生成器:discord.py的很多API都是异步的,必须用
async for来遍历invites_from()返回的生成器 - 统计总使用次数:遍历过程中累加每个邀请的
uses属性,最后统一输出总数 - 友好提示:没有邀请链接时也给用户明确的反馈信息
新版discord.py(v1.0+)兼容写法
如果你用的是新版discord.py,invites_from()已经被废弃,推荐用guild.invites()直接获取邀请列表:
# 替换原代码中的遍历部分 invites = await guild.invites() for invite in invites: invites_list.append(f"🔗 {invite.url} | 使用次数:{invite.uses}") total_uses += invite.uses
额外提醒
确保你的Bot账号拥有**管理服务器(Manage Server)**权限,否则无法获取服务器的邀请链接哦!
内容的提问来源于stack exchange,提问作者ScottKane
相关产品推荐
相关产品推荐

