虾米网320kbps音乐分享测试

这篇文章的内容主要是对虾米网的320kbps在线试听音乐做一些测试, 以确认能否让普通用户也下载到VIP试听的音乐.

点击进入测试页(使用Chrome打开, 正常情况下能够听到absorb演唱的《桜ノ雨》)

这次的原理一如既往的简单, 我用PHPRPC 3.0写了一个Web Service作为API接口, 通过这个接口可以让客户端间接地得到320kbps音乐的下载地址, 也就是m3.file.xiami.com这个服务器上的文件动态地址.

这次测试用到了PHPRPC 3.0的PHP库和JS库, 以及两个文件:

test.html

<!DOCTYPE html>  
<html>  
<head>  
<script type="text/javascript" src="phprpc_client.js"></script>  
</head>  
<body>  
<audio id="audio" src="" type="audio/mpeg" controls="controls"></audio>  
<script>  
var client=new PHPRPC_Client('http://blackglory.uhosti.com/server.php',['getUrl']);  
client.getUrl('1769402975',function(result, args, output, warning){  
        if(isNaN(result)){
                var audio=document.getElementById('audio');
                audio.src=result;
                audio.play();
        }else{
                console.error(result);
        }
});
</script>  
</body>  
</html>  

server.php

<?php  
include('phprpc/phprpc_server.php');

function getLocation($str){  
        try{
                $a1=(int)$str{0};
                $a2=substr($str, 1);
                $a3=floor(strlen($a2) / $a1);
                $a4=strlen($a2) % $a1;
                $a5=array();
                $a6=0;
                $a7='';
                $a8='';
                for(;$a6 < $a4; ++$a6){
                        $a5[$a6]=substr($a2, ($a3 + 1) * $a6, ($a3 + 1));
                }
                for(;$a6 < $a1; ++$a6){
                        $a5[$a6]=substr($a2, $a3 * ($a6 - $a4) + ($a3 + 1) * $a4, $a3);
                }
                for($i=0, $a5_0_length=strlen($a5[0]); $i < $a5_0_length; ++$i){
                        for($j=0, $a5_length=count($a5); $j < $a5_length; ++$j){
                                $a7.=$a5[$j]{$i};
                        }
                }
                $a7=urldecode($a7);
                for($i=0, $a7_length=strlen($a7); $i < $a7_length; ++$i){
                        $a8.=$a7{$i}==='^'?'0':$a7{$i};
                }
                return $a8;
        } catch(Exception $e){
                return false;
        }
}

function getUrl($sid){  
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'http://www.xiami.com/song/gethqsong/sid/'.$sid);
        curl_setopt($ch, CURLOPT_COOKIE, 'VIP的Cookie');
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1000*10);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result=curl_exec($ch);
        $err=curl_errno($ch);
        curl_close($ch);
        if($err){
                return $err;
        }else{
                return getLocation(json_decode($result)->{'location'});
        }
}
$server = new PHPRPC_Server();
$server->add('getUrl');
$server->start();
?>

目前得出的结论是这个方法可以, 但是还存在一些不稳定因素:

  • 虾米官方的API是否存在次数限制
  • 一个VIP帐号同时下载同一文件时是否存在数量限制

我对此的担心主要来自于虾米的高品质音乐服务器在某一次我调试XiamiThief的时候把我的帐号Ban了一个晚上, 如果出现这种问题势必会影响分享的效果.

如果该套技术确实可行, 而且虾米不调整相关策略, 那么应该会放在XiamiThief v0.5中进行首次公开测试.

PS: 刚刚发现一个问题, 不同IP登录时Cookie会重置, 如果让服务端自动登录, 也会影响我自己的使用体验, 也就是说我得专门准备一个帐号用来提供下载…

PS2: 不知道是免费空间不靠谱还是虾米的国外线路不靠谱, 总之现在接口报了了CURLECOULDNTRESOLVE_HOST错误, 暂时无法解决了. 刚刚更新的前端代码会输出错误码, 请在这个页面中对照查询.