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

请求协助:通过Java程序控制Spotify桌面客户端实现播放等功能

用Java控制Spotify桌面客户端的完整实现方案

嘿,这个需求我之前折腾过,完全可以实现!要做类似Echo那样控制Spotify桌面端的功能,最靠谱的方式是用Spotify官方的Web API(专门的远程控制模块),它能完美支持播放指定歌曲、切歌、播放暂停这些操作。下面我给你一步步拆解:

1. 先搞定开发者账号和应用配置

首先得去Spotify开发者平台注册个账号,创建一个新应用。然后记好这三个关键信息:

  • Client ID和Client Secret(在应用详情页里能找到)
  • 给应用加一个本地回调URI,比如http://localhost:8080/callback(后面授权要用,必须和代码里的一致)

2. 引入依赖(Maven为例)

直接用第三方封装好的Spotify Java SDK,省得自己写复杂的HTTP请求:

<dependency>
    <groupId>se.michaelthelin.spotify</groupId>
    <artifactId>spotify-web-api-java</artifactId>
    <version>8.0.0</version>
</dependency>

3. 授权:获取控制桌面端的权限

要控制本地Spotify,必须拿到user-modify-playback-state和user-read-playback-state这些权限。这里用Authorization Code Flow来获取令牌,代码大概是这样:

import se.michaelthelin.spotify.SpotifyApi;
import se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials;
import se.michaelthelin.spotify.requests.authorization.authorization_code.AuthorizationCodeRequest;
import se.michaelthelin.spotify.requests.authorization.authorization_code.AuthorizationCodeUriRequest;

import java.net.URI;

public class SpotifyAuthHelper {
    private static final String CLIENT_ID = "你的Client ID";
    private static final String CLIENT_SECRET = "你的Client Secret";
    private static final String REDIRECT_URI = "http://localhost:8080/callback";

    public static SpotifyApi getAuthorizedApi() {
        SpotifyApi spotifyApi = new SpotifyApi.Builder()
                .setClientId(CLIENT_ID)
                .setClientSecret(CLIENT_SECRET)
                .setRedirectUri(URI.create(REDIRECT_URI))
                .build();

        // 生成授权链接,包含需要的权限
        AuthorizationCodeUriRequest authUriRequest = spotifyApi.authorizationCodeUri()
                .scope("user-modify-playback-state,user-read-playback-state,user-read-currently-playing")
                .build();
        URI authUri = authUriRequest.execute();
        System.out.println("请打开这个链接授权(要登录和应用同账号的Spotify):" + authUri);

        // 这里你可以手动复制回调地址里的code参数,或者搭个简单的本地HTTP服务自动接收
        String authCode = "你从回调里拿到的code";

        // 用code换访问令牌
        AuthorizationCodeRequest codeRequest = spotifyApi.authorizationCode(authCode).build();
        try {
            AuthorizationCodeCredentials credentials = codeRequest.execute();
            spotifyApi.setAccessToken(credentials.getAccessToken());
            spotifyApi.setRefreshToken(credentials.getRefreshToken());
            return spotifyApi;
        } catch (Exception e) {
            System.err.println("授权失败:" + e.getMessage());
            return null;
        }
    }
}

小提醒:授权的时候一定要确保你的Spotify桌面客户端已经登录,而且和开发者应用用的是同一个账号,不然控制不了哦。

4. 核心功能实现

拿到授权后的SpotifyApi实例,就可以写各种控制方法了:

4.1 播放指定歌曲

先搜索歌曲拿到URI,再调用播放接口:

import se.michaelthelin.spotify.model_objects.specification.Track;
import se.michaelthelin.spotify.requests.data.search.simplified.SearchTracksRequest;

public void playSpecificSong(String songName, SpotifyApi spotifyApi) {
    if (spotifyApi == null) {
        System.err.println("还没授权呢!");
        return;
    }

    try {
        // 搜索歌曲,只取第一个结果
        SearchTracksRequest searchRequest = spotifyApi.searchTracks(songName)
                .limit(1)
                .build();
        Track[] tracks = searchRequest.execute().getItems();

        if (tracks.length == 0) {
            System.out.println("没找到这首歌:" + songName);
            return;
        }

        String trackUri = tracks[0].getUri();
        // 触发播放
        spotifyApi.startResumePlayback()
                .uris(new String[]{trackUri})
                .build()
                .execute();

        System.out.println("正在播放:" + tracks[0].getName() + " - " + tracks[0].getArtists()[0].getName());
    } catch (Exception e) {
        System.err.println("播放失败:" + e.getMessage());
    }
}

4.2 播放/暂停切换

先获取当前播放状态,再决定是暂停还是继续:

public void togglePlayPause(SpotifyApi spotifyApi) {
    if (spotifyApi == null) return;

    try {
        var currentPlayback = spotifyApi.getUsersCurrentPlayback().build().execute();
        if (currentPlayback != null && currentPlayback.getIsPlaying()) {
            spotifyApi.pausePlayback().build().execute();
            System.out.println("已暂停播放");
        } else {
            spotifyApi.startResumePlayback().build().execute();
            System.out.println("已继续播放");
        }
    } catch (Exception e) {
        System.err.println("切换播放状态失败:" + e.getMessage());
    }
}

4.3 切换上一首/下一首

这个就简单了,直接调用API就行:

// 切下一首
public void skipToNext(SpotifyApi spotifyApi) {
    if (spotifyApi == null) return;
    try {
        spotifyApi.skipUsersPlaybackToNextTrack().build().execute();
        System.out.println("已切换到下一首");
    } catch (Exception e) {
        System.err.println("切下一首失败:" + e.getMessage());
    }
}

// 切上一首
public void skipToPrevious(SpotifyApi spotifyApi) {
    if (spotifyApi == null) return;
    try {
        spotifyApi.skipUsersPlaybackToPreviousTrack().build().execute();
        System.out.println("已切换到上一首");
    } catch (Exception e) {
        System.err.println("切上一首失败:" + e.getMessage());
    }
}

5. 额外小贴士

  • 访问令牌会过期,记得用刷新令牌自动更新,不然过段时间就控制不了了,SDK里有现成的方法可以实现。
  • 如果你的机器人是语音触发的,只需要把语音识别后的指令映射到这些方法就行,比如识别到“在Spotify上播放晴天”就调用playSpecificSong("晴天", api)。
  • 测试的时候一定要确保Spotify桌面客户端是运行状态,后台也行,只要登录了授权账号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:08:27