安卓逆向-KG音樂2021最新版下載介面分析
阿新 • • 發佈:2021-02-08
安卓逆向-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。
歡迎關注微信公眾號:從來不想