网易云音乐是个好东西,何奈有些歌曲不能下载,怎么破呢?在我研究了一周后,终于找到了一个实用方法。

以歌曲[Animals]为例,在网易云音乐的搜索页面中,地址如下:

http://music.163.com/#/song?id=28987626

这里的 28987626 就是歌曲编号

http://music.163.com/#/song?id=歌曲编号

经过分析,在下面这个页面中可以直接找到歌曲的下载地址:

http://music.163.com/api/song/detail/?id=28987626&ids=%5B28987626%5D

http://music.163.com/api/song/detail/?id=歌曲编号&ids=%5B歌曲编号%5D

上述页面里包含真实下载地址:

http://m2.music.126.net/NYq7If0Alf1wH0b81vrEpw==/6668538022514769.mp3

但我还是想让自己更方便使用,于是我打算接着抓出这个下载地址了,也不难,就是正则表达式匹配一下,当然我对正则表达式不够熟练,匹配前几次都多匹配了其他的链接,所以最后用了一个很傻的表达式 http://m(.*?).mp3,不过总算是匹配出来了。然后做了个PHP:

<?php
/**
  * 网易云音乐下载地址解析
  * @author ByteCat
  */
  
  $sid = 0;
function getWangyiyunMusic($sid){
    $ch = curl_init();
    $srcURL = 'http://music.163.com/api/song/detail/?id=' . $sid . '&ids=%5B' . $sid . '%5D';
    curl_setopt($ch, CURLOPT_URL, $srcURL);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0'
    ));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $re = curl_exec($ch);
    curl_close($ch);
    //print_r($re);
    $regexp = "/(http:\/\/m(.*?).mp3)/i";
    preg_match($regexp, $re, $realURL);
    //print_r($realURL);
    return $realURL[0];
}

$sid = $_GET['id'];
if($sid != 0){
    header('HTTP/1.1 301 Moved Permanently');
    header('User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0'); 
    //不知道有没有用……
    header('Referer: http://music.163.com/'); 
    header('Content-type: application/octet-stream'); 
    header('Location: '.getWangyiyunMusic($sid));
    exit; 
}  

?>

使用方法:将以上代码保存为 index.php 文件(当然也可以是其他文件名),然后直接访问文件地址,比如

http://www.example.net/netease_music_downloader/index.php

手动获取了歌曲的 id 之后(如:28987626 ),用下面的方式即可:

http://www.example.net/index.php?id=28987626

或者简单一点

http://www.example.net/?id=28987626