安卓逆向-KG音乐2021最新版下载接口分析

安卓逆向-KG音乐2021最新版下载API分析

安卓逆向-KG音乐最新版API

吐槽一下,相对于其他几个大型音乐平台讲,KG音乐的API设计非常糟糕。。。。

网上已经有很多KG音乐下载接口的分析,但KG音乐近来对原有的方式做了更改,增加了一个请求参数signature,导致之前的获取方式失效了。经过逆向分析后发现,signature也是使用了MD5加密,是将除了signature外所有的请求参数与APPKEY拼接后的MD5值。

除了KG概念版可以免费听的VIP资源外(比如周董的歌),KG音乐的所有VIP资源已不存在不需要VIP用户账户信息的接口。只能获取免费资源。如果想要获取,请配置VIP用户的token和userid,这两个参数可以通过抓包找到。

Java代码实现

下面是无名音乐里面的一段实现代码,为了隐私,隐去了token和userid,大家可自行配置。

	//KG通过hash值定位资源
    public static String downloadRequest(String hash){
        String dfid="-";
        String pid="2";
        String mid="0";
        String cmd="26";
        String clienttime=Long.valueOf(System.currentTimeMillis() / 1000)+"";

        String uuid="0";
        String area_code="1";//1代表中国地区,如果IP为海外或者港澳台,需要加上这个参数
        String behavior="play";//需要配置为play,不消耗下载次数。如果配置为download,则会消耗下载次数。
        String appid="1005";
        String module="";
        String vipType="6";
        String ptype="0";
        String userid="";//请自行抓包获取
        String token="";//自行抓包获取
        String mtype="2";
        String album_id="2900867";
        String pidversion="3001";//用jadx反编译apk后,可以在res目录下找到一个配置文件,里面存储了这个值
        String pidVersionSecret="57ae12eb6890223e355ccfcb74edf70d";//用jadx反编译apk后,可以在res目录下找到一个配置文件,里面存储了这个值
        String clientver="10479";
        String version="10479";
        String album_audio_id="album_audio_id";

        Map<String,Object> map=new HashMap<>();
        map.put("dfid", dfid);
        map.put("hash",hash);
        map.put("mtype",mtype);
        map.put("album_id",album_id);
        map.put("album_audio_id",album_audio_id);
        map.put("module",module);
        map.put("behavior",behavior);
        map.put("cmd",cmd);

        map.put("uuid", uuid);
        map.put("clientver", clientver);
        map.put("clienttime", clienttime);

        map.put("pid",pid);
        map.put("appid", appid);
        map.put("mid", mid);
        map.put("version",version);
        map.put("token",token);

        map.put("vipType",vipType);
        map.put("userid",userid);
        map.put("area_code",area_code);
        map.put("dfid",dfid);
        map.put("ptype",ptype);
        map.put("pidversion",pidversion);
        map.put("key",Md5Encrypt.convertToMd5(hash+pidVersionSecret+appid+mid+userid));
        String appkey="OIlwieks28dk2k092lksi2UIkp";//用jadx反编译apk后,可以在res目录下找到一个配置文件,里面存储了这个值
        map.put("signature",getSignature(appkey,map));
        String reqLink="https://gateway.kugou.com/v3/url"+getGetRequestParams(map);//新版的API接口
        Map<String,String> headerMap=new HashMap<>();
        headerMap.put("x-router","tracker.kugou.com");//必须要有这个请求头
        String response=HttpRequestHelper.downloadWebSiteUseGet(reqLink,headerMap);
        if(response.contains("http:")&&response.contains("\"")){//为了方便起见,直接截取字符串,不解析json了。
            response=response.substring(response.indexOf("\"url\":[\"")+"\"url\":[\"".length());
            response=response.substring(0,response.indexOf("\"")).replaceAll("\\\\","");
        }else {
            response="";
        }
        return response;

    }

    private static String getGetRequestParams(Map<String,Object> map) {
        if (map == null || map.size() < 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append("?");
        Set<String> keySet = map.keySet();
        for (String str : keySet) {
            sb.append(str);
            sb.append("=");
            sb.append(map.get(str));
            sb.append("&");
        }
        sb.deleteCharAt(sb.length() - 1);
        return sb.toString();
    }

    private static String getSignature(String str, Map<String, Object> map) {
        if (map == null || map.size() < 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        Set<String> keySet = map.keySet();
        String[] strArr = keySet.toArray(new String[keySet.size()]);
        Arrays.sort(strArr, String::compareTo);
        for (String str3 : strArr) {
            sb.append(str3);
            sb.append("=");
            sb.append(map.get(str3));
        }
        return Md5Encrypt.convertToMd5(str + sb.toString() + str);
    }

后记

本文给出的代码基于2021年最新版的 KG音乐安卓版,版本号:10.4.8_10485。

欢迎关注微信公众号:从来不想

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值