使用Spotipy库上传Spotify播放列表图片时遇413及401错误求助
解决Spotipy上传播放列表封面时的413/401错误
问题核心说明
- 413错误是因为Base64编码后的图片数据体积超出Spotify API限制,点击错误链接返回的401属于正常现象——该链接未携带授权Token,和实际上传问题无关。
- 你的代码还存在Base64编码格式的小问题,同时需满足Spotify对封面图片的硬性要求。
修复方案
1. 先明确Spotify封面的硬性规则
- 格式必须是JPEG/PNG
- 最小尺寸640×640像素
- Base64编码后的数据不能超过256KB(原文件需控制在192KB以内,因为Base64会让体积增加约33%)
2. 修正Base64编码格式
base64.b64encode()返回的是bytes对象,而Spotipy的playlist_upload_cover_image方法要求传入UTF-8编码的字符串,需要添加解码步骤:
image_64_encode = base64.b64encode(image_read).decode('utf-8')
3. 压缩图片到符合大小限制
可以用Python的PIL库自动压缩图片,确保体积达标:
from PIL import Image import os def compress_image(input_path, output_path, target_size_kb=190): img = Image.open(input_path) # 确保图片不低于最小尺寸 if img.width < 640 or img.height < 640: img = img.resize((640, 640), Image.Resampling.LANCZOS) # 逐步降低质量直到符合大小要求 quality = 90 while True: img.save(output_path, 'JPEG', quality=quality) file_size = os.path.getsize(output_path) if file_size <= target_size_kb * 1024 or quality <= 10: break quality -= 5
4. 完整修复后的代码
import spotipy from spotipy.oauth2 import SpotifyOAuth import base64 import os from PIL import Image playlist_id = "P1a6gzPL0Xg51or8rfirrsr19f6Pi1e4cfzX101fcf" def compress_image(input_path, output_path, target_size_kb=190): img = Image.open(input_path) if img.width < 640 or img.height < 640: img = img.resize((640, 640), Image.Resampling.LANCZOS) quality = 90 while True: img.save(output_path, 'JPEG', quality=quality) file_size = os.path.getsize(output_path) if file_size <= target_size_kb * 1024 or quality <= 10: break quality -= 5 print(f"压缩后图片大小: {file_size/1024:.2f}KB") def change_playlist_cover_image(): cv = spotipy.Spotify(auth_manager=SpotifyOAuth( client_id="7122ce01c646449565965a18c4597779", client_secret="7f8bcfd7b7e5310bbcc5706b634f4c37", redirect_uri="http://127.0.0.1:9090", scope="ugc-image-upload playlist-modify-public playlist-modify-private" )) # 先压缩图片 compress_image('lilmini.jpg', 'compressed_cover.jpg') # 读取并编码图片 with open('compressed_cover.jpg', 'rb') as image: image_read = image.read() image_64_encode = base64.b64encode(image_read).decode('utf-8') cv.playlist_upload_cover_image(playlist_id, image_64_encode) print("封面上传成功") change_playlist_cover_image()
额外注意点
- 授权Scope要加上
playlist-modify-public或playlist-modify-private(根据你的播放列表权限),避免权限不足错误 - 测试时可以先用一张明确符合要求的小图(比如640×640、100KB以内的JPEG)验证代码逻辑
内容的提问来源于stack exchange,提问作者iamnotacoder33
相关产品推荐
相关产品推荐

