优化metingJS插件

在我的音乐分享页使用的MetingJS+Aplayer来做音乐播放器

MetingJS: https://github.com/metowolf/MetingJS

Aplayer: https://aplayer.js.org

但是在使用MetingJS过程中发现, 在除了文档中提到的以下几款浏览器会出现Failed to load resource: net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH的错误, 使用Chrome和requests包来访问是正常的

  • Chrome
  • Firefox
  • Safari
  • Internet Explorer 11
  • Microsoft Edge

至少我使用QQ, 乃至于Chormium这些附带Chrome内核的浏览器也出现了同样的问题, 当然手机浏览器也是一样, 具体为什么会出现这样的问题呢? 我也解释不太清楚, 就是浏览器SSL的一些版本控制的关系吧

上方图片里可以看见在打开音乐页他会访问歌曲对应的playlist歌单列表/url播放地址/lrc歌词地址/pic图片地址

实际上把playlist和lrc的请求连接提取出来在Chrome里访问会发现, 实际上前者获取的是一个json格式列表, 后者是歌词的html页, 而pic返回的是图片的content, url播放地址则是返回跳转一个真实的音频文件的地址

只要知道就好办了, MetingJS在文档中也有提供PHP的方案, 我自己就考虑直接把这些链接做一部处理保存成json文件, 方便调用

首先在html页中加入MetingJS对应的var参数, 此链接会访问后端来处理链接:

<script>var meting_api = "https://www.breezed.cn/music/api/?server=:server&type=:type&id=:id&auth=:auth&r=:r";</script>

构建处理相关参数的Views:

这里的celery_crawl_music_api使用的是异步更新歌单, 实际上调用的是CrawlAPI这个处理链接的包

class MusicApi(View):

    def get(self, request):
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
        }
        api = 'https://api.i-meto.com/meting/api?server={}&type={}&id={}&auth={}&r={}'
        server = request.GET.get('server')
        type = request.GET.get('type')
        id = request.GET.get('id')
        auth = request.GET.get('auth', None)
        r = request.GET.get('r', None)
        if type == 'playlist':
            try:
                with open(os.getcwd() + '/static/json/music_api_{}.json'.format(id), 'r') as f:
                    open_file = f.read()
                    celery_crawl_music_api.delay(server, type, id, auth, r)
                    return HttpResponse(open_file)
            except Exception as e:
                logger.info('Exception: {}'.format(e))
            # 如果json文件不存在, 则爬取data
            data = CrawlAPI(server, type, id, auth, r)
            return HttpResponse(json.dumps(data))
        elif type == 'lrc':
            res = requests.get(api.format(server, type, id, auth, r), headers=header)
            html = """<pre style="word-wrap: break-word; white-space: pre-wrap;">"{}"</pre>""".format(res.text)
            return HttpResponse(html)
        elif type == 'pic':
            res = requests.get(api.format(server, type, id, auth, r), headers=header)
            return HttpResponse(res.content)
        elif type == 'url':
            try:
                res = requests.get(api.format(server, type, id, auth, r), headers=header)
                return HttpResponseRedirect(res.url)
            except:
                return HttpResponse({})
        else:
            return HttpResponse({})

CrawlAPI代码:

def CrawlAPI(server, type, id, auth, r):
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
    }
    api = 'https://api.i-meto.com/meting/api?server={}&type={}&id={}&auth={}&r={}'
    url = api.format(server, type, id, auth, r)
    res = requests.get(url, headers=header)
    if res.status_code == 200:
        data = res.json()
        if len(data) != 0:
            try:
                # for循环处理替换url里原本的url指向
                for i in data:
                    i['url'] = i['url'].replace('https://api.i-meto.com/meting/api',
                                                'https://www.breezed.cn/music/api/')
                    i['cover'] = i['cover'].replace('https://api.i-meto.com/meting/api',
                                                    'https://www.breezed.cn/music/api/')
                    i['lrc'] = i['lrc'].replace('https://api.i-meto.com/meting/api',
                                                'https://www.breezed.cn/music/api/')
                with open(os.getcwd() + '/static/json/music_api_{}.json'.format(id), 'w+') as f:
                    json.dump(data, f)
                return data
            except Exception as e:
                logger.info('music_api写入失败: {}'.format(e))
            return data
    else:
        logger.info('requests获取失败')
        return []

大功告成, 这样子无论在什么浏览器都不直接使用原来的链接去获取相应参数了...当然也可以直接在CrawlAPI中把Views处理对应链接一次过弄好, 不过这样子歌曲多的话会一次频繁的去访问, 有点浪费资源.


如果本文对你有启发,或者对本文有疑问或者功能/方法建议,可以在下方做出评论,或者直接联系我,谢谢您的观看和支持!

添加新评论

本站现已启用评论投票,被点踩过多的评论将自动折叠。与本文无关评论请发留言板。请不要水评论,谢谢。

已有 0条评论