使用browsermob-proxy和selenium-webdriver实现音乐下载

起因:

因为平时游泳的时候喜欢听点音乐,然后自己戴的水下耳机又只支持 mp3 播放,好像是因为 IP68 防水级别的耳机没法实现蓝牙功能?

然后同一首歌一般情况下是没法渡过“七天之痒”的,就跟把一首歌设置为起床铃声一样,在不断地重复中让你的大脑产生“审美疲劳”,于是音乐一方面是“刚需”,一方面也成了“快消品”。

有时候在某平台听到不错的歌曲,收藏了又没有下载的途径,即便有下载还要把歌曲复制粘贴到其他地方,就属于很枯燥的重复。

在发现X狗的音乐不像X云一样走的 m3u8 这种格式的时候,这让我产生了自动搜索音乐并自动下载到指定目录的念头。

 

动手:

一:browsermob-proxy 

这个是整套方案的核心,主要用来提供代理 http(s) 访问网络的服务,与此同时它就会提供封装好的 har 文件(包含请求和响应)供你分析。

启动方式

第一种是拷贝仓库下来通过 ide 启动,库代码阅读属性点满,写得也让人相见恨晚,大概就是那种不需要你是程序员也能读懂的代码

    @Delete
    @At("/:port/whitelist")
    public Reply<?clearWhitelist(@Named("port"int portRequest<Stringrequest) {
        LegacyProxyServer proxy = proxyManager.get(port);
        if (proxy == null) {
            return Reply.saying().notFound();
        }
 
        proxy.clearWhitelist();
        return Reply.saying().ok();
    }

第二种是直接下打包后的 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-webdriver 

selenium 是模拟 web 操作的测试工具,主流语言都有其相应的插件实现。这里使用 Nodejs 的插件 selenium-webdriver 来实现自动化测试的模块,对应上述流程中的第二步 ----- 代理服务收到请求,因为这一步并不是固定的,不管是手动用浏览器访问或者使用软件访问代理端口,都能通过任意的 http 访问代理服务端口得到 har 文件。

需求大概是这样:

提供一个音乐列表文件,然后到 X狗 网站自动根据音乐名搜索相应的音乐,通过抓包分析出下载的 mp3 链接,最后将音乐下载到目标文件夹内。

第一步:命令行启动代理服务

第二步:通过 selenium 启动 web 自动化解析脚本

通过正则匹配出 har 字符串中的音频地址,整个 har 结构在最新 browsermob-proxy 包封装下大概长这样

    "entries": [
      {
        "pageref""test1",
        "startedDateTime""2021-xx-xxT17:09:28.612+08:00",
        "request": {
          "method""GET",
          "url":"https://webfs.yun.xxx.com/202106081715/2636a711f133a247a5778508bc7c59a6/KGTX/CLTX001/ac75ab5b4538a7e60d4fb7d38672f3cb.mp3",
          "httpVersion""HTTP/1.1",
          "cookies": [],
          "headers": [
            { "name""Host""value""www.xxx.com" },
xxx
          ],
          "queryString": [],
          "headersSize"649,
          "bodySize"0,
          "comment"""
        },
        "cache": {},
        "response": {xxx}
        }
      ]

我这边用 X狗 的搜索发现个问题是,如果纯用歌名来搜的话,它的结果还是比较离谱的,如果用 歌名&nbsp;&nbsp;歌手 的方式来搜结果就准确点,一般前几条就能出。

之所以这样说是因为我这边是直接取搜索结果的第一条,这样做可以省略到搜索列表里省略出来的逻辑,可能后面还是得加下这步。

 

browsermob-proxy 真是个不错的轮子,里面响应前,请求前这些处理都写得清清楚楚,明明白白,稍微diy一下再加个壳就可以当 fiddler 来用了。

 

posted on 2021-06-14 22:38  Lowki  阅读(502)  评论(0编辑  收藏  举报