快速提问:我正在尝试使用Discord API备份服务器上的所有消息(如果使用官方术语,则为公会)。
所以我实现了OAuth没有任何问题,我有我的访问令牌,我可以查询一些端点(我试过/users/@me
,/users/@me/guilds
)。虽然,他们中的大多数都不起作用。例如,如果我查询/users/@me/channels
(应该是DM),我会从API获得401 Unauthorized响应。如果我从/users/@me/guilds
收集一个公会id,然后尝试用/guilds/guild.id/channels
列出其中的频道,这是一样的。
真的很奇怪的是,我确实拥有所需的所有范围(我想是这样,我没有采用RPC,因为我不认为这是我想做的事情所必需的)我无法弄清楚自己...同样奇怪的是,在OAuth授权屏幕上,我有两件事:
它有点自相矛盾...... :(
你有任何想分享的想法吗?
谢谢!
注意:我使用的是Python,但我不认为它与此相关,因为有些端点可以使用我拥有的标头和标记......
这是我的“身份验证码”:
baseUrl = "https://discordapp.com/api"
def authorize():
scopes = [
"guilds",
"email",
"identify",
"messages.read",
"guilds.join",
"gdm.join",
"connections"
]
urlAuthorize = "{}/oauth2/authorize?client_id={}&scope={}&response_type=code".format(baseUrl, clientid, ('+'.join(scopes)))
pyperclip.copy(urlAuthorize)
code = input("Code: ")
return code
def getAccessToken(code):
url = "{}/oauth2/token".format(baseUrl)
params = {
"client_id" : clientid,
"client_secret" : clientsecret,
"redirect_uri" : "http://localhost",
"grant_type":"authorization_code",
"code" : code,
}
req = requests.post(url, params = params)
return json.loads(req.text)
以及与API请求相关的代码:
def getHeaders():
return {
"Authorization" : "{} {}".format("Bearer", config["accessToken"]),
# "user-agent" : "DiscordBackup/0.0.1"
}
def getRequest(endpoint, asJson = True, additional = None):
url = "{}/{}".format(baseUrl, endpoint)
req = requests.get(url, headers = getHeaders())
print()
print(getHeaders())
print(url)
print(req.text)
if asJson:
return json.loads(req.text)
else:
return req.text
def getMe(): # this works
endpoint = "users/@me"
return getRequest(endpoint)
def getMyDMs(): # this gives me a code 401 Unauthorized
endpoint = "/users/@me/channels"
return getRequest(endpoint)
遇到这个问题时我遇到了这个帖子,说白了,没办法解决它。
messages.read
权限适用于本地RPC服务器; https://discordapp.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes
但是,本地RPC服务器处于私有测试阶段,您必须注册/接受使用它。
我想创建一个DM导出器,但现在看起来不太可能。