URL功能详解

  1. 查询专辑列表 kw拼接搜索内容

https://www.ximalaya.com/revision/search/main?core=album&page=1&spellchecker=true&rows=20&condition=relation&device=iPhone&fq=&paidFilter=true&kw=

  1. 查询节目列表 albumId拼接接口1中的albumId

https://www.ximalaya.com/revision/album/v1/getTracksList?pageNum=1&pageSize=30&albumId=

  1. 查询节目详情 {{$timestamp}}内容为变量 当前时间戳,注意其他参数不要修改,如果修改会导致解密url失败 trackId为接口2中trackId

https://www.ximalaya.com/mobile-playpage/track/v3/baseInfo/{{$timestamp}}?device=web&trackQualityLevel=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 许可协议。转载请注明来自 烦恼的夏洛克
小虫子
喜欢就支持一下吧