我不确定这是否是正确的形式,我对这件事还很陌生,所以请容忍我.
目前,我正试图在我的家里自动化一些事情。有一件事与Spotify有关。为了做到这一点,我编写了一个python脚本,它在我的笔记本电脑上运行良好,但是当我将它传输到我的NAS (OpenMediaVault6)时,脚本就不能工作了。我想把它放在那里进行任务调度。
我想我知道问题出在哪里,但我不知道如何解决。在python脚本中,我必须从spotify获得一个访问令牌。为此,我需要在浏览器中对自己进行身份验证,但据我所知,这在NAS上是不可能的。
我试图用客户端凭据流来解决这个问题,但是我需要访问我的用户信息。
这是一个简化的代码:
import spotipy
CLIENT_ID = "client_id"
CLIENT_SECRET = "client_secret"
REDIRECT_URI = "http://localhost:8888/callback"
USER_ID = "user_id"
SCOPE = "user-read-private user-read-email"
token = spotipy.util.prompt_for_user_token(USER_ID, SCOPE, CLIENT_ID, CLIENT_SECRET, REDIRECT_URI)
print(token)有人知道如何在NAS上运行吗?
提前准备好。
发布于 2022-11-29 21:16:26
供将来参考(由@Ximzend驱动的解决方案):
显然是Refresh Token,它与Access Token一起提供,直到从用户那里撤销为止。因此,您可以访问Cache,在那里保存和保存Access Token过期的时间,并生成一个新的Access Token,而不必再次授权。因此,基本上,在普通PC/系统上生成一次Access Token,然后将Cache复制到NAS,这样这个脚本就可以访问它。
就像这样:
import json
import requests
import base64
CLIENT_ID = "client_id"
CLIENT_SECRET = "client_secret"
with open(".cache-<user_id>", 'r') as cach:
data = cach.read()
cache = json.loads(data)
REFRESH_TOKEN = cache['refresh_token']
def get_new_token():
authorization = base64.b64encode(bytes(CLIENT_ID + ":" + CLIENT_SECRET, "ISO-8859-1")).decode("ascii")
endpoint = "https://accounts.spotify.com/api/token"
headers = {
"Authorization": f"Basic {authorization}",
"Content-Type": "application/x-www-form-urlencoded"
}
data = {
"refresh_token": REFRESH_TOKEN,
"grant_type": "refresh_token"
}
response = requests.post(endpoint, headers=headers, data=data)
return response.json()["access_token"]
ACCESS_TOKEN = get_new_token()我每天在NAS上运行这段代码,并给自己发送新的Access Token给我的邮件,只是为了检查一下,它是否还在工作,以便我的其他脚本,依赖于令牌,每周运行,仍然可以工作。
https://stackoverflow.com/questions/74599067
复制相似问题