Spotify的API簡單分為兩個(gè)入口:
- 授權(quán)入口:https://accounts.spotify.com/api/....
- API入口:https://api.spotify.com/v1/....
其中所有的授權(quán)相關(guān)驗(yàn)證都通過授權(quán)入口
進(jìn)行茬末,而所有正常獲取數(shù)據(jù)的API請求都從API入口
進(jìn)行。
Requests Rate Limit 請求限制次數(shù)
參考官網(wǎng):Authorization Guide
參考官方Github Issues:Getting higher usage rate limits
其中只說了不同請求方式的限制次數(shù)有不同,但是沒寫具體有多少:
- Implicit Grant:次數(shù)最少艘蹋,不能刷新token,數(shù)量未知鸠按。Rate limits for requests are improved but there is no refresh token provided.
- Client Credentials:次數(shù)較多一些,數(shù)量未知. The advantage here ... is that a higher rate limit is applied.
- Authorization Code:次數(shù)最多钓猬,具體數(shù)量未知氛改。網(wǎng)友回答:With 400 users, this would work out at one request every 3.6 seconds, which I'm sure wouldn't trigger Spotify's rate limiting policy. 也就是說一個(gè)app大約
100 requests/second
帐萎,或6000 requests/minute
。
參考另一篇官網(wǎng)文檔:https://developer.spotify.com/web-api/user-guide/
"Rate limiting is applied on an application basis (based on client id), regardless of how many users are using it."
即無關(guān)多少個(gè)用戶胜卤,限制次數(shù)只是和每個(gè)app掛鉤的疆导。
Developer 創(chuàng)建開發(fā)者身份
前往Spotify開發(fā)者網(wǎng)址:https://developer.spotify.com/dashboard

登錄后點(diǎn)擊create a client id
,生成一個(gè)專用的client_id
和client_secret
葛躏。

同時(shí)必須認(rèn)真設(shè)置Redirect URIs
澈段,因?yàn)槿蘸笫跈?quán)驗(yàn)證時(shí)要完全匹配才行。

Scopes 權(quán)限選擇
在進(jìn)行授權(quán)申請之前舰攒,要先確定這個(gè)app需要哪些權(quán)限败富,確定好了再到授權(quán)過程中通過參數(shù)進(jìn)行聲明。
Spotify對權(quán)限進(jìn)行了詳細(xì)的分類摩窃,全部的權(quán)限如下:

在之后我們對/authorize
頁面進(jìn)行GET申請授權(quán)時(shí)候兽叮,需要在URL里加入scope
參數(shù),里面的值就是我們所選擇的一些權(quán)限申請猾愿。
每條權(quán)限名用空格分開
只讀型
的常用權(quán)限有:
user-library-read
user-follow-read
user-top-read
user-read-private
playlist-read-private
user-read-playback-state
修改型
的常用權(quán)限有:
user-follow-modify
user-library-modify
playlist-modify-public
playlist-modify-private
全部組合起來的請求URL是這樣的:
https://accounts.spotify.com/authorize?...&...&...&scope=user-library-read user-follow-read user-top-read user-read-private playlist-read-private user-read-playback-state user-follow-modify user-library-modify playlist-modify-public playlist-modify-private
Authentication 授權(quán)
授權(quán)的最終目的是獲取一個(gè)名為access_token
的值鹦聪,然后用這個(gè)access_token
去獲取各種個(gè)樣的API信息。
Spotify為了嚴(yán)格區(qū)分不同的用途和權(quán)限蒂秘,把這個(gè)access_token
的獲取方法分為了三種流程泽本,各自的權(quán)限、存活期都不同姻僧。
三種流程特點(diǎn)如下:
-
Authorization Code Flow
: 授權(quán)碼规丽。主要方法,可刷新token撇贺。需要彈出網(wǎng)頁讓用戶登錄并點(diǎn)擊授權(quán)赌莺。 -
Client Credentials Flow
: app級token。獲取非常簡單显熏。但不可獲取用戶資源雄嚣,也不可刷新。過期需再申請喘蟆。 -
Implicit Grant Flow
: 臨時(shí)授權(quán)缓升。可獲取用戶資源蕴轨,不可刷新港谊。存活期比較短。

Flow-1: Authorization Code Flow
這是推薦的授權(quán)流程橙弱,可以獲得全部權(quán)限歧寺,比較安全燥狰,且可以刷新token。但是交互步驟多了一點(diǎn)斜筐,需要彈出頁面手動(dòng)點(diǎn)擊“授權(quán)”按鈕才行龙致。
具體步驟:
- 向
/authorize
發(fā)送GET請求,包括client_id
和redirect_uri
等 - Spotify彈出頁面顷链,用戶手動(dòng)登錄并點(diǎn)擊允許授權(quán)
- Spotify把頁面跳轉(zhuǎn)至自己設(shè)定的callback網(wǎng)址目代,并明文傳輸一個(gè)
Code
碼 - 用
Code
碼向/token
發(fā)送POST請求,并在header中包括一個(gè)動(dòng)態(tài)生成并base64編碼的Authorization
字符串嗤练,格式為Authorization: Basic *<base64 encoded client_id:client_secret>*
- 從Spotify獲得
access_token
和refresh_token
- 在
access_token
過期后榛了,用refresh_token
向/token
發(fā)送POST請求,獲得新的access_token
煞抬。
測試過程中霜大,我們是用Postman。好在Postman提供了最簡單的方法革答,一步到位:使用內(nèi)置Oauth2.0設(shè)置战坤。
設(shè)置方法是:
- 在Collection上右鍵點(diǎn)開Edit
- 選擇Authentication
- Type選擇Oauth 2.0
- Add to根據(jù)需求選擇把認(rèn)證添加到headers還是url
- 點(diǎn)擊
Get new access token
,添加token flow - Token name填上url或header中的參數(shù)的指定名稱蝗碎,一般為
access_token
湖笨。 - Grant type上選擇Authentication Code
- 填入所有相關(guān)內(nèi)容,注意callback必須與spotify后臺(tái)中設(shè)置一致
- 點(diǎn)擊
request token
- 然后Postman會(huì)彈出一個(gè)頁面蹦骑,需要你登錄Spotify并點(diǎn)擊允許授權(quán)。只需這一次臀防,以后每次Postman都會(huì)幫你登錄了
- 然后Postman就會(huì)生成一個(gè)全局的
access_token
- 之后每個(gè)頁面的Authentication欄眠菇,都直接選擇
Inherit auth from parent
繼承自父級即可自動(dòng)完成驗(yàn)證。


完成后袱衷,每個(gè)頁面的Header或URL中捎废,都會(huì)自動(dòng)增加一個(gè)access_token
值。

authentication
的值里致燥,已經(jīng)默認(rèn)加上了Bearer
前綴及后面的base64編碼字符串登疗。
注意:同名的參數(shù)如果以前存在,則會(huì)被覆蓋嫌蚤。內(nèi)置oAuth 2.0的設(shè)置是灰色的辐益,在這里不可直接編輯。
Flow-2: Client Credentials Flow
這種流程只需要用Dashboard后臺(tái)中的client_id
和client_secret
可以直接獲取access_token
脱吱。
SDK
spotipy
這個(gè)不好用智政,因?yàn)楣δ芴伲臋n不全箱蝠,基本的Oauth還要自己手動(dòng)解決续捂,沒什么現(xiàn)成的方法垦垂。
$ pip install spotipy --user
spotify.py
這個(gè)也構(gòu)建不完全,基于async異步牙瓢,但是很難走通劫拗。文檔也沒說明具體用法。
$ pip3 install spotify --user