idiotbaka

网易云音乐的常用API(搜索,歌词,mp3下载)
最近正好用到,记录一下。本文为一个流程,通过歌曲名,来下载歌曲以及歌词。如果你用Python等进行数据采集,记得添...
扫描右侧二维码阅读全文
10
2018/05

网易云音乐的常用API(搜索,歌词,mp3下载)

timg (2).jpeg
最近正好用到,记录一下。本文为一个流程,通过歌曲名,来下载歌曲以及歌词。
如果你用Python等进行数据采集,记得添加User-Agent,不然它会返回错误:Cheater。

搜索歌曲获取ID

URL:http://music.163.com/api/search/pc
提交方式:POST

参数
s:歌曲名
offset:偏移量
limit:获取歌曲数
type:类型(歌曲:1、专辑:10、歌手:100、歌单:1000、用户:1002、mv:1004)

例如,通过歌曲名抓取歌曲信息。

POST http://music.163.com/api/search/pc
BODY s:PAPISM offset:0 limit:1 type:1

返回JSON:

{
    "result": {
        "songs": [{
            "name": "PAPISM",
            "id": 34367845,
            "artists": [{
                "name": "小澤亜李",
                "id": 999479,
                "picId": 0,
                "img1v1Id": 0,
                "briefDesc": "",
                "picUrl": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
                "img1v1Url": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg",
                "albumSize": 0,
                "alias": [],
                "trans": "",
                "musicSize": 0
            }],
            "album": {
                "name": "モンスター娘のいる日常 キャラクターソング Vol.2",
                "id": 3279418,
                "type": "EP/Single",
                "size": 5,
                "picId": 7987951978099954,
                "blurPicUrl": "http://p1.music.126.net/SAsjIzWilXO4S2HWBGrfVw==/7987951978099954.jpg",
                "companyId": 0,
                "pic": 7987951978099954,
                "picUrl": "http://p1.music.126.net/SAsjIzWilXO4S2HWBGrfVw==/7987951978099954.jpg"
            },
            "mvid": 0,
            "rtype": 0,
            "rurl": null,
            "mp3Url": "http://m2.music.126.net/cl94aFtBzASxULxpDyv00Q==/7962663210671608.mp3"
        }],
        "songCount": 3
    },
    "code": 200
}

其中name是歌曲名,id是歌曲名对应的网易云音乐ID,http://music.163.com/#/song?id=34367845,可以直接访问听歌。
artists是歌手们的信息,id对应歌手id,picUrl是歌手头像图。
album是唱片信息,name是唱片名,blurPicUrl是唱片封面图,url后面添加?param=130y130参数可以获取130x130尺寸的图片,修改数字也可获取其他尺寸。
songs内最后一个字段存放了歌曲url,但是现在已经失效,不过现在还有其他很方便就能获取的办法。

通过这个API能获得歌曲ID,唱片图,唱片名,歌手和歌曲信息。

通过歌曲ID下载歌曲

通过这个的链接可以直接下载歌曲:

http://music.163.com/song/media/outer/url?id=34367845.mp3

此URL的HTTP头里添加了location跳转,会直接跳转到下载链接,链接不是固定的,获取方法也很简单,以Python为例:

import requests

url = 'http://music.163.com/song/media/outer/urlid=34367845.mp3'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36'}
location = requests.head(url, headers, allow_redirects=False).headers['location']
print location

执行后会输出下载链接,不过要注意的是,如果你使用国外的服务器,或身处国外,location会返回http://music.163.com/404,建议使用国内服务器,或者修改服务器hosts,或者使用国内服务器转发。
这个hosts目前还可正常使用。

158.69.209.100 music.163.com
14.215.100.225 m1.music.126.net
14.215.100.225 m2.music.126.net
14.215.100.225 m3.music.126.net
14.215.100.225 m4.music.126.net
14.215.100.225 m5.music.126.net
14.215.100.225 m6.music.126.net
14.215.100.225 m7.music.126.net
14.215.100.225 m8.music.126.net
14.215.100.225 m9.music.126.net
14.215.100.225 m10.music.126.net

linux的hosts文件在etc/hosts里,修改后重启networking服务即可生效。

通过歌曲ID下载歌词

URL:http://music.163.com/api/song/media
提交方式:GET
参数:id

例如,通过歌曲ID获取歌词json:

http://music.163.com/api/song/media?id=34367845

返回结果:

{
    "songStatus": 0,
    "lyricVersion": 2,
    "lyric": "[by:上划解锁]\n[ti:PAPISM]\r\n[ar:パピ(CV:小澤亜李)]……省略",
    "code": 200
}

lyricVersion是歌词版本号,lyric就是歌词了。如果歌曲没有歌词的话,也就没有lyric字段。
获取lyric字段内容,存储为.lrc文件即可,以python为例:

import urllib2
import requests
import json
import codecs

lrc_url = 'http://music.163.com/api/song/media?id=34367845'
lrc_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
lrc_req = urllib2.Request(url=lrc_url, headers=lrc_headers)

# 获取页面内容
html = urllib2.urlopen(lrc_req).read()

# 转为json
lrc_json_dict = json.loads(html)

# 如果有lyric字段,保存为.lrc文件
if 'lyric' in lrc_json_dict:
    file = codecs.open('/lrc_save_file/34367845.lrc', 'w', 'utf-8')
    file.write(lrc_json_dict['lyric'])
    file.close()

这样,通过一个歌曲名,获得歌曲ID,我们就可以得到歌曲的详细信息、下载歌曲、下载歌词、下载封面。
注意:本文仅供学习交流使用。

Last modification:March 20th, 2019 at 11:15 pm
本文采用 知识共享署名 4.0 国际许可协议进行许可
可自由转载、引用,但需署名作者且注明文章出处
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

13 comments

  1. Frostnova

    嗯...歌曲的图片是...总是指向默认图片的url...请问该怎么办呢?

  2. metooidk

    這怎麼辦啊
    {"code":-462,"data":{"actionCode":"1055401","verifyType":50,"verifyId":1008601,"verifyUrl":"","blockText":"绑定手机后,可进行下一步操作哦~","verifyToken":null,"btnText":"","orpheusUrl":"","frontRuleIds":[1055401],"params":{"event_id":"00270371329597075532","sign":""},"url":null},"message":"请绑定手机后再试哦~"} - Server - Script:8
    想在Roblox實現動態歌詞

    1. zeno
      @metooidk

      把浏览器访问成功的cookie放到请求头里。。。

  3. 小月月

    返回值是这个怎么办{"code":-460,"message":"网络太拥挤,请稍候再试!"}

  4. xaeHu

    部分下载链接还是报这个啊:https://music.163.com/#/404,不在国外啊

    1. idiotbaka
      @xaeHu

      已经两年啦,如果部分接口不好用 估计就是失效了。可以看看这个API的源码,找找最新的接口:https://github.com/metowolf/Meting

  5. 小云
    该评论仅登录用户及评论双方可见
    1. idiotbaka
      @小云

      加你好友啦

  6. buyter

    按照post参数写得,但是好像显示请求参数错误,能教一下吗?
    (╯°A°)╯︵○○○

  7. peco

    请求了一下直接被标记作弊了Σ(っ °Д °;)っ

    {u'msg': u'Cheating', u'code': -460}

    1. idiotbaka
      @peco

      请求的时候在header里添加个chrome的User-Agent:
      Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36

  8. openface

    点赞!!!

  9. lushann

    哈哈哈哈这是我看过最简单的网易云api 点个赞