Protocol
douban.fm API.
douban.fm为前端提供了一种RPC形式的接口, 可以获取播放列表/报告歌曲播放完毕. 认证系统基于cookie.
- 基本URL: http://douban.fm/j/mine/playlist
- HTTP Method: GET (基于性能原因, POST不采用也不必测试)
- 参数
- type: [benpsur], RPC函数指示:
- b: bye(?), 播放以删除终止. 长报告
- e: end, 返回:'"OK"', 报告歌曲播放完毕, 短报告
- n: new, 返回新播放列表, 无其余必备参数(uid?). 长报告
- p: playing(?), 单首歌曲播放开始且播放列表已空时发送, 长报告, 疑似是专门为平淡地获取播放列表而设定的.
- s: skip, 用户点击”下一首“时即时报告
- u: unlike, 将sid的歌曲取消喜欢
- r: rated(?), 喜欢一首歌时即时报告
- uid: 用户在豆瓣的UID, 如果与请求中的cookie所带uid值不同可能会收到回复{"r":1,/*...这里忘记了...*/}
- r: random, JavaScript中Math.random()自然产生的随机数
- h: history, 格式为'|'分割的 sid + ':' + /[psbr]/ 避免短时间内出现重复
- sid: Song ID
- aid: Album ID
- rest: '|'分割的sid. 已获取的播放列表中尚未播放的曲目, 避免短时间内出现重复.
- status: 播放器状态, 'p'代表正在播放中.
- du: 用户持续无操作时间, 疑似用于下发广告.
- type: [benpsur], RPC函数指示:
一个常规的播放完毕报告(空格为了增强可读性, 应忽略, 类似的少字段报告称之为短报告):
http://douban.fm/j/mine/playlist? type=e &status=p &uid=4556698 &sid=963365
常规的播放过程中自动获取播放列表(类似的多字段报告称之为长报告)
http://douban.fm/j/mine/playlist?
r=0.04031559219583869
&type=p
&sid=1383292
&uid=4556698
&h=1386894:s|444482:p|460268:s|48180:s|1027376:s|188257:s|1395422:p|758931:p|1395431:p|515558:p|963365:p|983355:p|743104:p|983362:p|1028233:p|11439:p|252496:p|757298:p|743093:p|695596:p
&du=55
&rest=
&aid=1404386
type=[bnsur]报告格式同上.
type=s报告时所跳过歌曲的sid不一定要出现在h字段里面.
历史(h字段)长度限定为20项以内, 豆瓣依据长报告的h字段来记录最近听过的歌曲.(那短报告是干什么用的?)
播放列表返回为JSON格式. 样例:
{
"r": 0, //类似shell程序返回值, 0代表运行正常
"song": [ //数组, 歌曲信息
{
"album": "/subject/1394549/",
"picture": "http://t.douban.com/mpic/s3268875.jpg",
"like": "0", //字符串1或0. 需parseInt预处理成整数再转至boolean型.
"title": "1234567",
"url": "http://n.douban.com/view/song/small/p1022939.mp3?key=20100224172930e456fb5a9afa93f83c83994da22e67fc",
"company": "/u6efe/u77f3/u5531/u7247",
"artist": "/u9648/u7eee/u8d1e",
"rating_avg": 4.56435,
"subtype": "",
"public_time": "2002-08-02",
"sid": "1022939",
"aid": "1394549",
"albumtitle": "Groupies /u5409/u4ed6/u624b"
},
...
]
}
如果请求不含cookie那么返回值如下:
{
"r": 1,
"err": "wronguser"
}
对某首歌表示喜欢时的请求包括一个type=r的长请求和一个type=e&status=r的短请求, 但是在其后的历史字段中仍标记为p而不是r. 而且真正起到记录作用的是长请求.
请求 http://douban.fm/radio, 豆瓣会从用户cookie中读取uid等数据并写入到script标签, 进而传递给flash播放器. 在返回的html页面中的script标签中搜索flashvars = {uid:'4556698', autoplay:1, host:'http://douban.fm'}或类似字样可以获取当前用户uid,