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

如何用Python作为Spotify播放设备播放完整曲目并适配Discord Bot?

解决方案:Spotify API 无活跃设备错误修复

错误原因

Spotify 的 start_playback API 无法直接让 Python 作为播放设备,它只能控制已登录且处于活跃状态的 Spotify 客户端设备(如桌面客户端、手机APP、网页端)。你的代码跳过了设备选择环节,且未检查可用设备,导致报错。

修复步骤及优化代码

1. 预检查可用设备

调用 sp.devices() 获取当前登录的设备列表,选择一个活跃设备传入播放接口。如果无可用设备,向用户发送提示。

2. 优化异步逻辑

Discord.py 是异步框架,禁止用 time.sleep() 阻塞事件循环,改用 asyncio.sleep()。同时不要每次循环都创建 Spotipy 实例,避免重复授权。

3. 修正后的完整代码示例

import asyncio
import spotipy
from spotipy.oauth2 import SpotifyOAuth
import discord
from discord.ext import commands

# 全局初始化Spotipy实例,避免重复授权
sp = spotipy.Spotify(
    auth_manager=SpotifyOAuth(
        client_id="MyID",
        client_secret="MySecret",
        redirect_uri="https://google.com",    
        scope="user-read-playback-state user-modify-playback-state",
        open_browser=False
    )
)

last_id = None

class SpotifyCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.command(name="track")
    async def track(self, ctx, tracked_user: discord.Member = None):
        global last_id
        if not tracked_user:
            await ctx.send("请指定要跟踪的用户!")
            return

        while True:
            await asyncio.sleep(1)
            # 刷新用户状态
            tracked_user = await ctx.guild.fetch_member(tracked_user.id)
            for activity in tracked_user.activities:
                if isinstance(activity, discord.Spotify):
                    if activity.track_id != last_id:
                        last_id = activity.track_id
                        print("Wee woo! New song tracked")
                        playback_uri = [f"spotify:track:{activity.track_id}"]

                        # 获取可用设备列表
                        devices = sp.devices()
                        if not devices["devices"]:
                            await ctx.send("未检测到活跃的Spotify设备,请先打开任意Spotify客户端并登录!")
                            continue

                        # 选择第一个活跃设备(可根据需求修改,比如筛选设备名称)
                        target_device_id = devices["devices"][0]["id"]
                        try:
                            sp.start_playback(uris=playback_uri, device_id=target_device_id)
                        except spotipy.SpotifyException as e:
                            await ctx.send(f"播放失败:{e}")
                    else:
                        print("still the same old song")
            # 避免无Spotify活动时循环过快
            await asyncio.sleep(0.5)

# 注册Cog到Bot
# bot.add_cog(SpotifyCog(bot))

4. 额外注意事项

  • 确保你的Spotify账号已登录至少一个客户端(桌面/手机/网页),且该客户端处于活跃状态(不能是后台挂起太久的状态)。
  • 如果需要指定特定设备(比如只控制桌面客户端),可以通过筛选devices["devices"]中的name字段来选择目标设备ID。
  • 长期运行时,Spotipy的auth_manager会自动刷新token,无需手动处理过期问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:00:25