【问题标题】:Members in A Guild公会成员
【发布时间】:2021-02-18 15:17:08
【问题描述】:

我有这段代码,它应该在机器人所在的服务器中发送成员列表,只有公会 ID。这是我的代码:

@client.command(name='members')
async def _members(ctx, guild_id: int):
  guild = client.get_guild(guild_id)
  for m in guild.fetch_members(limit=None):
    await ctx.send(f"{m}")
    await ctx.send("Done!")

但它似乎不起作用,我不知道为什么。有时我真的很愚蠢。 这是我得到的错误:

172.18.0.1 - - [05/Nov/2020 20:59:40] "HEAD / HTTP/1.1" 200 -
Ignoring exception in command members:
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "main.py", line 154, in _members
    for m in guild.fetch_members(limit=None):
TypeError: 'MemberIterator' object is not iterable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: 'MemberIterator' object is not iterable

另外,有没有办法从列表中删除所有机器人?

【问题讨论】:

    标签: python discord discord.py discord.py-rewrite


    【解决方案1】:

    guild.fetch_members 返回一个 asyncIterator,这意味着您应该在 for 之前添加 async 关键字。但是在您的情况下,如果您将使用循环,则会导致垃圾邮件,因此我们将展平列表并使命令正常工作。万岁! 像这样:

    @client.command(name='members')
    async def _members(ctx, guild_id: int):
      guild = client.get_guild(guild_id)
      x = await guild.fetch_members(limit=None).flatten()
      await ctx.send(x)
      await ctx.send("DONE")
      
    

    【讨论】:

    • 谢谢,但是如果字符限制超过2000,有什么办法可以将它分成多条消息?
    【解决方案2】:

    根据 API 参考:

    检索允许接收公会成员的 AsyncIterator。

    它还说:

    注意:此方法是 API 调用。对于一般用法,请考虑使用members

    但是如果你想使用fetch_members而不是guild.members,你可以做两件事来防止这个错误。

    • 您可以使用async for member in guild.fetch_members(limit=None):
    • for member in await guild.fetch_members(limit=150).flatten():

    但我建议你按照 API References 所说的使用 guild.members

    另外,如果你在for循环中发送消息,bot会发送大量消息,你应该使用str.join()方法在一条消息中发送所有成员。这就是我的意思:

    @client.command(name='members')
    async def _members(ctx, guild_id: int):
      guild = client.get_guild(guild_id)
      await ctx.send(', '.join(guild.members))
    

    或者,如果您仍想发送单独的消息,您可以使用这个:

    @client.command(name='members')
    async def _members(ctx, guild_id: int):
      guild = client.get_guild(guild_id)
      for m in guild.members():
        await ctx.send(f'{m}')
        await ctx.send('DONE!')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 2021-05-01
      • 2020-09-27
      相关资源
      最近更新 更多