1. 程式人生 > 其它 >安卓逆向-KG音樂2021最新版下載介面分析

安卓逆向-KG音樂2021最新版下載介面分析

技術標籤:安卓Java原始碼java安卓

安卓逆向-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。

歡迎關注微信公眾號:從來不想

在這裡插入圖片描述