【问题标题】:How can I get the number of messages sent by a user in a discord server without discord.py?如何在没有 discord.py 的情况下获取用户在不和谐服务器中发送的消息数量?
【发布时间】:2020-12-14 18:02:10
【问题描述】:

手动使用 discord 的搜索功能,您可以输入 from:user#3456 之类的内容,它会显示他们在服务器上发送了多少条消息(至少,您可以访问的消息)。

我被告知无法通过 discord.py 获取这些信息,但真的没有办法获取这些数据吗?我必须求助于网络抓取工具吗?

为了清楚起见,我已经看过history()。我正在寻找的是一种访问 Discord 已有的搜索功能的方法。

【问题讨论】:

    标签: python http discord discord.py


    【解决方案1】:

    我通过在 Discord 应用程序中搜索 from:username 查询,使用 Chrome DevTools 查看 http 请求,最后使用 python 模块 requests 重新创建请求,以一种 hacky 方式解决了这个问题。

    在 Discord 中,您可以在 Windows 或 Linux 上使用 ctrl+shift+i 打开 DevTools,在 Mac 上使用 command+option+i

    在 DevTools 中,导航到 Network 选项卡。

    我建议填写搜索查询(但不要按 Enter),然后打开 devtools,然后在搜索中按 Enter。否则会在你输入的时候弹出很多http请求。

    然后,您会找到名称类似于“search?author_id=1234567890”的请求。如果您单击该请求,您可以看到重新创建它所需的详细信息。

    您需要使用的http请求的关键部分是Request Headers部分和General部分下的Request URL,都在您第一次点击请求时弹出的Headers选项卡中,和Response 选项卡,看看你的回复会是什么样子。

    请求标头的accept-encoding 属性包括br,但这似乎使结果混乱。将其保留为 gzip, deflate 对我有用。

    使用requests python 模块应该很容易设置。只要br 不在accepted-encoding 中,你应该可以使用requestsjson() 方法,并且对于查找用户发送的总消息的特定问题(您必须插入其id进入请求 URL),它可以通过 my_request_variable.json()['total_results'] 轻松访问。

    需要注意的主要是authorization 请求标头。这是用户独有的(您,除非您从其他人的帐户中执行所有这些操作)并且很遗憾,您不能替换不和谐机器人的令牌。

    【讨论】:

      【解决方案2】:

      这实际上可以使用discord.TextChannel.history。这是一个例子:

      userMessages = []
      
      userID = 1234567890 # Change this to the ID of the user you are looking messages for
      channelID = 1234567890 # Change this to the channel ID of the messages you want to check for
      
      channel = client.get_channel(channelID)
      user = discord.utils.find(lambda m: m.id== userID, channel.guild.members)
      
      async for message in channel.history():
          if message.author == user:
              userMessages.append(message.content)
      
      print(len(userMessages)) # Outputs total user messages
      

      确保将 1234567890 替换为相应的 ID。

      我添加了一个数组,它还显示所有用户消息,如果您愿意,可以删除它并让它增加一个计数器。

      【讨论】:

      • 我试过了,但它只打印出 0,因为 print 语句在异步循环完成之前执行
      • 您是否将 ID 1234567890 更改为正确的 ID?
      • 我做到了,实际上使用附加到列表并获取列表长度的确切方法确实得到了非零答案,我希望因为它比增加计数器慢,这就是我原来做的。但是,打印的数字仍然太低。就我而言,不和谐搜索显示 2,353 条消息,此代码显示 47
      • 47 大概是用户发送的消息量,2353 是频道中的消息总数???
      • 不,就像我说的,用户在频道中发送了超过 2353 条消息。 from:user in:thischannel, search 说 2353
      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 2020-11-08
      • 2018-09-24
      • 2020-05-18
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      相关资源
      最近更新 更多