Discord.py:我如何从服务器获取随机消息?

时间:2021-05-04 03:08:16

标签: python discord discord.py

如果我想为我的机器人实现一个命令(使用 Discord.py),它会从服务器检索随机消息(然后该命令会提示用户猜测原始消息作者是谁),我该怎么做关于这样做?我可以获得一个随机频道,但我不确定一旦我知道我想从哪个频道拉取信息,我将如何从该频道获取随机消息。我必须从该频道的整个历史记录中检索每条消息的列表,每次使用该命令时都会非常耗时。我想我可以将来自整个服务器的所有消息 ID 存储在代码的列表中,并且我可以每 15 或 30 分钟左右更新一个新线程上的列表,但我觉得这仍然是一个低效的选择,并且我不知道在每个频道检索潜在的数十万条消息需要多长时间。这里有没有更好的选择,或者就这样?

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点:

第一种是使用某种数据库,您可以在其中存储发送的每条消息。第二个是通过 Guild.text_channelsTextChannel.history()

获取每个通道中的每条消息

我假设您不想使用数据库。

基本上,您需要遍历公会的所有 text_channel,然后为每个频道调用 .history(limit=None) 。 (请注意,这可能需要非常、非常、非常长的时间来完成。)然后您可以在结果消息列表上调用 random.choice(),然后发送该消息。

这是一个例子:

all_messages = []

for channel in ctx.guild.text_channels:
  async for message in channel.history(limit=None):
    all_messages.append(message)

message_to_send = random.choice(all_messages)
await ctx.send(message_to_send.system_content)  # see note below

注意:我总是使用 message.system_content 而不是 message.content,因为 system_content 也适用于加入消息。不过,两者都很好。

这行得通,但需要很长的时间才能实现。我建议将限制保持在 500 以下,或者甚至可以使用 around kwargs of history()。你可以这样做:

  1. 选择从现在到创建此服务器之间的随机日期
  2. 使用 around=the_random_date 调用 .history()
  3. 将限制保持在 100 个

事实上,如果我要发出这样的命令,这是我唯一做的方式。