JumpAlang / Jusic-Serve-Houses

一起听歌吧多房间版本(music.alang.run)
http://music.alang.run
GNU General Public License v3.0
540 stars 88 forks source link

会员歌曲问题 #4

Open MoeMegu opened 3 years ago

MoeMegu commented 3 years ago

点歌时点到会员歌曲,会出现30s的试听片段,或者出现0s的歌曲。获取歌曲是否可以增加一个判断歌曲长度的条件,总长度低于阈值秒数的歌曲不进入列表?

JumpAlang commented 3 years ago

我的想法是:小于30s以下的,或者没有的去酷狗搜索

BraveSail commented 3 years ago

能否登录自己的vip账号?

BraveSail commented 3 years ago

我的想法是:小于30s以下的,或者没有的去酷狗搜索

API可以登录获取到VIP歌曲链接,能否加上这个功能

JumpAlang commented 3 years ago

指的是网易 还是 QQ ?

BraveSail commented 3 years ago

@JumpAlang 网易的,因为网易会员歌不登录只能试听30秒,但是NeteaseCloudMusicApi如果登录自己VIP帐号的话可以拿到flac的完整版链接:

2. 邮箱登录
必选参数 :

email: 163 网易邮箱

password: 密码

可选参数 :

md5_password: md5加密后的密码,传入后 password 将失效

接口地址 : /login

调用例子 : /login?email=xxx@163.com&password=yyy

完成登录后 , 会在浏览器保存一个 Cookies 用作登录凭证 , 大部分 API 都需要用到这个 Cookies,非跨域情况请求会自动带上 Cookies

当然qq音乐的API也可以设置COOKIE登录:

设置用户Cookie
接口:/user/setCookie

参数:

data: 字符串,cookie 信息,格式如下 aaa=bbb; ccc=ddd; ....

该方法仅支持 post 请求,content-type 选择 application/json,同时,当且仅当传入的 cookie 为写配置的 QQ 号(启动参数 或 bin/config.js)时才会 被作为默认的公用 cookie 存储使用,各位在搭建自己的服务时记得修改这里的信。
JumpAlang commented 3 years ago

1.qq音乐设置cookie这个之前有试过,比较麻烦,要定时更新cookies,不然登录就过期了,后面就改成如果qq音乐获取不到播放链接 就去酷我查找。 2.网易云音乐api,这个要去做相应定制,因为他现在是存在浏览器。要改成存在服务器。后面也要去定时刷新登录状态。

BraveSail commented 3 years ago

@JumpAlang qq音乐的接口只能手动导入cookie确实麻烦,可以先不考虑; 不过网易云的接口可以不用存在服务器,根据说明:

v3.30.0后支持手动传入cookie,登录接口返回内容新增 cookie 字段,保存到本地后,get请求带上?cookie=xxx 或者 post请求body带上 cookie 即可,如:/user/cloud?cookie=xxx

先GET一次login接口,然后会返回一个cookie字段,提取之后所有的请求后面加上?cookie=xxx就可以获取到登录后的结果,刚才我用浏览器试了下确实可以,具体代码就得靠大佬看看怎么弄了;刷新登录状态的话可以考虑每次请求都带cookie,这个接口好像是有缓存机制的

JumpAlang commented 3 years ago

网易api这个cookies你有试过过期多久吗?

BraveSail commented 3 years ago

Max-Age=1296000; Expires=Mon, 8 Feb 2021 09:32:48 GMT;

JumpAlang commented 3 years ago

15天?

JumpAlang commented 3 years ago

我研究下

BraveSail commented 3 years ago

刚才把大佬代码简单改了下: /home/www/Jusic-Serve-Houses/src/main/java/com/scoder/jusic/service/imp/MusicServiceImpl.java 972行 ->

response = Unirest.get(jusicProperties.getMusicServeDomain() + "/song/url?br=128000&id=" + musicId + "")

给后面加了&?cookie=,把自己的填了进去确实可以点播VIP歌曲了: image image

BraveSail commented 3 years ago

不加cookie的话是30秒

JumpAlang commented 3 years ago

好的,感谢普及,我思考下是加到后端还是网易音乐api

BraveSail commented 3 years ago

刚把QQ音乐的api换成了下载链接

下载链接
接口:/song/url

参数:

id: songmid

type: 默认 128 // 128:mp3 128k,320:mp3 320k,m4a:m4a格式 128k,flac:flac格式 无损,ape:ape格式 无损

mediaId: 这个字段为其他接口中返回的 strMediaId 字段,可不传,不传默认同 songmid,但是部分歌曲不传可能会出现能获取到链接,但实际404, 所以有条件的大家都传吧

isRedirect: 默认 0,非 0 时直接重定向到播放链接

这个接口跟上个接口一样,也是依赖服务器的 Cookie 信息的,不支持批量获取,不一定是全部的歌曲都有无损、高品的, 要注意结合 size320,sizeape,sizeflac 等参数先判断下是否有播放链接

示例:/song/url?id=0039MnYb0qxYhV

自己加了个cookie也可以放vip了

    @Override
    public String getQQMusicUrl(String musicId) {
        HttpResponse<String> response = null;
        String result = null;

        Integer failCount = 0;

        while (failCount < jusicProperties.getRetryCount()) {
            try {
 -->               response = Unirest.get(jusicProperties.getMusicServeDomainQq() + "/song/url?id=" + musicId + "&type=320")
                        .asString();

                if (response.getStatus() != 200) {
                    failCount++;
                } else {
                    JSONObject jsonObject = JSONObject.parseObject(response.getBody());
//                    log.info("获取音乐链接结果:{}", jsonObject);
                    if (jsonObject.get("result").equals(100)) {
-->                        result = jsonObject.getString("data");
                        break;
                    }else{
                        return null;
                    }
                }
            } catch (Exception e) {
                failCount++;
                log.error("qq音乐链接获取异常, 请检查音乐服务; Exception: [{}]", e.getMessage());
JumpAlang commented 3 years ago

这个之前我试过了,不过cookies有效期太短,api的开源作者也想不出好的办法,要手动去更新cookies,所以后面我也没去更新这个cookies了。但是接口还留着,不过用的是我qq号码。

BraveSail commented 3 years ago

qq的登陆确实麻烦

JumpAlang commented 3 years ago

后面想了下,网易vip播放链接功能还是放到api音乐端。这样好跟音乐api一起同步更新

JumpAlang commented 3 years ago

后面还是更新到后端了,api音乐端看不懂。。。 已经部署上去,欢迎过来测试。

接口如下:

  1. 网易云音乐手机登录 http://www.alang.run:8080/netease/loginByPhone?phone=手机号&pwd=密码 登录成功会返回cookie,后端也自动设置cookie,如果不想登录且已知cookie,也可以使用第4个接口,直接设置cookie

2.网易云音乐邮箱登录 http://www.alang.run:8080/netease/loginByEmail?email=邮箱&pwd=密码 登录成功会返回cookie,后端也自动设置cookie,如果不想登录且已知cookie,也可以使用第4个接口,直接设置cookie

3.网易云音乐刷新登录状态 http://www.alang.run:8080/netease/loginRefresh

4.网易云音乐设置cookie http://www.alang.run:8080/netease/setCookie?cookie=xxx

JumpAlang commented 3 years ago

群里已有小伙伴分享帐号,现在即可聆听vip歌曲了

BraveSail commented 3 years ago

docker有没有更新?

JumpAlang commented 3 years ago

有上传到hub了,你docker-compose那边改成1.5版本

BraveSail commented 3 years ago

好的,我试试

BraveSail commented 3 years ago

大佬更新下github源码,我想改下音质

JumpAlang commented 3 years ago

已提交上去了

jsososo commented 3 years ago

哈哈哈,我来了,我现在已经放弃共享cookie这条路了,因为存在封号风险,替代方案为根据歌名+歌手+歌曲时长去咪咕音乐匹配,这一块目前只在 soso-music 的客户端里实现,而且其实也只算部分吧,https://github.com/jsososo/soso-music/blob/master/server/route/find.js 这里可能还是有点乱。关于准确度,这个确实是存在一定问题,所以客户端侧我是开放了用户反馈机制,可以手动选择匹配是否错误,进行重新匹配。(不过像周杰伦这种一般都没啥问题)

咪咕音乐匹配的一个好处是,他的链接都是固定的,应该至少在他版权过期之前不会改,可以直接存入缓存/数据库。

另外,咪咕那边官方借口做过修改,我中间也有过很长时间没有更新,现在应该master分支都是ok的,但是我以及下线了在线演示了,因为咪咕会对大量调用的ip进行拉黑,这一块在服务端这边也是你会遇到的一个问题应该。

JumpAlang commented 3 years ago

感谢小哥阳光普及。我目前的备用接口是使用酷我,咪咕背靠移动曲库应该更丰富些

rakuzen25 commented 2 years ago

感谢大佬开发!

我提报一个疑似bug:设置网易云cookie的时候,看到后台log里有不少条类似这样的警告。

2022-05-01 09:16:31.536  WARN 7 --- [nio-8888-exec-4] o.a.h.c.protocol.ResponseProcessCookies  : Invalid cookie header: "set-cookie: __remember_me=true; Max-Age=1296000; Expires=Mon, 16 May 2022 09:15:59 GMT; Path=/;". Invalid 'expires' attribute: Mon, 16 May 2022 09:15:59 GMT

看到有的串在讨论(比如aws/aws-sdk-java-v2#2421)可能是因为默认不支持解析expires属性,需要设置CookieSpecs.STANDARD还是什么,但是我完全不懂java,所以不太确定怎么解决……

环境是用docker部署的。

感谢!

JumpAlang commented 2 years ago

目前可以先用手机号或者邮箱登录,不直接调用setCookies方法。 网易云音乐手机登录 http://www.alang.run:8080/netease/loginByPhone?phone=手机号&pwd=密码 登录成功会返回cookie,后端也自动设置cookie,如果不想登录且已知cookie,也可以使用第4个接口,直接设置cookie 2.网易云音乐邮箱登录 http://www.alang.run:8080/netease/loginByEmail?email=邮箱&pwd=密码 登录成功会返回cookie,后端也自动设置cookie,如果不想登录且已知cookie,也可以使用第4个接口,直接设置cookie

rakuzen25 commented 2 years ago

确实是这样登录的,也确实显示登录成功了,只是感觉报这个警告可能对cookie的过期时间有影响。

我又查了一下,貌似是Unirest库的问题,在Unirest 2里修复了:Kong/unirest-java#97

JumpAlang commented 2 years ago

确实是这样登录的,也确实显示登录成功了,只是感觉报这个警告可能对cookie的过期时间有影响。

我又查了一下,貌似是Unirest库的问题,在Unirest 2里修复了:Kong/unirest-java#97

感谢提醒,此引用的jar包改动有点大,之前jav坐标是:com.mashape 现在改成com.kong,版本变动过大,得下个版本再修复了