斑点。无法通过 oAuth 的第二部分 (Python)

Spotipy. Can`t pass the second part of oAuth (Python)

我想创建一个应用程序,将一些歌曲添加到 Spotify 播放列表。所以使用 Spotipy(Python 库)来解决它可能是个好主意。

要将歌曲添加到播放列表,我需要知道它的 URI。要知道它的 URI,我应该使用名为 search (https://spotipy.readthedocs.io/en/2.19.0/#spotipy.client.Spotify.search). It requires some inputs and one of them is Authorization, which requires access token (link for docs https://developer.spotify.com/documentation/web-api/reference/#category-search). Then I used Authorization Guide from Spotify to authorize(link for AuthGuide https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow) 的方法,然后我堆叠。

第一步很简单:

self.query = {
            'client_id': client_id,

            'response_type': 'code',
            'redirect_uri': 'andriime.github.com/pc/'
        }


        self.info_code = requests.get(url=SPOTIFY_URL, params=self.query)
        self.authorization_code = self.info_code.text

但是第二步真的很吓人。我在整个互联网上搜索它的解决方案,但没有任何一个正常的指南如何通过它。但这是我发现的最好的:

Spotify API {'error': 'invalid_client'} Authorization Code Flow [400]

拜托,如果你知道如何处理它或者有答案,我错过了就写在这里!

编辑

如果我打印self.info_code响应代码是200。client_idclient_secret是环境变量,我在上面定义了它们(我没有 post 这段代码)。我的第 2 步代码如下所示:

self.authorization_code = self.info_code.text

        code_payload = {
            'grant_type': 'authorization_code',
            'code': self.authorization_code,
            'redirect_uri': redirect_uri,
        }


        auth_str = '{}:{}'.format(client_id, client_secret)
        b64_auth_str = base64.urlsafe_b64encode(auth_str.encode()).decode()
        print(b64_auth_str)

        headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Basic {}'.format(b64_auth_str)
        }

        post_request = requests.post(url=API_URL, data=code_payload, headers=headers)
        print(post_request.text)

响应文本为{"error":"invalid_grant","error_description":"无效授权码"}。 Whosebug 上有一个答案,但它对我不起作用 (How to fix 'error: invalid_grant Invalid authorization code' when asking for reshresh_token from Spotify API?),因为我没有犯那里写的那个错误。

Spotify community forum 上也有答案,但是那里没有答案。在另一个论坛上有一个问题,但也没有回答

链接:

1.https://community.spotify.com/t5/Spotify-for-Developers/Unable-to-get-access-token-using-authorization-code-flow/m-p/5098258

2.https://developer.salesforce.com/forums/?id=906F00000009B2AIAU)

所以再次请你回答你是否知道它应该如何工作。非常感谢!

好的,我知道怎么做了。这个视频对我很有帮助 (https://www.youtube.com/watch?v=yAXoOolPvjU),但是它是关于 javascript,但概念是一样的。

在第一步之后(在得到 self.info_code 响应之后)你应该检查一些事情:

  1. 您的重定向 uri 是否与 DashBoard 中的相同,是否以正确的格式 (https://example.com/callback/) 编写,我在那里犯了一个错误 - 我在 [=33 中有 'redirect_uri 参数=]self.query 因为 'andriime.github.com/pc/' 而不是 'https://andriime.github.io/pc/'(同样重要的是要记住没有任何 github.com,只有 github.io,所以正确 link 正确进入仪表板)

2."response_type" 在你的 paramsrequests 输入)应该等于 'code'

  1. 在此之后,你应该得到一个 link 你的请求(我没有找到如何完美地做到这一点,所以只写了这个:

print(f'{SPOTIFY_URL}?client_id={client_id}&client_secret={client_secret}&response_type={self.query["response_type"]}&redirect_uri={"https://andriime.github.io/pc/"}')

其中 SPOTIFY_URL 等于“https://accounts.spotify.com/authorize”

然后您只需将 link 复制并粘贴到浏览器中,然后单击一些“接受”按钮。在此之后,您将被重定向到您粘贴为 'redirect_uri' 的页面,然后您应该在浏览器中单击 link,您应该会在“redirect_uri 之后看到“代码”参数".

我知道,这部分有点复杂,但是你应该看看我上面 link 编的视频,它会很有用并且更容易理解

那你直接复制我的第二部分代码就可以使用了。但是,当然,改变参数。

        code_payload = {
            'grant_type': 'authorization_code',
            'code': code,
            'redirect_uri': redirect_uri,
        }


        auth_str = '{}:{}'.format(client_id, client_secret)
        b64_auth_str = base64.urlsafe_b64encode(auth_str.encode()).decode()

        headers = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Basic {}'.format(b64_auth_str)
        }
        new_response = requests.post(url=API_URL, headers=headers, params=code_payload)
        print(new_response.text)

这个答案还可以改进很多,所以我很想看到你的反馈 或此处的其他答案,使此方法更简单、更美观