今天在博客园看到的,通过反编译播放器找到解码音乐资源的地址的算法。

算法这里就不多解释了,原文有分析,这里说一下获取“加密”地址的过程:

1.进入单首歌曲介绍页,比如 http://www.xiami.com/song/1768914936 ,地址后面的数字就是歌曲的 id

2.根据 id 找到包含歌曲相关信息的 xml 文件地址,例如 http://www.xiami.com/song/playlist/id/1768914936/object_name/default/object_id/0

3.载入 xml ,获取 location 节点的内容,就是“加密”的地址

第二步里把最后的 0 换成其他数字会得到不同的加密地址,但是解码后资源真实地址还是一样的。

原文是用 java 实现的,这里改成了 javascript,使用起来更方便~

function loadXMLDoc(dname) 
{
try //Internet Explorer
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
catch(e)
  {
  try //Firefox, Mozilla, Opera, etc.
    {
    xmlDoc=document.implementation.createDocument("","",null);
    }
  catch(e) {alert(e.message)}
  }
try 
  {
  xmlDoc.async=false;
  xmlDoc.load(dname);
  return(xmlDoc);
  }
catch(e) {alert(e.message)}
return(null);
}
//获取歌曲 id
var patt1=new RegExp("[0-9].*");
var songId=patt1.exec(location.href);
//载入 xml
var xmlDoc=loadXMLDoc("http://www.xiami.com/song/playlist/id/"+songId+"/object_name/default/object_id/0");
//解码地址
function getLocation(xlocation){
        var _local10;
        var _local2 = parseInt(xlocation.substring(0, 1));
        var _local3 = xlocation.substring(1, xlocation.length);
        var _local4 = Math.floor(_local3.length / _local2);
        var _local5 = _local3.length % _local2;
        var _local6 = new Array();
    _local6.length = _local2;
        var _local7 = 0;
        while (_local7 < _local5) {
            if (_local6[_local7] == null) {
                _local6[_local7] = "";
            }
            _local6[_local7] = _local3.substring((( _local4 + 1) * _local7),
                    (( _local4 + 1) * _local7) + ( _local4 + 1));
            _local7++;
        }
        _local7 = _local5;
        while (_local7 < _local2) {
            _local6[_local7] = _local3.substring((( _local4 * (_local7 - _local5)) + (( _local4 + 1) * _local5)),(( _local4 * (_local7 - _local5)) + ((_local4 + 1) * _local5))+ _local4);
            _local7++;
        }
        var _local8 = "";
        _local7 = 0;
        while (_local7 < ( _local6[0]).length) {
            _local10 = 0;
            while (_local10 = _local6[_local10].length) {
                    break;
                }
                _local8 = (_local8 + _local6[_local10].charAt(_local7));
                _local10++;
            }
            _local7++;
        }
        _local8 = decodeURIComponent(_local8);
        var _local9 = "";
        _local7 = 0;
        while (_local7 < _local8.length) {
            if (_local8.charAt(_local7) == '^'){
                _local9 = (_local9 + "0");
            } else {
                _local9 = (_local9 + _local8.charAt(_local7));
            };
            _local7++;
        }
        _local9 = _local9.replace("+", " ");
        alert( _local9);
    }
getLocation(xmlDoc.getElementsByTagName("location")[0].textContent);

实际上无论是否登录在虾米音乐网站上下载的都是低码率的音乐,如果要高码率的话只能用虾歌哦。

标签: