酷狗接口api记录

1、歌名、歌手搜索接口:

http://songsearch.kugou.com/song_search_v2?keyword=歌曲名称&page=1&pagesize=1&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0

或者:

http://mobilecdn.kugou.com/api/v3/search/song?format=json&keyword=歌曲名称&page=1&pagesize=20&showtype=1

2、歌曲具体信息接口(包括播放地址)

http://www.kugou.com/yy/index.php?r=play/getdata&hash=搜索获得的很长的Filehash值&album_id=搜索数据获得的albumId值&_=1497972864535

这个接口之前一直没问题,后来就错误编码20010了。经研究,只要在header中添加一个cookie即可:

key:Cookie

value:kg_mid=任意值

理论上是任意值都可以,但是貌似会有个时效性,所以我们还是根据官方js中的逻辑来给他一个值,官方js中是生成一个长度为4的随机字符串,然后再通过MD5加密而得。所以我们java代码可以这么给:

首先是生成四位数的随机字符串:

/**
 * 生成随机数字和字母,
 */
public String getStringRandom(int length) {

    String val = "";
    Random random = new Random();

    //参数length,表示生成几位随机数
    for(int i = 0; i < length; i++) {

        String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
        //输出字母还是数字
        if( "char".equalsIgnoreCase(charOrNum) ) {
            //输出是大写字母还是小写字母
            int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
            val += (char)(random.nextInt(26) + temp);
        } else if( "num".equalsIgnoreCase(charOrNum) ) {
            val += String.valueOf(random.nextInt(10));
        }
    }
    return val;
}

然后是MD5加密:

   /**
     * 32位MD5加密
     * @param content -- 待加密内容
     * @return
     */
    public String md5Decode(String content) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(content.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("NoSuchAlgorithmException",e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("UnsupportedEncodingException", e);
        }
        //对生成的16字节数组进行补零操作
        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10){
                hex.append("0");
            }
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return hex.toString();
    }

 然后就是给kg_mid赋值:

return "kg_mid="+md5Decode(getStringRandom(4));

然后就可以拿到返回的json中play_url值,有值就是播放链接,没有就是没有版权或者VIP都需要付费的那种,也就是一下这种情况(理论上只要网页端能听的就能获取得到这个值):

有些会员歌曲客户端只能60秒的试听,这个不支持。有知道的大佬也可以评论分享一下。

酷狗接口api记录_第1张图片

你可能感兴趣的:(Android)