【问题标题】:Discord API 401 Unauthorized with OAuthDiscord API 401 未经 OAuth 授权
【发布时间】: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
  • 不,我没有放弃。如果您找到解决方案,请告诉我!

标签: python api oauth discord


【解决方案1】:

遇到这个问题的时候看到了这个帖子,说白了就是没办法解决。

messages.read 权限用于本地 RPC 服务器; https://discordapp.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes

但是,本地 RPC 服务器处于私有测试阶段,您必须注册/被接受才能使用它。

我想创建一个 DM 导出器,但现在看起来不太可能。

【讨论】:

  • 哇,这正是我想知道的!尽管答案很晚才到达,但我很高兴知道这不是我的代码错误
  • 是的,只是认为对于偶然发现此内容的其他人来说可能值得一提,但我很高兴您仍然活跃并设法阅读它 :) 我现在最好的选择是使用不记名令牌,显然可以让您访问 DM,但很多人可能不想这样做。
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2012-04-08
  • 2012-12-20
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多