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
相关产品推荐
相关产品推荐

