请求协助:通过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
相关产品推荐
相关产品推荐

