Discord Py v2与新版ipy移动端在线状态不显示问题求助
解决Discord机器人移动端在线状态失效问题
问题根源
- 你定义了自定义的
MyDiscordWebSocket类,但最终给bot._websocket赋值的是原生WebSocketClient,导致自定义的移动端标识代码完全没执行。 - 新版本库(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
相关产品推荐
相关产品推荐

