https://meting-dd.2333332.xyz/test
Meting后端的api结构较为复杂,基础是一个接口,原作者在此基础上增加了php后端,又用node做了一层wrapper。
同时可以发现原作者在docker hub上传了php后端的镜像,但没有node的镜像(仓库中仍有Dockerfile)。
原作者大佬的api服务可能不太稳定,于是我在上面两个Dockerfile的基础上新生成了单一的Dockerfile,仅仅对外暴露一个3000端口。并且微改了一些代码,适配了vercel的serverless function。这个版本在v1。
此版本解决了一些的问题,但可能还有一些问题,比如:
- 依旧不易自行部署
- 对国内的云函数不太适配
- 新的音乐源扩展、维护困难
- 即使在国内访问,如果后端部署在国外,腾讯系音乐仍然无法解析
为此,我开了个新的分支。
- 纯js实现,化简api结构
- 适配多个PaaS平台,一键部署
- 采用jsonp解决Tencent系地区限制
- 插件系统,编写新接口及音源简单
server参数名称 | 单曲/song | 歌单/playlist | |
---|---|---|---|
网易云 | netease | √ | √ |
qq音乐 | tencent | √ | √ |
youtube music | ytmusic | √ | √ |
more.. |
客户端/浏览器访问地区 | 国内 | 国外 |
---|---|---|
网易云 | √ | √ |
qq音乐 | √¹ | × |
youtube music | √² | √ |
客户端/浏览器访问地区 | 国内 | 国外 |
---|---|---|
网易云 | √ | √ |
qq音乐 | √ | × |
youtube music | √² | √ |
¹使用jsonp,需要替换前端插件, https://cdn.jsdelivr.net/npm/[email protected]/dist/Meting.min.js => https://cdn.jsdelivr.net/npm/@xizeyoupan/meting@latest/dist/Meting.min.js , or https://unpkg.com/[email protected]/dist/Meting.min.js => https://unpkg.com/@xizeyoupan/meting@latest/dist/Meting.min.js
More info https://github.com/xizeyoupan/MetingJS
²见下方参数配置
以下参数均由环境变量配置
- YT_API 默认的youtube music api地址。youtube music的可用性取决于YT_API的连通性。已经内置了一个。如果你需要自己部署youtube music api,此仓库提供示例。注:youtube music api必须部署在国外!
- OVERSEAS 用于判断是否部署于国外。设为1会启用qq音乐的jsonp返回,同时需要替换前端插件,能实现国内访问国外api服务解析qq音乐。部署在国内不用设置这个选项。当部署到vercel上时,此选项自动设为1。
- PORT api监听端口,也是docker需要映射的端口。默认3000
- UID 用于docker,默认1010
- GID 用于docker,默认1010
仅为示例,不保证稳定性
https://meting-dd.2333332.xyz/api => Deno Deploy
https://meting-ve.2333332.xyz/api => vercel
https://m.boochinoob.shop/api => cloudflare (deprecated, see below)
可自行测试,如 https://meting-dd.2333332.xyz/test
部署 Meting-API 需要基本的计算机编程常识,如果您在部署过程中遇到无法解决的问题请到 issues 向我们提问,我们会尽快给您答复。
如果部署成功,在你的域名后拼接上/test
,理论上出现类似下图数据:
需要克隆项目到本地,node版本>=18。
npm i
npm run build:all
node node.js
deno run --allow-net --allow-env dist/deno.js
或者直接下载action中的文件运行。
运行下面的命令下载 Meting-API 镜像
docker pull intemd/meting-api:latest
然后运行 Meting-API 即可
docker run -d --name meting -p 3000:3000 intemd/meting-api:latest
比较出名,提供的域名被阻断,使用自有域名后速度尚可。冷启动速度一般。
一直下一步即可。
deprecated
由于cf会自动去除x-real-ip以及在headers中加shit,网易云可能会失效。使用网易云的同学请尝试其他部署方式。
在全球拥有数据中心,提供的域名被阻断,使用自有域名后速度很快。冷启动速度很快。
fork本项目,依次点击actions/publish/run workflow。保持默认即可。待CI构建结束后下载cloudflare-workers.js并解压。在Workers创建一个Service,点右上角Quick edit。把cloudflare-workers.js的内容复制进去deploy即可。
类似Cloudflare Workers,但提供的域名未被阻断,使用Deno为runtime。
fork本项目后新建一个project,首先在设置中加一个Environment Variable,名称是OVERSEAS,值为1。接着link到你自己的项目,部署方式选action,project的name需要与你自己的yml吻合。
uses: denoland/deployctl@v1
with:
project: meting #这里要改成你的project的name
entrypoint: deno.js
接着在actions/publish/run workflow中勾选Deno即可。
部署到国内平台
目前国内云服务商呈现两超多强的态势。本人到官方文档翻来翻去,发现各厂商免费的云函数服务是越来越少了,腾讯云免费额度就三个月,阿里云似乎有一年。
不是华为我不用。因为他是有良心的,中国制造🫡
爆!爆!爆!这下真的爆了!
👆指的是华为云虽然函数工作流有免费额度,但配套的API网关却不免费,这不刚调试完没多久就发现欠费1分钱,无奈被迫充值了1元。理论上1元应该能用挺久的。当然你如果没有1元,也可以选择充1毛试试水。
-
注册并认证
- 中国站需要手机验证码+实名认证。
- 外国站需要手机验证码+可用的Visa/MasterCard/*信用卡。
-
下载镜像
-
上传镜像
- 登录镜像服务,选择页面上传,创建一个名字随意的组织,上传镜像。
- 点击meting-api,找到下载指令,复制 docker pull 后面的镜像地址。
-
创建函数
- 在函数服务点击创建函数。注意类型选HTTP。
- 区域选国内的,并且后续服务也建议开在相同区域。
- 镜像填刚刚复制的地址。
-
创建委托
- 名称随便。
- 类型选云服务。
- 云服务选择"函数工作流 FunctionGraph"。
- 下一步策略勾选"SWR Admin"即可。
- 一路完成,返回创建函数页面选择刚创建的委托,创建函数。
-
设置函数
-
设置网关
-
完成
总结一下:华为云的这个服务确实又臭又长,对于大公司可能叫生态丰富,体系健全,但对想快速上手的同学确实不太友好。各服务之间的文档分布松散,难以跳转。在我写这段话的时候还突然抽风了几小时,我还以为昨晚能跑的代码怎么睡一觉就不好使了。当然把Meting用js重写可能会是一个更好的选择。
对于很多HTTP框架的代理来说,只需设置X-Forwarded请求头或transparent proxy。但由于本项目使用了轻量化框架Hono,进行反向代理的时候可能会产生一些令人不适的链接。这里我用了一个自定义的请求头X-Forwarded-Url
来暴力处理origin和路径的前缀。
比如我用nginx想让请求 http://localhost:8099/meting
的流量全部转发到 http://localhost:3000
,直接这么写是不行的:
server {
listen 8099;
server_name localhost;
location /meting/ {
proxy_pass http://localhost:3000/;
}
}
正确写法:
-
nginx
server { listen 8099; server_name localhost; location /meting/ { proxy_pass http://localhost:3000/; proxy_set_header X-Forwarded-Url $scheme://$host:$server_port/meting; } }
-
caddy
http://localhost:8099 { handle_path /meting* { reverse_proxy http://localhost:3000 { header_up X-Forwarded-Url {scheme}://{host}:{port}/meting } } }
在上面基础上改动即可。
-
nginx
server { listen 8099 ssl; server_name localhost; ssl_certificate ../server.crt; # pem文件的路径 ssl_certificate_key ../server.key; # key文件的路径 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location /meting/ { proxy_pass http://localhost:3000/; proxy_set_header X-Forwarded-Url $scheme://$host:$server_port/meting; } }
-
caddy
https://localhost:8099 { tls ./server.crt ./server.key handle_path /meting* { reverse_proxy http://localhost:3000 { header_up X-Forwarded-Url {scheme}://{host}:{port}/meting } } }
在导入前端插件前,加入
<script>
var meting_api='http://example.com/api?server=:server&type=:type&id=:id&auth=:auth&r=:r';
</script>
比如
<script>
var meting_api='http://localhost:3000/api?server=:server&type=:type&id=:id&auth=:auth&r=:r';
</script>
即可。就这样吧,那我去看vtb了,88
https://github.com/metowolf/MetingJS
https://github.com/metowolf/Meting-API
https://github.com/honojs/hono
https://github.com/honojs/node-server
https://github.com/camsong/fetch-jsonp