douban.fm API 原理

 

  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: 用户持续无操作时间, 疑似用于下发广告.

一个常规的播放完毕报告(空格为了增强可读性, 应忽略, 类似的少字段报告称之为短报告):

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,

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值