Discord API 401未经授权使用OAuth

时间:2017-04-29 14:15:16

标签: python api oauth discord

快速提问:我尝试使用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授权屏幕上,我有两件事情,这也很奇怪:

Read all messages

This app cannot read messages

它有点反对...... :(

您有任何想要分享的想法吗?

谢谢!

注意:我使用的是Python,但我不认为它与此相关,因为有些端点可以使用我拥有的标题和标记...

这是我的#34;身份验证码":

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)

1 个答案:

答案 0 :(得分:0)

遇到此问题时,我碰到了这篇文章,说白了,没有办法解决。

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

但是,本地RPC服务器处于私有Beta中,您必须先注册/接受才能使用。

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