头图

Python开发,模拟登录网易云音乐,体验终端看每日歌曲推荐

Cooci

前言:

全新的一周,当然是从掌握一项新的“终端技术”开始啦,废话不多说,让我们愉快地开始吧~

image.png

开发工具

Python版本:3.6.4

相关模块:

argparse模块;

pick模块;

click模块;

DecryptLogin模块;

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

既然要在终端看网易云的每日歌曲推荐,首先自然是要先模拟登录网易云啦,这部分可以利用公众号之前开源的DecryptLogin包来实现:

'''模拟登录'''
@staticmethod
def login(username, password):
    lg = login.Login()
    infos_return, session = lg.music163(username, password)
    return session

接着,我们来看看该如何获取网易云的每日歌曲推荐。简单抓包分析一下,可以发现如下图所示的链接:

请求它就可以返回每日推荐的歌曲信息:

图片

好的,现在我们按照之前的方法来打个断点,看看需要提交哪些参数才能获得每日推荐的歌曲信息:

网易云个人听歌排行榜爬取

结果如下:

data = {
        'crsf_token': csrf,
        'limit': '999',
        'offset': '0',
        'total': 'true'
    }

简单测试一下:

'''获得每日推荐'''
def getdailyrecommend(self):
    url = 'http://music.163.com/weapi/v2/discovery/recommend/songs?csrf_token='
    data = {
            'crsf_token': self.csrf,
            'limit': '999',
            'offset': '0',
            'total': 'true'
        }
    data = self.cracker.get(data)
    response = self.session.post(url, headers=self.headers, data=data)
    response_json = response.json()
    print(response_json)

效果如下:

图片

接着,从返回的数据中提取我们需要的数据:

response_json = response.json()
daily_recommend_infos = {}
if response_json['code'] == 200:
    for item in response_json['recommend']:
        songname = item['name']
        songid = item['id']
        singer = item['artists'][0]['name']
        h = item['hMusic'].get('bitrate', 320000) if item['hMusic'] else 320000
        m = item['mMusic'].get('bitrate', 192000) if item['mMusic'] else 192000
        l = item['lMusic'].get('bitrate', 128000) if item['lMusic'] else 128000
        brs = [h, m, l]
        daily_recommend_infos[songid] = ['%s By %s' % (songname, singer), brs]
    return daily_recommend_info
else:
    raise RuntimeError('获取每日歌曲推荐失败, 请检查网络并重新运行程序...')

最后,再和之前的文章一样:

来写个网易云个人歌单下载器?

加一个歌曲下载功能就可以愉快地查看每日歌曲推荐并下载自己喜欢的歌来听啦:

'''下载某首歌曲'''
def downloadSong(self, songid, songname, brs, savepath='.'):
    play_url = 'http://music.163.com/weapi/song/enhance/player/url?csrf_token='
    print('正在下载 ——> %s' % songname)
    for br in brs:
        data = {
                    'ids': [songid],
                    'br': br,
                    'csrf_token': self.csrf
                }
        res = self.session.post(play_url+self.csrf, headers=self.headers, data=self.cracker.get(data))
        if res.json()['code'] == 200:
            download_url = res.json()['data'][0].get('url', '')
            if download_url:
                break
    with closing(self.session.get(download_url, headers=self.headers, stream=True, verify=False)) as res:
        total_size = int(res.headers['content-length'])
        if res.status_code == 200:
            label = '[FileSize]:%0.2f MB' % (total_size/(1024*1024))
            with click.progressbar(length=total_size, label=label) as progressbar:
                with open(os.path.join(savepath, songname+'.'+download_url.split('.')[-1]), "wb") as f:
                    for chunk in res.iter_content(chunk_size=1024):
                        if chunk:
                            f.write(chunk)
                            progressbar.update(1024)

文章到这里就结束了,感谢你的观看,关注我每天分享Python模拟登录系列,下篇文章分享Python获取IP地址对应的地理位置信息。

为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

All done~完整源代码+干货详见个人简介或者私信获取相关文件。。

阅读 455

Python实训营直播预约:[链接]

373 声望
36 粉丝
0 条评论

Python实训营直播预约:[链接]

373 声望
36 粉丝
文章目录
宣传栏