You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spotify关闭时Python调用API报错致脚本终止问题求助

问题:Spotify关闭时Python脚本崩溃,无法持续向Arduino传输系统信息

我编写了一个Python脚本,旨在实时获取Spotify当前播放的歌曲信息并发送至Arduino,同时还要向Arduino传输CPU、内存占用数据。但遇到问题:当Spotify关闭时,脚本会直接终止运行,导致Arduino上多数功能失效。我需要让脚本在不播放音乐时也能正常运行,不能因为Spotify的状态影响系统信息的持续传输。

报错信息

Traceback (most recent call last):
  File "C:\Users\horvik\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
  File "C:\Users\horvik\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "C:\Users\horvik\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\horvik\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\horvik\Desktop\project.py", line 62, in <module>
    serialDataToEncode = finishcpu + finishmem + get_current_track(ACCESS_TOKEN)
  File "C:\Users\horvik\Desktop\Deskcompanionv1.py", line 25, in get_current_track
    json_resp = response.json()
  File "C:\Users\horvik\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

原代码

import psutil
import serial
import requests
import time
from pprint import pprint


SPOTIFY_GET_CURRENT_TRACK_URL = 'https://api.spotify.com/v1/me/player/currently-playing'
ACCESS_TOKEN = 'i use token'

serial = serial.Serial()
serial.baudrate = 9600
serial.port = "COM5"
serial.open()

# spotify section

def get_current_track(access_token):
    response = requests.get(
        SPOTIFY_GET_CURRENT_TRACK_URL,
        headers={
            "Authorization": f"Bearer {access_token}"
        }
    )
    json_resp = response.json()

    if json_resp['is_playing'] == True :

        track_name = json_resp['item']['name']
        artists = [artist for artist in json_resp['item']['artists']]
        artist_names = ', '.join([artist['name'] for artist in artists])
        
        spotifytracksplaying = track_name + " By " + artist_names

    else :
        spotifytracksplaying = "you are not lisenting music"


    return spotifytracksplaying

while(1):
    # cpu and ram usage section
    cpu = psutil.cpu_percent(interval=1.2)
    mem = psutil.virtual_memory().percent

    if cpu < 10:
        finishcpu = "  " + str(cpu)
    elif cpu < 100:
        finishcpu = " " + str(cpu)
    else:
        finishcpu = str(cpu)

    if mem < 10:
        finishmem = "  " + str(mem)
    elif mem < 100:
        finishmem = " " + str(mem)
    else:
        finishmem = str(mem)

    # sending information
    serialDataToEncode = finishcpu + finishmem + get_current_track(ACCESS_TOKEN)
    serialDatatosend = serialDataToEncode.encode("UTF-8")

    serial.write(serialDatatosend)

    # Debugging
    #print(serialDatatosend)
    ##print(get_current_track(ACCESS_TOKEN))

serial.close()

解决方案

问题出在Spotify关闭时,API请求返回的不是有效的JSON数据,导致response.json()抛出异常直接终止脚本。我们需要添加异常处理和状态码检查,确保即使Spotify未运行,脚本也能继续执行。

修改get_current_track函数

修改后的函数会先检查响应状态码,捕获JSON解析异常,同时处理is_playing和item不存在的情况:

def get_current_track(access_token):
    try:
        response = requests.get(
            SPOTIFY_GET_CURRENT_TRACK_URL,
            headers={
                "Authorization": f"Bearer {access_token}"
            }
        )
        # 检查状态码:200=成功,204=无内容(无播放),401=token过期/无效
        if response.status_code == 204:
            return "No music playing"
        elif response.status_code != 200:
            return f"Spotify API Error: {response.status_code}"
        
        json_resp = response.json()
        
        # 检查是否在播放,以及是否存在歌曲信息
        if not json_resp.get('is_playing') or not json_resp.get('item'):
            return "No music playing"
        
        track_name = json_resp['item']['name']
        artists = [artist for artist in json_resp['item']['artists']]
        artist_names = ', '.join([artist['name'] for artist in artists])
        
        return f"{track_name} By {artist_names}"
    
    except requests.exceptions.JSONDecodeError:
        # 解析JSON失败时返回提示
        return "Spotify not running"
    except Exception as e:
        # 捕获其他未知异常,避免脚本崩溃
        return f"Error: {str(e)}"

完整修改后的代码

import psutil
import serial
import requests
import time
from pprint import pprint


SPOTIFY_GET_CURRENT_TRACK_URL = 'https://api.spotify.com/v1/me/player/currently-playing'
ACCESS_TOKEN = 'i use token'

serial = serial.Serial()
serial.baudrate = 9600
serial.port = "COM5"
serial.open()

# spotify section

def get_current_track(access_token):
    try:
        response = requests.get(
            SPOTIFY_GET_CURRENT_TRACK_URL,
            headers={
                "Authorization": f"Bearer {access_token}"
            }
        )
        # 检查状态码:200=成功,204=无内容(无播放),401=token过期/无效
        if response.status_code == 204:
            return "No music playing"
        elif response.status_code != 200:
            return f"Spotify API Error: {response.status_code}"
        
        json_resp = response.json()
        
        # 检查是否在播放,以及是否存在歌曲信息
        if not json_resp.get('is_playing') or not json_resp.get('item'):
            return "No music playing"
        
        track_name = json_resp['item']['name']
        artists = [artist for artist in json_resp['item']['artists']]
        artist_names = ', '.join([artist['name'] for artist in artists])
        
        return f"{track_name} By {artist_names}"
    
    except requests.exceptions.JSONDecodeError:
        # 解析JSON失败时返回提示
        return "Spotify not running"
    except Exception as e:
        # 捕获其他未知异常,避免脚本崩溃
        return f"Error: {str(e)}"

while(1):
    # cpu and ram usage section
    cpu = psutil.cpu_percent(interval=1.2)
    mem = psutil.virtual_memory().percent

    if cpu < 10:
        finishcpu = "  " + str(cpu)
    elif cpu < 100:
        finishcpu = " " + str(cpu)
    else:
        finishcpu = str(cpu)

    if mem < 10:
        finishmem = "  " + str(mem)
    elif mem < 100:
        finishmem = " " + str(mem)
    else:
        finishmem = str(mem)

    # sending information
    serialDataToEncode = finishcpu + finishmem + get_current_track(ACCESS_TOKEN)
    serialDatatosend = serialDataToEncode.encode("UTF-8")

    serial.write(serialDatatosend)

    # Debugging
    #print(serialDatatosend)
    ##print(get_current_track(ACCESS_TOKEN))

serial.close()

关键改进点

  • 用try-except块包裹API请求和JSON解析逻辑,捕获JSONDecodeError和其他异常,避免脚本崩溃
  • 检查API响应的状态码:204表示无播放内容,非200状态码返回错误提示
  • 使用json_resp.get()方法安全检查字段,避免因键不存在抛出KeyError
  • 所有异常情况都返回友好提示,脚本可以继续运行,保证CPU和内存信息持续传输到Arduino

内容的提问来源于stack exchange,提问作者horvik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:00:55