尝试使用discord的API端点获取discord成员的数量
GET/guilds/{guild.id}/members
(请参阅此处)。
我正在使用 Postman 来拨打电话。我设置了授权标头:
Authorization: "Bot ${BOT_TOKEN}"
我得到的回应是
{ "message": "Missing Access", "code": 50001 }
我也尝试过
Authorization: DISCORD_CLIENT_ID
。
回复是{ "message": "401: Unauthorized", "code": 0 }
。
我错过了什么吗?请帮我解决这个问题。
首先,您需要确保使用正确的
guild
ID,而不是 channel
ID。您可以通过 Developer Mode
-> User settings
在 Discord 上启用 Advanced
,这样您就可以通过右键单击 guild
(服务器),然后单击 guild
来获取 Copy ID
id。
接下来,通过 Developer Portal 转到您的应用程序,选择您的应用程序并导航到左侧导航栏上的
Bot
选项卡。从那里,获取您的机器人的 authentication token
,您需要在请求的标头中传递它。在同一选项卡上 - 因为您需要获取 Guild Members
的列表,并且由于 “端点根据是否为您的应用程序启用 GUILD_MEMBERS
特权意图进行限制” - 向下滚动到 Privileged Gateway Intents
部分并启用 SERVER MEMBERS INTENT
。
下面是使用 Node.js 标准模块的工作示例。请注意,如此处所述,返回的最大成员数的默认
limit
为1
。因此,您可以调整查询参数中的 limit
,如下所示,以便每个请求接收更多结果。每个请求可以获得的最大结果数是1000
。因此,如果 guild
包含的成员多于此,您可以跟踪每个先前请求中存在的最高用户 ID,并将其传递给下一个请求的 after
参数,如 documentation 中所述。这样就可以获取到guild
中的每一个成员了。另外,请确保以正确的方式设置options
中的属性,如下所示;否则,您可能会遇到getaddrinfo ENOTFOUND
错误,如此处所示。
如果您还没有这样做,您应该将
bot
添加到您想要的服务器,方法是通过应用程序设置中 bot
下的 URL Generator
为您的 OAuth2
生成邀请链接(从范围中选择 bot
) )。现在,您可以从浏览器访问该 URL 并将 bot
添加到您的任何服务器。如果需要,您可以与其他人共享相同的邀请链接,以便他们可以将您的 bot
添加到他们的服务器。
Node.js 中的示例
const https = require('https')
const url = require('url');
GUILD_ID = "YOUR_GUILD_ID"
BOT_TOKEN = 'YOUR_BOT_TOKEN'
LIMIT = 10
const requestUrl = url.parse(url.format({
protocol: 'https',
hostname: 'discord.com',
pathname: `/api/guilds/${GUILD_ID}/members`,
query: {
'limit': LIMIT
}
}));
const options = {
hostname: requestUrl.hostname,
path: requestUrl.path,
method: 'GET',
headers: {
'Authorization': `Bot ${BOT_TOKEN}`,
}
}
const req = https.request(options, res => {
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.end()
Python 示例
import requests
import json
GUILD_ID = "YOUR_GUILD_ID"
BOT_TOKEN = 'YOUR_BOT_TOKEN'
LIMIT = 10
headers = {'Authorization' : 'Bot {}'.format(BOT_TOKEN)}
base_URL = 'https://discord.com/api/guilds/{}/members'.format(GUILD_ID)
params = {"limit": LIMIT}
r = requests.get(base_URL, headers=headers, params=params)
print(r.status_code)
print(r.text,'\n')
#print(r.raise_for_status())
for obj in r.json():
print(obj,'\n')