【问题标题】:Discord API "soft-ban" for Selfbot? It can only read its own messagesSelfbot 的 Discord API “软禁令”?它只能读取自己的消息
【发布时间】:2021-07-24 02:36:35
【问题描述】:

所以今天,我的 Discord Selfbot 突然停止工作。它已经运行了几个星期,没有任何问题。它所做的只是监控来自其他渠道的机器人警报,并在满足某些条件时通知我。

基本上问题是,当我print(message.content) 得到空字符串时,当我print(message.embeds) 得到一个空列表时。任何不是我自己发送的消息都会发生这种情况。基本上我可以从任何渠道提取任何消息,但如果不是我发送的,我会看到它是空的。我仍然可以print(message) 并查看其 ID、作者等,但无法检索内容/嵌入。

我认为这是 Discord API 的某种软禁令(帐户没有收到任何警告并且正常工作),但后来尝试创建一个新帐户并遇到了同样的问题。我很困惑,无法找出问题的原因......除非他们为每个人更改了 API。

【问题讨论】:

  • 我的程序甚至不是自我机器人,我今天也注意到了这一点。你的问题和我的有关吗? stackoverflow.com/questions/67338613/…
  • 非常有趣...所以这是 Discord 对其 API 所做的更改,但我没想到这也会影响普通机器人。这真的很烦人,我不知道如何解决它。 :(
  • 你为什么要删除你的问题?
  • 它似乎只是一个不和谐的 API 错误或其他什么,所以我认为不会有修复它。
  • Selfbots 违反了 Discord 的服务条款。

标签: discord discord.py


【解决方案1】:

过去几周我一直在玩这个,并使用互联网上的提示和想法,我为自我机器人创建了一个修补版本的 Discord.py。

您似乎需要做几件事才能让 message.contentmessage.embeds 再次工作:

  • 禁用所有意图
  • 编辑发送到 Discord 的 IDENTIFY 数据包

我的 fork 完成了所有这些,并混淆了用户代理和其他一些事情。

检查 README 以了解更改的内容 + 学分。

链接:GitHubPyPi

【讨论】:

  • 我现在尝试使用您的 fork,而 .content 确实有效,这很棒。但是 .author 不再适用于其他用户的消息!现在我想我现在将使用来自历史的消息作为作者。 (此外,该 Github 分支似乎已禁用问题)
  • 它非常适合我。你到底想从message.author 得到什么?我试过message.authormessage.author.idmessage.author.avatar_url
  • 其实,没关系。我现在构建了您的 fork,并创建了一个非常简单的脚本,该脚本仅在未编辑的 on_message 中打印 message.author 并且它起作用了。也许这是我之前尝试使用的高级配置的问题(比如不使用真正的 on_message,而是使用同步包装器等)
  • 如果你真的只想使用 discord.py,只需使用版本 1.4.2,它不会发送意图,因此可以工作
  • @Ceres 将(大部分)解决message.content 问题。但是,随着机器人和客户端 API 的快速分化,还有其他问题。此外,在我的 fork 中,我一直在删除所有与 bot 相关的内容,并慢慢添加未记录的客户端内容。
【解决方案2】:

大家的问题的答案:

2021 年 4 月 30 日,discord 进行了一些更改,导致无法接收消息内容并仅在 selfbots 上嵌入(可能更多)。如果你有这个问题,那么你正在使用一个自我机器人,这违反了不和谐的 TOS ......它也被 discord.py 自 1.7 版以来弃用并且不会获得支持。如果您需要支持,您需要更改为真正的机器人

【讨论】:

  • 什么是 d.py?你是说 discord.py 吗?
  • @TKperson,是的 d.py 表示 discord.py
  • 由于“自我机器人”越来越严格到濒临灭绝,是否有替代方法可以在不使用库的情况下监控文本?
【解决方案3】:

事实证明它对我也不起作用,我认为它有效 因为我之前没有测试过,只使用了历史或者我自己作为用户。

一种解决方法是使用 channel.history 代替它返回的消息 支持 .content 和类似的。

可能与此类似

@bot.event
async def on_message(message):
    async for message in message.channel.history(limit=1):
        print(message.content)

我也尝试(糟糕地)让 discord.py 总是从历史中获取它,这似乎对我有用。 (适用于 v1.x)

From cbbd51bf17bb19ea4835365e08266d06a27c1459 Mon Sep 17 00:00:00 2001
From: Example User <user@example.com>
Date: Fri, 7 May 2021 13:37:50 +0300
Subject: [PATCH] add workaround for on_message on self bots

Recently, now the messages that self bots get in events are broken.
In the case of on_message, .content and .embeds don't work.

However, this isn't the case if the message is retrieved with
channel.history()

This workarounds the issue for on_message by retrieving it from history
always

NOTE: I made the parse call async, didnt seem to break anything (yet)
---
 discord/gateway.py | 6 +++++-
 discord/state.py   | 9 ++++++++-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/discord/gateway.py b/discord/gateway.py
index 210a8822..019693db 100644
--- a/discord/gateway.py
+++ b/discord/gateway.py
@@ -30,6 +30,7 @@ import concurrent.futures
 import json
 import logging
 import struct
+import inspect
 import sys
 import time
 import threading
@@ -506,7 +507,10 @@ class DiscordWebSocket:
         except KeyError:
             log.debug('Unknown event %s.', event)
         else:
-            func(data)
+            if inspect.iscoroutinefunction(func):
+                await func(data)
+            else:
+                func(data)
 
         # remove the dispatched listeners
         removed = []
diff --git a/discord/state.py b/discord/state.py
index da1212c1..7c713e39 100644
--- a/discord/state.py
+++ b/discord/state.py
@@ -485,9 +485,16 @@ class ConnectionState:
     def parse_resumed(self, data):
         self.dispatch('resumed')
 
-    def parse_message_create(self, data):
+    async def parse_message_create(self, data):
         channel, _ = self._get_guild_channel(data)
         message = Message(channel=channel, data=data, state=self)
+        # This is a workaround for messages not working on self bots
+        async for temp_msg in message.channel.history(limit=1):
+            if temp_msg.id != message.id:
+                log.warning("retrieved on_message from history is not correct one")
+                break
+            
+            message = temp_msg
         self.dispatch('message', message)
         if self._messages is not None:
             self._messages.append(message)
-- 
2.30.2

编辑:现在看别人的回答

【讨论】:

  • 如果聊天发短信真的很快,这会起作用吗?是否会记录重复的消息?这可靠吗?对我来说,这个解决方案似乎从聊天中获取每条新收到的空消息,但是如果 2 个用户在同一个聊天中同时发送 2 条消息会发生什么?
  • .id 仍然有效,所以你可以猜猜聊天是否真的发展得那么快,获取更多以前的聊天并通过 id 找到正确的聊天。或者只是验证是否收到了正确的消息。我没有遇到重复的问题。现在,我尝试以不同的用户身份快速发送大量消息,一切似乎都按正确的顺序排列,没有遗漏任何内容。
  • 好的,我想这可能是一个很好的解决方案。这是我的 +1 票
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 2022-11-17
  • 2021-01-26
  • 2020-10-20
  • 2020-07-29
  • 2022-06-13
相关资源
最近更新 更多