0

我正在尝试设置一个脚本,当通过终端中的一个简单菜单选择此选项时启动 Spotify 播放。

问题是我希望这个脚本是动态的,我需要输入一个用户名,当在 spotify 网络自动化页面上重定向时,要求输入登录名和密码,而不是要求接受 python 脚本。

现在我有这个代码:

import sys
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import json
import os
import spotipy.util as util
from json.decoder import JSONDecodeError

os.environ['SPOTIPY_CLIENT_ID'] = 'b0g0000Myclientid000000'
os.environ['SPOTIPY_CLIENT_SECRET'] = 'b0g0000Myclientsecret000000'
os.environ['SPOTIPY_REDIRECT_URI'] = 'https://google.com/'

# Get the spotify username from the terminal
username = sys.argv[1]
scope = 'user-read-private user-read-email user-read-playback-state user-modify-playback-state'

try:
    token = util.prompt_for_user_token(username, scope)
except:
    os.remove(f".cache-{username}")
    token = util.prompt_for_user_token(username, scope)

# Creation of the spotify object
sp = spotipy.Spotify(auth=token)

user = sp.current_user()

try:
    devices = sp.devices()
    deviceID = devices['devices'][0]['id']
except:
    print("No devices found...")

print(json.dumps(devices, sort_keys=True, indent=4))
playback = sp.current_user_playing_track()

if playback != None:
    current_artist = playback['item']['artists'][0]['name']
    current_track_name = playback['item']['name']
    print('************** Currently playing : ************** \n Artist:        ' + current_artist + '\n Track name:    ' + current_track_name)
track = sp.search(playback, 1, 0, 'track')
# print(json.dumps(track, sort_keys=True, indent=4))

# For testing purposes : print(json.dumps(playback, sort_keys=True, indent=4))

while True:
    print("\n\nWhat to do ?\n- Play spotify [0]:\n- Play a specific song [1]:\n- Quit [q]")
    menu_answer = input()

    if menu_answer == '0':
        is_playing = playback['is_playing']
        if is_playing == False:
            sp.start_playback()
            print("Started playing the playback (Current song: " + current_track_name + " by " + current_artist + ")")
        else:
            print("Already playing ;)")
    elif menu_answer == '1':
        print("we will play a song")
    elif menu_answer == 'q':
        break
    else:
        pass

非常感谢帮助!

4

1 回答 1

0

如果不向他们显示屏幕以供他们授权您的脚本,就不可能实现授权用户的 OAuth 流程。这需要为任何新用户完成。

但是,您可以保存用户的凭据,并使用这些凭据来获取已经授权您的脚本的人的授权详细信息。

例如

  1. 用户输入用户名并且您没有任何保存的凭据,因此您显示授权屏幕并且他们接受。您获得授权代码和刷新代码并将它们保存在与用户 ID 关联的某个位置。
  2. 当用户输入用户名并且您已保存凭据时,您无需显示授权屏幕,因为他们已经授权了您的脚本。您可以立即显示带有选项的菜单,供他们控制播放。

如果我完全误解了这个问题,请告诉我。

于 2018-05-14T12:17:49.143 回答