如何通过直接修改IDENTIFY数据包来获取discord bot的移动状态?

2024-06-10

显然,discord 机器人可以具有移动状态,而不是默认获得的桌面(在线)状态。

经过一番挖掘后,我发现这种状态是通过修改IDENTIFY packet in discord.gateway.DiscordWebSocket.identify https://github.com/Rapptz/discord.py/blob/45d498c1b76deaf3b394d17ccf56112fa691d160/discord/gateway.py#L370修改值$browser to Discord Android or Discord iOS理论上应该让我们获得移动状态。

修改我在网上找到的执行此操作的代码片段后,我最终得到以下结果:

def get_mobile():
    """
    The Gateway's IDENTIFY packet contains a properties field, containing $os, $browser and $device fields.
    Discord uses that information to know when your phone client and only your phone client has connected to Discord,
    from there they send the extended presence object.
    The exact field that is checked is the $browser field. If it's set to Discord Android on desktop,
    the mobile indicator is is triggered by the desktop client. If it's set to Discord Client on mobile,
    the mobile indicator is not triggered by the mobile client.
    The specific values for the $os, $browser, and $device fields are can change from time to time.
    """
    import ast
    import inspect
    import re
    import discord

    def source(o):
        s = inspect.getsource(o).split("\n")
        indent = len(s[0]) - len(s[0].lstrip())

        return "\n".join(i[indent:] for i in s)

    source_ = source(discord.gateway.DiscordWebSocket.identify)
    patched = re.sub(
        r'([\'"]\$browser[\'"]:\s?[\'"]).+([\'"])',
        r"\1Discord Android\2",
        source_,
    )

    loc = {}
    exec(compile(ast.parse(patched), "<string>", "exec"), discord.gateway.__dict__, loc)
    return loc["identify"]

现在剩下要做的就是覆盖discord.gateway.DiscordWebSocket.identify在主文件的运行时,类似这样的内容:

import discord
import os
from discord.ext import commands
import mobile_status

discord.gateway.DiscordWebSocket.identify = mobile_status.get_mobile()
bot = commands.Bot(command_prefix="?")

@bot.event
async def on_ready():
    print(f"Sucessfully logged in as {bot.user}")

bot.run(os.getenv("DISCORD_TOKEN"))

And we do get the mobile status successfully
successful mobile status for bot

但这是问题所在,我想直接修改该文件(包含该函数),而不是在运行时对其进行猴子修补。所以我在本地克隆了 dpy lib 并在我的机器上编辑了该文件,它最终看起来像这样:

    async def identify(self):
        """Sends the IDENTIFY packet."""
        payload = {
            'op': self.IDENTIFY,
            'd': {
                'token': self.token,
                'properties': {
                    '$os': sys.platform,
                    '$browser': 'Discord Android',
                    '$device': 'Discord Android',
                    '$referrer': '',
                    '$referring_domain': ''
                },
                'compress': True,
                'large_threshold': 250,
                'v': 3
            }
        }
     # ...

(编辑了两者$browser and $device to Discord Android只是为了安全起见)

但这不起作用,只是给了我常规的桌面在线图标。
所以我接下来要做的就是检查identify功能after它已经被猴子修补了,所以我可以查看源代码,看看之前出了什么问题,但由于运气不好,我得到了这个错误:

Traceback (most recent call last):
  File "c:\Users\Achxy\Desktop\fresh\file.py", line 8, in <module>
    print(inspect.getsource(discord.gateway.DiscordWebSocket.identify))
  File "C:\Users\Achxy\AppData\Local\Programs\Python\Python39\lib\inspect.py", line 1024, in getsource
    lines, lnum = getsourcelines(object)
  File "C:\Users\Achxy\AppData\Local\Programs\Python\Python39\lib\inspect.py", line 1006, in getsourcelines
    lines, lnum = findsource(object)
  File "C:\Users\Achxy\AppData\Local\Programs\Python\Python39\lib\inspect.py", line 835, in findsource
    raise OSError('could not get source code')
OSError: could not get source code

Code :

import discord
import os
from discord.ext import commands
import mobile_status
import inspect

discord.gateway.DiscordWebSocket.identify = mobile_status.get_mobile()
print(inspect.getsource(discord.gateway.DiscordWebSocket.identify))
bot = commands.Bot(command_prefix="?")

@bot.event
async def on_ready():
    print(f"Sucessfully logged in as {bot.user}")

bot.run(os.getenv("DISCORD_TOKEN"))

由于每个修补函数都表现出相同的行为(上述函数和loc["identify"])我无法再使用inspect.getsource(...)然后依靠dis.dis这导致了更令人失望的结果

反汇编的数据看起来与猴子补丁的工作版本完全相同,因此尽管功能内容完全相同,但直接修改的版本根本无法工作。 (关于拆解数据)

备注:做Discord iOS直接也不起作用,改变$device到其他一些值,但保持$browser不起作用,我已经尝试了所有组合,但没有一个起作用。

TL;DR:如何在运行时不对其进行猴子修补的情况下获取不和谐机器人的移动状态?


DiscordWebSocket.identify非常重要,并且没有受支持的方法来覆盖这些字段。

复制粘贴 35* 行代码来修改 2 行代码的更可维护的替代方法是子类化,然后覆盖DiscordWebSocket.send_as_json(4行自定义代码),并修补classmethod DiscordWebSocket.from_client实例化子类:

import os

from discord.ext import commands
from discord.gateway import DiscordWebSocket


class MyDiscordWebSocket(DiscordWebSocket):

    async def send_as_json(self, data):
        if data.get('op') == self.IDENTIFY:
            if data.get('d', {}).get('properties', {}).get('$browser') is not None:
                data['d']['properties']['$browser'] = 'Discord Android'
                data['d']['properties']['$device'] = 'Discord Android'
        await super().send_as_json(data)


DiscordWebSocket.from_client = MyDiscordWebSocket.from_client
bot = commands.Bot(command_prefix="?")


@bot.event
async def on_ready():
    print(f"Sucessfully logged in as {bot.user}")

bot.run(os.getenv("DISCORD_TOKEN"))

*Pycord 1.7.3 中的 39 行。通过覆盖,您通常无需额外的努力即可获得未来的更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过直接修改IDENTIFY数据包来获取discord bot的移动状态? 的相关文章

随机推荐

  • MSVC 可能/不太可能等效

    GCC 编译器支持 builtin expect 语句 用于定义可能和不可能的宏 eg define likely expr builtin expect expr 1 define unlikely expr builtin expect
  • MySQL:向大表添加字段

    我有一个包含大约 200 000 条记录的表 我想向其中添加一个字段 ALTER TABLE table ADD param 21 BOOL NOT NULL COMMENT about the field AFTER param 20 但
  • WebStorm 中的断点未命中 JavaScript 调试

    我在 WebStorm 中有以下配置设置 当我单击 调试 时 它会正常启动 Chrome 并导航到该页面 但我的断点从未被命中 但它以某种方式连接起来 因为我看到了所有console log WebStorm 中的输出 我正在尝试导航到屏幕
  • 根据条件格式化货币

    Google Apps 脚本新手 但有一些 VBA 编码经验 我希望能够根据不同的单元格输入决定单元格的数字格式 eg Col A 客户名称 验证范围 B 栏 货币类型 英镑 美元 欧元 经过验证的列表 Col C 费用 100 用户免费类
  • webkit 和 moz 有什么区别

    我不明白之间的区别 webkit animation and moz animation 两者之间有什么区别 或者是相同的 我用谷歌搜索了这个问题 但找不到差异 这是代码示例 blink me font size 60px font wei
  • 如何在加载到页面之前初始化聚合物元素的国际化

    我正在使用 Dart 构建 Polymer 应用程序 由于我在 Polymer 元素中使用 Dart 的国际化功能 因此我想在创建 Polymer 元素之前初始化国际化消息 并在 Polymer 元素中显示给定区域设置的适当消息 如何才能做
  • R中引用和表达式的区别

    gettypes function x paramx substitute x print typeof paramx print class paramx print mode paramx gettypes expression sin
  • 在 Visual Studio 2017 中使用 .wid 文件

    我已经使用 Visual Studio 2017 Professional 创建了一个安装项目 vdproj file 我想使用本页中建议的密码对话框 https www codeproject com Tips 659367 Passwo
  • 使用 tcp/ip 在真实手机上使用 adb logcat

    我可以使用 adb 通过 wifi 使用 tcp ip 从 Android 手机转储日志吗 可以使用 adb connect 但它需要在手机上运行一些服务器 在 5555 端口 我如何启动这个服务器 或者从手机获取日志的唯一方法是将其连接为
  • AVAudioPCMBuffer 的播放段

    我正在为 iOS 应用程序创建这个简单的录音机和编辑器界面 音频被记录到用于创建波形的浮点数组中 记录后 我将浮点数据复制到AVAudioPCMBuffer用来玩AVAudioPlayerNode 我能够从一开始就播放缓冲区 但我不知道如何
  • 如何使用 C 程序获取机器的 MAC 地址?

    这个问题和这个问题完全一样 如何使用 C 程序获取机器的 MAC 地址 https stackoverflow com questions 1779715 how to get mac address of your machine usi
  • .Net Core 异步关键部分(如果在同一实体上工作)

    我需要确保通过 Web API 访问的方法不能同时通过多个调用访问 如果它在具有相同 id 的同一对象上工作 我理解使用SemaphoreSlim但一个简单的实现将锁定所有人的关键部分 但只有当该部分适用于同一实体而不是两个不同的实体时 我
  • 如何调整 imageButton 的大小?

    我想调整我的大小ImageButton在图形布局上使用鼠标或使用代码android layout width android layout height 但每当我这样做时 ImageButton事实上 它没有调整大小 也没有变小 只是边缘被
  • 在静态类中拥有状态是不好的做法吗?

    我想做这样的事情 public class Foo Probably really a Guid but I m using a string here for simplicity s sake string Id get set int
  • 是否可以将外部数据拖放到 jstree 中?

    我正在开发一个需要构建分层导航菜单的项目 jstree https www jstree com看起来很适合这个 该树将被保存到数据库中 我计划使用 CakePHP树的行为 https book cakephp org 2 0 en cor
  • 如何阻止特定选项卡上的 HTTP 请求?

    我正在开发一个 FF 插件 我想阻止除特定域之外的任何域的所有 http 请求 用户定义域 在特定选项卡中 下面给出的函数可以很好地完成这项工作 但问题是它会阻止来自所有选项卡的 http 请求 如何仅在特定选项卡中启用以下功能 如何获取与
  • 如何在不使CSS3多列div变窄的情况下添加浮动图像?

    正如人们可以在这里看到的 http jsfiddle net ZP3vu http jsfiddle net ZP3vu 由于图像浮动 文本变得更窄 然后在图像下方恢复到 100 宽度 然而 对于 CSS3 多列 它变得很难看 http j
  • 是否值得为 EEPROM 实现小型文件系统

    我买了一个I2C EEPROM 我想存储传感器和电压数据 我假设该值可以大于一个字节 并且可以有很多数据 在这种情况下是否值得实现具有小文件分配表的文件系统 例如 这会让我更容易查看 EEPROM 我发现 EEPROM 上出现 FAT 有两
  • 在没有“跨线程”的情况下,我可以从BackgroundWorker访问什么?

    我意识到我无法从BackgroundWorker 的DoWork 事件处理程序访问表单控件 如果我尝试这样做 我会得到一个异常 正如预期的那样 但是 我是否可以访问表单上存在的其他 自定义 对象 例如 我创建了一个 设置 类并在我的表单中实
  • 如何通过直接修改IDENTIFY数据包来获取discord bot的移动状态?

    显然 discord 机器人可以具有移动状态 而不是默认获得的桌面 在线 状态 经过一番挖掘后 我发现这种状态是通过修改IDENTIFY packet in discord gateway DiscordWebSocket identify