获取喜马音频
URL功能详解
- 查询专辑列表 kw拼接搜索内容
- 查询节目列表 albumId拼接接口1中的albumId
https://www.ximalaya.com/revision/album/v1/getTracksList?pageNum=1&pageSize=30&albumId=
- 查询节目详情 {{$timestamp}}内容为变量 当前时间戳,注意其他参数不要修改,如果修改会导致解密url失败 trackId为接口2中trackId
解密URL功能
接口3中返回列表中有5种类型的音乐输出格式:M4A_64、MP3_64、M4A_24、MP3_32、AAC_24
/**
* 解密喜马拉雅 url base64 + AES盐
*
* @param ciphertext 密文
* @return {@link String}
* @throws Exception 例外
*/
public static String decrypt(String ciphertext) throws Exception {
// 将十六进制密钥转换为字节数组(该值写死的哦~)
byte[] keyBytes = hexStringToByteArray("aaad3e4fd540b0f79dca95606e72bf93");
// 使用AES算法创建密钥规范
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
// 创建AES解密实例
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// 初始化为解密模式,并传入密钥
cipher.init(Cipher.DECRYPT_MODE, keySpec);
// Base64解码密文
byte[] ciphertextBytes = Base64.getUrlDecoder().decode(ciphertext);
// 执行解密操作
byte[] plaintextBytes = cipher.doFinal(ciphertextBytes);
// 将解密后的字节数组转换为字符串
return new String(plaintextBytes, StandardCharsets.UTF_8).trim();
}
/**
* 将十六进制字符串转换为字节数组
*
* @param hexString 十六进制字符串
* @return {@link byte[]}
*/
public static byte[] hexStringToByteArray(String hexString) {
int len = hexString.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
+ Character.digit(hexString.charAt(i + 1), 16));
}
return data;
}
/**
* 搜索专辑列表
*
* @param searchName 搜索名称
* @return {@link XiMaLaYaSearchAlbumListPO}
*/
public static List<XiMaLaYaSearchAlbumListPO> searchAlbumList(String searchName) {
String url = XIMALAYA_SEARCH_ALBUM_LIST_URL + searchName;
String response = HttpUtil.get(url);
JSONObject jsonObject = JSONUtil.parseObj(response);
JSONArray docsArray = jsonObject.getJSONObject("data").getJSONObject("album").getJSONArray("docs");
return docsArray.toList(XiMaLaYaSearchAlbumListPO.class);
}
/**
* 获取曲目列表
*
* @param albumId 专辑 ID
* @return {@link XiMaLaYaSearchAlbumListPO}
*/
public static XiMaLaYaSearchTracksListPO searchTracksList(Long albumId) {
String url = XIMALAYA_SEARCH_TRACKS_LIST_URL + albumId;
String response = HttpUtil.get(url);
JSONObject jsonObject = JSONUtil.parseObj(response);
JSONObject data = jsonObject.getJSONObject("data");
return JSONUtil.toBean(data, XiMaLaYaSearchTracksListPO.class);
}
/**
* 获取曲目信息
*
* @param trackId 轨道 ID
* @return {@link SendMusicPO}
*/
public static SendMusicPO getTracksInfo(Long trackId) {
String url = "https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/" + System.currentTimeMillis() + "?device=web&trackQualityLevel=2&trackId=" + trackId;
String response = HttpUtil.get(url);
XiMaLaYaTracksUrlPO xiMaLaYaTracksUrl = JSONUtil.toBean(response, JSONConfig.create().setIgnoreError(true), XiMaLaYaTracksUrlPO.class);
XiMaLaYaTracksUrlPO.TrackInfoDTO trackInfo = xiMaLaYaTracksUrl.getTrackInfo();
List<XiMaLaYaTracksUrlPO.TrackInfoDTO.PlayUrlListDTO> playUrlList = trackInfo.getPlayUrlList();
String mp364Url = playUrlList.stream().filter(item -> item.getType().equals("MP3_64")).map(XiMaLaYaTracksUrlPO.TrackInfoDTO.PlayUrlListDTO::getUrl).findAny().get();
try {
mp364Url = decrypt(mp364Url);
} catch (Exception e) {
e.printStackTrace();
}
SendMusicPO sendMusicPO = new SendMusicPO();
sendMusicPO.setUrl(mp364Url);
sendMusicPO.setNickname(trackInfo.getNickname());
sendMusicPO.setHeadImage(trackInfo.getCoverMiddle());
sendMusicPO.setTitle(trackInfo.getTitle());
return sendMusicPO;
}
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
烦恼的夏洛克!
喜欢就支持一下吧