You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何精准获取Spotify播放窗口的歌曲信息并优化窗口识别方案?

如何精准获取Spotify播放窗口的歌曲信息并优化窗口识别方案?

兄弟,我太懂你这种跟所有窗口死磕、靠模糊规则筛结果的痛苦了——不仅容易误判其他带“-”的窗口,逻辑绕来绕去还不稳。其实要精准拿到Spotify的播放信息,根本不用这么麻烦,有两个更靠谱的方向,给你捋捋:

一、先优化窗口识别:直接锁定Spotify窗口,不用遍历所有

你的原思路是“遍历所有窗口→找带‘-’的→排除已知程序”,本质是大海捞针。其实Spotify的窗口有固定的标识,我们可以直接定位它,完全不用管其他窗口:

比如在Windows上,Spotify的主窗口类名是SpotifyMainWindow,我们可以用专门的窗口操作库直接找到它,再提取标题。优化后的代码大概是这样:

import win32gui
import time
import os

def get_spotify_playing_info():
    # 直接通过类名定位Spotify主窗口
    spotify_hwnd = win32gui.FindWindow("SpotifyMainWindow", None)
    if not spotify_hwnd:
        return None
    
    window_title = win32gui.GetWindowText(spotify_hwnd)
    # 播放时标题格式是「艺术家 - 歌曲名」,暂停/未播放时是「Spotify」
    if " - " in window_title and window_title != "Spotify":
        return window_title.split(" - ", 1)  # 防止歌曲名里带「-」
    return None

while True:
    song_info = get_spotify_playing_info()
    if song_info:
        artist, song_name = song_info
        print(f"正在播放:{artist.strip()} - {song_name.strip()}")
    else:
        print("Spotify未运行或未播放歌曲")
    
    time.sleep(1)
    os.system('cls' if os.name == 'nt' else 'clear')

这个思路的好处是:

  • 完全不会误判其他窗口,因为我们只盯Spotify的窗口
  • 不用维护复杂的排除列表,逻辑简单直接
  • 比遍历所有窗口效率高得多

如果是Mac或者Linux平台,Spotify的窗口类名是com.spotify.client,可以用PyQt的QApplication来跨平台定位窗口,逻辑是一样的——先找对目标窗口,再拿标题。

二、终极方案:直接调用Spotify本地API,完全脱离窗口限制

其实还有个更靠谱的方法:Spotify桌面客户端默认开启了本地Web API(端口4381),我们可以直接向这个本地接口发送请求,拿到最精准的播放信息,完全不用管窗口状态(哪怕Spotify最小化到托盘、甚至隐藏窗口都能拿到)。

代码大概是这样(需要先装requests库:pip install requests):

import requests
import time
import os

def get_spotify_playback_status():
    try:
        # 向Spotify本地API发送请求
        resp = requests.get(
            "http://localhost:4381/remote/status",
            params={"oauth": "1", "csrf": "1"}
        )
        playback_data = resp.json()
        
        if not playback_data.get("playing"):
            return None
        
        # 直接从返回数据里提取艺术家和歌曲名
        track = playback_data["track"]
        artist = track["artist_resource"]["name"]
        song_name = track["name"]
        return (artist, song_name)
    except:
        # 处理Spotify未运行、API未开启的情况
        return None

while True:
    playback_info = get_spotify_playback_status()
    if playback_info:
        artist, song = playback_info
        print(f"正在播放:{artist} - {song}")
    else:
        print("Spotify未运行或未播放歌曲")
    
    time.sleep(1)
    os.system('cls' if os.name == 'nt' else 'clear')

这个方法的优势是:

  • 100%精准,完全不会受窗口标题的任何影响
  • 能拿到更多信息,比如专辑名、播放进度、是否 shuffle 等等
  • 不管Spotify是在前台、后台还是托盘,都能正常获取数据

最后说下你原代码的小问题

你的排除列表里加了Spotify,但其实播放时的窗口标题里根本没有这个词,所以不会被排除;但反过来,如果有其他程序的窗口标题是「XX - YY」且不含你ignore里的关键词(比如某个文档叫「旅行计划 - 草稿」),就会被误判。核心问题是你在“过滤所有窗口”,而不是“直接锁定目标窗口”——换个思路,效率和精准度都会上来。

如果只是想快速优化现有代码,用第一种方法就行;如果想要长期稳定的方案,第二种本地API的方式是首选~

火山引擎 最新活动