QQ音乐
import re import requests
import json class Search:
def __init__(self, song):
'''
self.vkey_url ---> 获取vkey的url
self.search_url ---> 获取歌曲列表的url
self.lyric_url ---> 获取歌词的url
self.music_url ---> 歌曲url的头,加上获得的vkey就是歌曲url
:param song: 歌曲名或歌手
'''
self.vkey_url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?callback=getplaysongvkey626277975566637&g_tk=5381&jsonpCallback=getplaysongvkey626277975566637&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0&data={"req":{"module":"CDN.SrfCdnDispatchServer","method":"GetCdnDispatch","param":{"guid":"552068528","calltype":0,"userip":""}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"552068528","songmid":["%s"],"songtype":[0],"uin":"0","loginflag":1,"platform":"20"}},"comm":{"uin":0,"format":"json","ct":20,"cv":0}}' self.search_url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=69457515379027970&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w={}&g_tk=5381&jsonpCallback=MusicJsonCallback010045556336209849&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0'.format(
song) self.lyric_url = 'https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric.fcg?nobase64=1&musicid=%s&callback=jsonp1&g_tk=5381&jsonpCallback=jsonp1&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq&needNewCode=0'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
self.music_url = 'http://183.230.77.24/amobile.music.tc.qq.com/%s'
self.seesion = requests.Session()
self.seesion.headers = headers def get_song_list(self):
'''
搜索到的歌曲列表
默认第一首歌曲,其他的更改下标[0]
:return:
'''
res = self.seesion.get(self.search_url)
song_list_json = json.loads(res.text.strip('MusicJsonCallback010045556336209849(').strip(')'))
# 只看第一首,修改下标[0],查看其它
songmid = song_list_json['data']['song']['list'][0]['mid']
# songmid = song_list_json['data']['song']['list'][0]['file']['media_mid']
songid = song_list_json['data']['song']['list'][0]['id']
self.songname = song_list_json['data']['song']['list'][0]['title']
print(songmid, songid, self.songname)
self.get_msuic_vkey(songmid, songid) def get_msuic_vkey(self, mid, songid):
'''
获得vkey
:param mid: 歌曲的mid
:param songid: 歌曲的id
:return:
'''
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'referer': 'https://y.qq.com/portal/player.html',
}
res = self.seesion.get(self.vkey_url % mid, headers=header)
res = json.loads(res.text.strip('getplaysongvkey626277975566637(').strip(')'))
purl_vkey = res['req_0']['data']['midurlinfo'][0]['purl']
self.get_msuic(purl_vkey)
self.get_lyric(songid, mid) def get_msuic(self, purl):
with open(self.songname + '.mp3', 'wb') as f:
f.write(self.seesion.get(self.music_url % purl).content) def get_lyric(self, id, mid):
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'referer': 'https://y.qq.com/n/yqq/song/{}.html'.format(mid)
}
lyric = self.seesion.get(self.lyric_url % id, headers=header).text
lyric = re.search('"lyric":"(.*?)"', lyric).group(1)
lyric = self.del_not_need(lyric)
with open(self.songname + '.lrc', 'w') as f:
f.write(lyric) # def change_symbol(self, lrc):
def del_not_need(self, lrc):
'''
更改歌词中的HTML实体字符
:param lrc: 歌词
:return:
'''
lyric = lrc.replace(':', ':').replace(' ', '\n').replace('.', '.').replace('-', '-')
lyric = lyric.replace(' ', ' ').replace('(', '(').replace(')', ')').replace('/', '/')
lyric = lyric.replace(',', ',').replace('|', '|').replace('*', '*')
return lyric def run(self):
'''
程序运行入口
:return:
'''
self.get_song_list() if __name__ == '__main__':
a = Search('真的好想你')
a.run()
QQ音乐的更多相关文章
- (DNS被劫持所导致的)QQ音乐与视频网页打开很慢的解决方法
这周开始发现一个很让人抓狂的现象,QQ音乐网页(http://y.qq.com)与QQ视频(http://v.qq.com/)网页打开超慢,甚至是无法打开,严重影响了业余的音乐视频生活. 以QQ视频为 ...
- 使用网易云音乐,丢掉QQ音乐吧
我是一个听音乐的重度用户,基本上每天大约有三分之一的时间里我在使用网易云音乐去听音乐.包括工作写代码的时候,跑步的时候,去上班的途中我都去听.首先需要声明的是,在这里我不是故意的去抹黑其他的音乐产品, ...
- QQ音乐的各种相关API
QQ音乐的各种相关API 分类: oc2014-01-29 15:34 2676人阅读 评论(2) 收藏 举报 基本上论坛里做在线音乐的都在用百度的API,进来发现百度的API不仅歌曲的质量不可以保证 ...
- 【QQ音乐Api】移花接木 打造自己的音乐电台
最近突发奇想想做个在线音乐小网页.需求很简单,如下 搜索歌曲 或 歌手 在线播放音乐 借用qq 或者 百度的 音乐接口 需求明确那就直接动手了 我首先尝试的百度音乐,但是不能在线播放(提示forbid ...
- QQ音乐项目(OC版) - 实现细节
QQ 音乐看似简单,但自己手动实现起来,才发现没有那么简单,有好多细节,需要注意. github : https://github.com/keenleung/QQMusic-OC 一.业务逻辑 首先 ...
- QQ音乐API
今天分享的是QQ音乐API 搜索歌曲API:http://s.music.qq.com/fcgi-bin/music_search_new_platform?t=0& amp;n={2}&am ...
- QQ音乐无损歌曲接口api
1.打开QQ音乐官网 y.qq.com 2.选择你要的歌曲,进入后查看网址,以虎口脱险这个歌曲为例:http://y.qq.com/#type=song&mid=000Ib8E71sUNi7 ...
- 一个开源音乐播放器,低仿QQ音乐!
有暇,弄了个音乐播放器,页面效果整体上参考了QQ音乐,相关API使用了易源数据提供的相关接口(https://www.showapi.com/api/lookPoint/213),在此表示感谢.先来看 ...
- Android自定义View,高仿QQ音乐歌词滚动控件!
最近在以QQ音乐为样板做一个手机音乐播放器,源码下篇博文放出.今天我想聊的是这个QQ音乐播放器中歌词显示控件的问题,和小伙伴们一起来探讨怎么实现这个歌词滚动的效果.OK,废话不多说,先来看看效果图: ...
- QQ音乐API分析记录
我一直是QQ音乐的用户,最近想做一个应用,想用QQ音乐的API,搜索了很久无果,于是就自己分析QQ音乐的API. 前不久发现QQ音乐出了网页版的,是Flash的,但是,我用iPhone打开这个链接的时 ...
随机推荐
- SpringBoot(四) Web开发 --- Thymeleaf、JSP
Spring Boot提供了spring-boot-starter-web为Web开发予以支持,spring-boot-starter-web为我们提供了嵌入的Tomcat以及Spring MVC的依 ...
- Codeforces 982 C. Cut 'em all!(dfs)
解题思路: 代码中有详细注解,以任意一点为根,dfs遍历这棵树. 每一个节点可能有好几个子树,计算每棵子树含有的节点数,再+1即为这整棵树的节点. 判断子树是否能切断与根之间的联系,如果子树含有偶数个 ...
- ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM
http://blog.csdn.net/u013477200/article/details/50723555
- bat脚本启动exe并打开文件后退出 + 中文乱码
写了个脚本用于复制模板到新的cpp文件. 将脚本路径加到环境变量里,只需在cmd窗口输入“new hdu 1419”,就会自动将模板拷贝到WORK_DIR下的hdu文件夹内一个名叫"1419 ...
- Optional Chaining as an Alternative to Forced Unwrapping
?与!的区别 You specify optional chaining by placing a question mark (?) after the optional value on whic ...
- ZOJ 3365 Integer Numbers
Integer Numbers Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...
- 在android中,编译的项目使用到第三方jar的导入方法 终极版!
1,在android系统环境中编译自己的项目时,往往会用到第三方jar包.这些jar包在eclipse中加入编译,一路畅通,由于eclipse已经帮助你配置好了.可是当把这个项目复制到系统环境中编译时 ...
- RPC架构
RPC架构 学习了: https://www.cnblogs.com/ChrisMurphy/p/6550184.html RPC架构简介,有一个Java例子: http://blog.csdn.ne ...
- jsp-include 写法
被包含的页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...
- Yocto tips (15): Yocto中的包管理器
使用包管理器 在local.conf中使能就可以: 然后编译后就会有rpm包了: 配置文件server 能够使用ngix和apache.可是我们也能够仅仅用使用python: python -m Si ...