Я сделал программу Python, которая передает музыку c из плейлистов YouTube в вашу учетную запись Spotify, и я хотел превратить ее в веб-приложение с простым пользовательским интерфейсом, чтобы люди могли входить в свои учетные записи yt / spotify, не имея для запуска программы из командной строки. Я использовал Flask для создания интерфейса, и он работал, когда я вручную вводил данные для входа в свой файл YouTubetoSpotify
, и теперь я работаю над реализацией Oauth2
поверх пользовательского интерфейса, чтобы, когда пользователь щелкает один кнопок входа в систему, он направит их на соответствующую страницу аутентификации (сейчас я просто работаю над входом в Spotify).
После некоторой отладки кажется, что идентификатор и секрет клиента получены правильно , но когда они используются для получения токена (в функции getToken
в flask_spotify_auth
), почтовый запрос возвращает ошибку. Вот полное сообщение об ошибке, а также все мои файлы.
{'error': 'invalid_client'}
[2020-07-08 14:09:13,121] ERROR in app: Exception on /callback/ [GET]
Traceback (most recent call last):
File "C:\Users\jared\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\jared\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\jared\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\jared\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\jared\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\jared\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:/Users/jared/codingProjects/python_projects/Mixify/app.py", line 30, in upload
startup.getUserToken(request.args['code'])
File "C:\Users\jared\codingProjects\python_projects\Mixify\startup.py", line 29, in getUserToken
TOKEN_DATA = getToken(code, CLIENT_ID, CLIENT_SECRET, "{}:{}/callback/".format(CALLBACK_URL, PORT))
File "C:\Users\jared\codingProjects\python_projects\Mixify\flask_spotify_auth.py", line 33, in getToken
return handleToken(json.loads(post.text))
File "C:\Users\jared\codingProjects\python_projects\Mixify\flask_spotify_auth.py", line 38, in handleToken
auth_head = {"Authorization": "Bearer {}".format(response["access_token"])}
KeyError: 'access_token'
127.0.0.1 - - [08/Jul/2020 14:09:13] "GET /callback/?code=AQA9preCSj1r87JMxXt5XUBwC6LT-ZQM_By2NYTcdhi7wgUIwQKO6Q5Cm7ChcKdJ_Rd3IkCxdTKw7RlI4EYZNIZrp9RpZfOd1rXeE8v_2tY3A0Q-RKqP21jmRHMFOdTV4z1Lj6lQ1WXcOmbL5eP614ps8TfDPOzBwOfHMvILr-y3HsB30RlYJ6X2XQLUb5p3347YIsx4lfcja9unWa1SjyXw7pbYdOA HTTP/1.1" 500 -
app.py
# Jared Tewodros
# jmt5rg
from flask import *
import YoutubeToSpotify
import startup
app = Flask(__name__)
# @app.errorhandler(404)
# def page_not_found(e):
# return render_template('404.html'), 404
# home page
# @app.route("/")
# def upload():
# return render_template("file_upload.html")
@app.route("/")
def index():
response = startup.getUser()
return redirect(response)
@app.route('/callback/', methods=["GET", "POST"])
def upload():
startup.getUserToken(request.args['code'])
return render_template("file_upload.html")
# and that's all folks
@app.route("/convert", methods=["POST"])
def success():
global yt_list
global sp_list
global desc
yt_list = request.form['ytPL']
sp_list = request.form['spPL']
desc = request.form['desc']
cp = YoutubeToSpotify.YouTubePlaylist()
cp.add_song_to_playlist(yt_list, sp_list, desc)
return render_template("success.html")
if __name__ == "__main__":
app.run()
startup.py
# Jared Tewodros
# jmt5rg
from flask_spotify_auth import getAuth, refreshAuth, getToken
# Add your client ID
CLIENT_ID = "53754c6314ec4175b8dc3d23c864cb5a"
# aDD YOUR CLIENT SECRET FROM SPOTIFY
CLIENT_SECRET = "6677e13f615b4cfda88371b233b9ae08"
# Port and callback url can be changed or ledt to localhost:5000
PORT = "5000"
CALLBACK_URL = "http://localhost"
# Add needed scope from spotify user
# SCOPE = "streaming user-read-birthdate user-read-email user-read-private"
SCOPE = "user-read-email user-read-private"
# token_data will hold authentication header with access code, the allowed scopes, and the refresh countdown
TOKEN_DATA = []
def getUser():
return getAuth(CLIENT_ID, "{}:{}/callback/".format(CALLBACK_URL, PORT), SCOPE)
def getUserToken(code):
global TOKEN_DATA
TOKEN_DATA = getToken(code, CLIENT_ID, CLIENT_SECRET, "{}:{}/callback/".format(CALLBACK_URL, PORT))
def refreshToken(time):
time.sleep(time)
TOKEN_DATA = refreshAuth()
def getAccessToken():
return TOKEN
flask_spotify_auth. ру
# Jared Tewodros
# jmt5rg
import base64, json, requests
SPOTIFY_URL_AUTH = 'https://accounts.spotify.com/authorize/?'
SPOTIFY_URL_TOKEN = 'https://accounts.spotify.com/api/token/'
RESPONSE_TYPE = 'code'
HEADER = 'application/x-www-form-urlencoded'
REFRESH_TOKEN = ''
def getAuth(client_id, redirect_uri, scope):
data = "{}client_id={}&response_type=code&redirect_uri={}&scope={}".format(SPOTIFY_URL_AUTH, client_id,
redirect_uri, scope)
return data
def getToken(code, client_id, client_secret, redirect_uri):
body = {
"grant_type": 'authorization_code',
"code": code,
"redirect_uri": redirect_uri,
"client_id": client_id,
"client_secret": client_secret
}
iden = "{}:{}".format(client_id, client_secret)
iden_bytes = iden.encode('ascii')
encoded = base64.b64encode(iden_bytes)
headers = {"Content-Type": HEADER, "Authorization": "Basic {}".format(encoded)}
post = requests.post(SPOTIFY_URL_TOKEN, params=body, headers=headers)
return handleToken(json.loads(post.text))
def handleToken(response):
print(response)
auth_head = {"Authorization": "Bearer {}".format(response["access_token"])}
REFRESH_TOKEN = response["refresh_token"]
return [response["access_token"], auth_head, response["scope"], response["expires_in"]]
def refreshAuth():
body = {
"grant_type": "refresh_token",
"refresh_token": REFRESH_TOKEN
}
post_refresh = requests.post(SPOTIFY_URL_TOKEN, data=body, headers=HEADER)
p_back = json.dumps(post_refresh.text)
return handleToken(p_back)