原文地址

  • 豆瓣FM非官方API分析

原理

  • 豆瓣并没有开放 douban.fm 的API
  • 以下的分析只是通过抓包,并结合网上前人的研究,猜测参数的作用
  • 通过python的requests模块来测试
  • 根据Arguments构造传入参数结构体,发送http请求
  • 获取到的是json数据,用json.loads()转成字典进行操作

登录接口

使用 douban.fm 并不需要使用豆瓣的 OAuth 认证,只需要简单地把用户名密码 POST 过去,并保存 Token 和 Expire 即可。

URL: http://www.douban.com/j/app/login

Method: POST

Arguments:

  • app_name: radio_desktop_win

  • version: 100

  • email: 用户帐号

  • password: 明文密码

Header: Content-Type: application/x-www-form-urlencoded

Response ( application/json )

测试使用(发送http请求,获取对应url):
- 根据Arguments构造参数结构体,以Method的方式发送请求到URL
- 返回结果的text中存放着登录参数

#-*- coding: utf-8 -*-
import requests
import urllib
import json# 构造Arguments中的传入参数结构体
login_data = {'app_name': 'radio_desktop_win','version': '100','email': '243027571@qq.com','password': 'xxxxxxxx'}# 这里的Method是Post,则将结构体传入,按照Post方式发送
user_data = requests.post('http://www.douban.com/j/app/login',login_data)
udata = json.loads(user_data.text)user_id = udata['user_id']
expire = udata['expire']
token = udata['token']# 定义获取歌曲列表结构体
song_list = {'app_name': 'radio_desktop_win','version': '100','user_id' : user_id,'expire' : expire,'token': token,'type' : 'n','channel' : 0,}# 获取歌曲列表
url = 'http://www.douban.com/j/app/radio/people?' + urllib.urlencode(song_list)
song = requests.get(url)
s = json.loads(song.text)
print s['song'][0]
print s['song'][0]['title']


登录成功(r的值为0)

{"user_id": "<user_id>","err": "ok","token": "<token_string>","expire": "<expire_time_in_millisecond>","r": 0,"user_name": "xxx","email": "<user_account>"
}

登录失败(r为1,err会给出错误原因)

{"r": 1,"err": "wrong_password"
}

在获得user_id,token和expire后,保存起来,在使用获取歌曲列表、红心等API时,把它们放到请求参数中即可

获取频道列表

这个接口获取的频道列表是一个比较固定的列表,并非douban.fm网页版上那么多样的列表。网页版的频道列表是直接服务器生成在HTML里面的,无法直接获得(可使用爬虫),但它的channel_id可以用,如有兴趣可把这些channel_id收集起来。

  • URL: http://www.douban.com/j/app/radio/channels

  • Method: GET

  • Arguments: None

  • Response ( application/json ):

{"channels": [{"name": "私人兆赫","seq_id": 0,"abbr_en": "My","channel_id": 0,"name_en": "Personal Radio"},{"name": "华语","seq_id": 1,"abbr_en": "CH","channel_id": 1,"name_en": "Chinese"},{"name": "欧美","seq_id": 2,"abbr_en": "EN","channel_id": 2,"name_en": "Euro-American"},...
}

如上可看出,有频道名,有channel_id,这个id用于请求相应的歌曲列表。seq_id只是一个简单的列表排序index,可忽略

获取歌曲列表

歌曲列表的获取最为复杂,其参数也比较多

  • URL: http://www.douban.com/j/app/radio/people

  • Method: GET

  • Arguments:..

  • Response ( application/json ):

所有的这些都会返回一个json字符串,其中都会包括歌曲列表(上面得到的歌曲URL,只会在一定时间内有效,过期之后就不能再访问了,因此猜测每次访问都返回一些歌曲就是想更新一下后面的曲库,因为当前这首不能播了,很可能后面的也不能播)。

r若为1即出错,err里面会写上出错原因,而r为0即调用成功。
其中的歌曲列表格式是

{"r": 0,"version_max": 100,"song": [{"album": "/subject/5952615/","picture": "http://img3.douban.com/mpic/s4616653.jpg","ssid": "e1b2","artist": "Bruno Mars / B.o.B","url": "http://mr3.douban.com/201308250247/4a3de2e8016b5d659821ec76e6a2f35d/view/song/small/p1562725.mp3","company": "EMI","title": "Nothin' On You","rating_avg": 4.04017,"length": 267,"subtype": "","public_time": "2011","sid": "1562725","aid": "5952615","sha256": "2422b6fa22611a7858060fd9c238e679626b3173bb0d161258b4175d69f17473","kbps": "64","albumtitle": "2011 Grammy Nominees","like": 1},...}
}

参数都可以直接从名字看出其意义
- album 专辑跳转地址
- picture 专辑图片地址
- ssid 未知
- artist 艺术家
- url 歌曲的URL
- company 唱片公司
- title 歌曲名
- rating_avg 平均分数
- length 长度
- subtype 子类型(有些广告的字类型会是T)
- public_time 出版年份
- sid 歌曲id
- aid 专辑id
- kbps 码率
- albumtitle 专辑名
- like 是否已喜欢,0为false,1为true

获取歌曲URL后调用相应播放器播放,如mplayer

#!/usr/bin/python
import requests
import urllib
import json
import subprocesslogin_data = {'app_name': 'radio_desktop_win','version': '100','email': '243027571@qq.com','password': 'xxxxxxx'}user_data = requests.post('http://www.douban.com/j/app/login',login_data)
udata = json.loads(user_data.text)user_id = udata['user_id']
expire = udata['expire']
token = udata['token']song_list = {'app_name': 'radio_desktop_win','version': '100','user_id' : user_id,'expire' : expire,'token': token,'type' : 'n','channel' : 0,}url = 'http://www.douban.com/j/app/radio/people?' + urllib.urlencode(song_list)
song = requests.get(url)
songlist = json.loads(song.text)for sdata in songlist['song']:surl = sdata['url']subprocess.call(["mplayer",surl], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

【Python】豆瓣FM API分析相关推荐

  1. python 豆瓣评论数据分析_Python爬虫实战案例:豆瓣影评大数据分析报告之网页分析...

    个人希望,通过这个完整的爬虫案例(预计总共4篇短文),能够让爬虫小白学会怎么做爬虫的开发,所以在高手们看来,会有很多浅显的废话,如果觉得啰嗦,可以跳过一些内容~ 上一篇文章给大家简单介绍了Python ...

  2. python可视化分析网易云音乐评论_网易云音乐热门评论api分析

    网上有现成的例子我就扒过来了!! title: 网易云评论api分析 date: 2018-12-24 20:54:46 tags: [python] 网易云音乐是个好地方,里面各个都是人才,特别是评 ...

  3. Python 爬虫实战:分析豆瓣中最新电影的影评

    Python 爬虫实战:分析豆瓣中最新电影的影评 接触python时间不久,做些小项目来练练手.前几天看了<战狼2>,发现它在最新上映的电影里面是排行第一的,如下图所示.准备把豆瓣上对它的 ...

  4. python爬虫网易云音乐最热评论并分析_网易云音乐热门评论api分析

    网上有现成的例子我就扒过来了!! title: 网易云评论api分析 date: 2018-12-24 20:54:46 tags: [python] 网易云音乐是个好地方,里面各个都是人才,特别是评 ...

  5. 自己动手用python写豆瓣FM

    以前装过几次ubuntu,但总是因为缺少一些软件工具而最终不得不回到windows下.最近又迷上了ubuntu,逐渐从windows系统转战ubuntu.这次,openfetion.wineqq.ch ...

  6. 基于python的豆瓣FM(终端命令行界面)

    douban.fm 这个版本的命令行界面是参考了 Node.js版本的douban.fm制作的,向原作者致敬.终端界面设计的非常好看. 感谢Cloverstd的修改,已经支持Mac OS X(> ...

  7. Python可视化,爬下豆瓣带你分析海贼王、火影和死神三大经典动漫

    对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.利用Python大法带大家分析一下这些神作,看看这 ...

  8. Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

    上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次 ...

  9. python 图表_Python入门学习系列——使用Python调用Web API实现图表统计

    使用Python调用Web API实现图表统计 Web API:Web应用编程接口,用于URL请求特定信息的程序交互,请求的数据大多以非常易于处理的格式返回,比如JSON或CSV等. 本文将使用Pyt ...

最新文章

  1. jieba(结巴)常用方法
  2. python项目实践_Python 项目实践三(Web应用程序)第二篇
  3. docker安装elasticsearch并进行目录挂载
  4. java web sqlmapapi,深入了解SQLMAP API
  5. CF755G PolandBall and Many Other Balls(多项式/倍增fft)
  6. 【贪心】最大连续数列的和
  7. SpringMVC 全局异常处理的简单应用
  8. [Audio processing] Harmonic change detection function (HCDF)
  9. redis常用命令与常用api
  10. 解决局域网访问共享工具
  11. qt中实现多语言功能
  12. 智慧校园供水系统智能管理
  13. n1装linux系统升级,N1 降级刷机救砖总结
  14. 【完整源码】如何在BSC部署多代层级分红
  15. 关于开灯问题的两种解法
  16. virt-manager 键盘错位解决
  17. windows中bat脚本编写
  18. gedit文本编辑器的设置
  19. 由神秘到简单 教你在网页中添加微软地图
  20. java半碳前叉结构,山地车避震前叉功能及原理分类详解(图文)

热门文章

  1. WordPress常见问题及其解决方法
  2. python深度学习--Keras函数式API(多输入,多输出,类图模型)
  3. 欧科云链亮相央视《新闻直播间》,书写科技助警新篇章
  4. 自然语言处理-哈工大笔记
  5. 汉诺塔游戏(java)
  6. 无意中发现我这个北漂的几张照片
  7. 三星oneui主屏幕费电_三星One UI初体验,你想要的使用感受都在这里
  8. 用 python 实现简单AI 双人日麻(文字版)之三 加入COM出牌
  9. 华为2020届实习生校招机考题(2019-3-20版)
  10. PowerMill 2017五轴联动编程视频教程