【发布时间】:2017-09-27 13:05:47
【问题描述】:
快速提问:我正在尝试使用 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)
【问题讨论】:
-
您的机器人到底有哪个scopes?也很高兴看到一些代码,以便我们可以查看您是否在其他地方犯了错误。
-
我添加了它们,以及两个请求函数,一个有效,一个给我代码 401。
-
@ThomasKowalski 你有没有进一步了解这个?我有一个类似的问题:OAuth 正在工作,我可以阅读
/users/@me/guilds,但我无法阅读/users/@me/channels。 -
不,我没有放弃。如果您找到解决方案,请告诉我!