如何通过Discord REST API获取语音频道成员列表?
如何通过Discord REST API获取语音频道成员列表
你遇到的404错误是因为Discord REST API不存在/guilds/{guild_id}/channels/{channel_id}/members这个端点,这个路径无效,所以无论使用bot令牌还是用户令牌都会返回404。
要通过REST API获取语音频道的成员,需要分两步操作:
步骤1:获取服务器的所有成员
使用GET /guilds/{guild_id}/members端点获取服务器内的成员列表。该端点支持分页,默认每次返回100个成员,最多一次返回1000个,需通过limit和after参数处理分页逻辑。
步骤2:筛选目标语音频道的成员
每个成员对象包含voice_state字段,其中的channel_id对应成员当前所在的语音频道ID。我们只需筛选出voice_state.channel_id与目标频道ID匹配的成员即可。
完整代码示例
import requests import os TOKEN = os.getenv("DISCORD_TOKEN") GUILD_ID = "你的服务器ID" TARGET_CHANNEL_ID = "目标语音频道ID" headers = { "Authorization": f"Bot {TOKEN}" } def get_voice_channel_members(guild_id, channel_id): members = [] after = None while True: params = {"limit": 1000} if after: params["after"] = after # 请求服务器成员列表 response = requests.get( f"https://discord.com/api/v9/guilds/{guild_id}/members", headers=headers, params=params ) if response.status_code != 200: print(f"请求失败: {response.text}") break batch = response.json() if not batch: break # 无更多成员可获取 # 筛选目标频道内的成员 for member in batch: voice_state = member.get("voice_state") if voice_state and voice_state.get("channel_id") == channel_id: members.append(member) # 更新分页标记,获取下一页数据 after = batch[-1]["user"]["id"] return members # 调用函数并输出结果 voice_members = get_voice_channel_members(GUILD_ID, TARGET_CHANNEL_ID) for member in voice_members: print(f"成员ID: {member['user']['id']}, 用户名: {member['user']['username']}")
注意事项
- 权限要求:你的bot需要拥有
GUILD_MEMBERS(获取服务器成员)和VOICE_STATE_READ(查看语音状态)权限,且需在目标服务器中正确配置权限。 - 分页处理:若服务器成员超过1000人,必须通过
after参数循环请求,直到返回空列表为止。 - 令牌类型:必须使用bot令牌,用户令牌无法调用
/guilds/{guild_id}/members端点(用户令牌仅能获取自身信息或好友列表)。
内容的提问来源于stack exchange,提问作者Droltromed
相关产品推荐
相关产品推荐

