起因:
因为平时游泳的时候喜欢听点音乐,然后自己戴的水下耳机又只支持 mp3 播放,好像是因为 IP68 防水级别的耳机没法实现蓝牙功能?
然后同一首歌一般情况下是没法渡过“七天之痒”的,就跟把一首歌设置为起床铃声一样,在不断地重复中让你的大脑产生“审美疲劳”,于是音乐一方面是“刚需”,一方面也成了“快消品”。
有时候在某平台听到不错的歌曲,收藏了又没有下载的途径,即便有下载还要把歌曲复制粘贴到其他地方,就属于很枯燥的重复。
在发现X狗的音乐不像X云一样走的 m3u8 这种格式的时候,这让我产生了自动搜索音乐并自动下载到指定目录的念头。
动手:
这个是整套方案的核心,主要用来提供代理 http(s) 访问网络的服务,与此同时它就会提供封装好的 har 文件(包含请求和响应)供你分析。
启动方式:
第一种是拷贝仓库下来通过 ide 启动,库代码阅读属性点满,写得也让人相见恨晚,大概就是那种不需要你是程序员也能读懂的代码
第二种是直接下打包后的 release 版本,然后通过命令行启动服务,shell 和 bat 都有提供。这里有个小坑,运行环境不能是最新的 java 16,我这边 windows 下用 java 8 亲测可以启动服务成功。
使用流程:
第一步 ----- 创建一个代理服务实例
[~]$ curl -X POST http://localhost:8080/proxy
{"port":8081}
这里会返回一个可访问 http(s) 的代理服务端口
第二步 ----- 代理服务收到请求
这里可以接入自动化的部分
第三步 ----- 访问代理服务得到 har
[~]$ curl -X PUT -d 'initialPageRef=Foo' http://localhost:8080/proxy/8081/har
这里 initialPageRef 可看成当前请求页面的标志,代理服务以此做区分
上面是简易的使用流程,实际上使用的话不管是 python 或 java 等都会有封装好的相应包(插件)可以直接使用。
同类插件在 Nodejs 同时这里使用的一个包也叫 browsermob-proxy,可用也可以自己根据上面的 curl 来简单封装个。
这里有个小坑是 application/x-www-form-urlencoded 的请求头可能会导致代理服务那边异常,需要要到插件里面去掉。
selenium 是模拟 web 操作的测试工具,主流语言都有其相应的插件实现。这里使用 Nodejs 的插件 selenium-webdriver 来实现自动化测试的模块,对应上述流程中的第二步 ----- 代理服务收到请求,因为这一步并不是固定的,不管是手动用浏览器访问或者使用软件访问代理端口,都能通过任意的 http 访问代理服务端口得到 har 文件。
需求大概是这样:
提供一个音乐列表文件,然后到 X狗 网站自动根据音乐名搜索相应的音乐,通过抓包分析出下载的 mp3 链接,最后将音乐下载到目标文件夹内。
第一步:命令行启动代理服务
第二步:通过 selenium 启动 web 自动化解析脚本
通过正则匹配出 har 字符串中的音频地址,整个 har 结构在最新 browsermob-proxy 包封装下大概长这样
我这边用 X狗 的搜索发现个问题是,如果纯用歌名来搜的话,它的结果还是比较离谱的,如果用 歌名 歌手 的方式来搜结果就准确点,一般前几条就能出。
之所以这样说是因为我这边是直接取搜索结果的第一条,这样做可以省略到搜索列表里省略出来的逻辑,可能后面还是得加下这步。
browsermob-proxy 真是个不错的轮子,里面响应前,请求前这些处理都写得清清楚楚,明明白白,稍微diy一下再加个壳就可以当 fiddler 来用了。