You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord Py v2与新版ipy移动端在线状态不显示问题求助

解决Discord机器人移动端在线状态失效问题

问题根源

  1. 你定义了自定义的MyDiscordWebSocket类,但最终给bot._websocket赋值的是原生WebSocketClient,导致自定义的移动端标识代码完全没执行。
  2. 新版本库(interactions.py最新版、discord.py v2)对WebSocket客户端的内部实现做了调整,私有方法的命名或结构发生变化,旧写法不再生效。

针对最新版interactions.py的修复方案

修改代码,正确使用自定义WebSocket类,并适配新版本的方法命名:

from interactions import Client, ClientPresence, PresenceActivity, PresenceActivityType
from interactions.client.websocket import WebSocketClient
from interactions.api.gateway import OpCodeType
from typing import Optional, List, Tuple

class MyDiscordWebSocket(WebSocketClient):
    async def _identify(  # 新版本库中方法名改为单下划线的受保护方法
            self, shard: Optional[List[Tuple[int]]] = None, presence: Optional[ClientPresence] = None
    ) -> None:
        self._shard = shard
        self._presence = presence
        payload: dict = {
            "op": OpCodeType.IDENTIFY,
            "d": {
                "token": self._http.token,
                "intents": self._intents.value,
                "properties": {
                    "$os": "Android",
                    "$browser": "Discord Android",
                    "$device": "Discord Android",
                },
            },
        }

        if shard is not None and len(shard) >= 1:
            payload["d"]["shard"] = shard
        if presence is not None:
            payload["d"]["presence"] = presence._json
        
        await self.send(payload)  # 新版本需显式发送标识请求

# 初始化机器人
bot = Client(
    token=TOKEN,
    presence=ClientPresence(
        activities=[PresenceActivity(name="Kryptia Citybuild", type=PresenceActivityType.GAME)]
    )
)
# 使用自定义WebSocket类替换原生实现,注意传入http参数
bot._websocket = MyDiscordWebSocket(token=TOKEN, intents=bot._intents, http=bot._http)

bot.start()

关键修改点:

  • 重写方法名从__identify改为_identify,适配新版本库的方法命名
  • 实例化自定义WebSocket时传入http参数,满足新版本构造函数要求
  • 确保bot._websocket赋值的是自定义类实例,而非原生类
  • 手动调用await self.send(payload)完成标识请求发送

针对discord.py v2的修复方案

如果是discord.py v2,通过重写DiscordWebSocket的identify方法实现:

import discord
from discord.gateway import DiscordWebSocket

class MobileDiscordWebSocket(DiscordWebSocket):
    async def identify(self):
        payload = await super().identify()
        # 替换properties字段为移动端标识
        payload["d"]["properties"] = {
            "$os": "Android",
            "$browser": "Discord Android",
            "$device": "Discord Android",
        }
        return payload

# 全局替换WebSocket类,让机器人使用修改后的逻辑
discord.gateway.DiscordWebSocket = MobileDiscordWebSocket

# 初始化机器人
intents = discord.Intents.default()
bot = discord.Bot(intents=intents, activity=discord.Game(name="Kryptia Citybuild"))

bot.run(TOKEN)

关键思路:

  • 继承DiscordWebSocket并重写identify方法,在父类生成的payload基础上修改设备标识
  • 全局替换discord.py的WebSocket类,确保机器人全程使用自定义逻辑

额外注意事项

  • 部分Discord客户端存在缓存,修改后需重启机器人并刷新客户端页面才能看到状态更新
  • 建议使用稳定版库,避免开发分支的API变动导致代码失效
  • 目前官方未提供正式的移动端状态设置接口,此方法依赖库内部实现,后续版本更新可能需要重新适配

内容的提问来源于stack exchange,提问作者Paddy Schlittler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:36:19