From ff569d339cf0e2505b3c9f16c447bbfd69415730 Mon Sep 17 00:00:00 2001 From: QAIU <736226400@qq.com> Date: Mon, 21 Oct 2024 19:14:29 +0800 Subject: [PATCH] 1. add music parser --- .../src/main/java/cn/qaiu/parser/PanBase.java | 9 +- .../cn/qaiu/parser/PanDomainTemplate.java | 10 ++ .../java/cn/qaiu/parser/impl/MkgTool.java | 97 +++++++++++ .../java/cn/qaiu/parser/impl/MkwTool.java | 62 +++++++ .../java/cn/qaiu/parser/impl/MmgTool.java | 25 +++ .../java/cn/qaiu/parser/impl/MneTool.java | 7 +- .../java/cn/qaiu/parser/impl/MqqTool.java | 65 ++++++++ .../src/main/java/cn/qaiu/util/AESUtils.java | 69 ++++++++ .../src/main/java/cn/qaiu/util/JsContent.java | 37 +++++ .../main/java/cn/qaiu/util/JsExecUtils.java | 38 +++++ .../src/main/java/cn/qaiu/util/URLUtil.java | 40 +++++ .../qaiu/parser}/WebClientExample.java | 2 +- .../test => cn/qaiu/util}/TestAESUtil.java | 2 +- .../web/test => cn/qaiu/util}/TestRegex.java | 2 +- .../test/java/cn/qaiu/util/URLUtilTest.java | 19 +++ .../java/qaiu/web/test/TestWebClient2.java | 54 ------ web-service/src/main/resources/app-dev.yml | 2 + .../main/resources/http-tools/pan-mkg.http | 45 +++++ .../main/resources/http-tools/pan-mne.http | 157 ++++++++++++++++++ .../src/main/resources/http-tools/test.http | 7 + .../src/main/resources/server-proxy.yml | 2 +- 21 files changed, 689 insertions(+), 62 deletions(-) create mode 100644 parser/src/main/java/cn/qaiu/parser/impl/MkgTool.java create mode 100644 parser/src/main/java/cn/qaiu/parser/impl/MkwTool.java create mode 100644 parser/src/main/java/cn/qaiu/parser/impl/MmgTool.java create mode 100644 parser/src/main/java/cn/qaiu/parser/impl/MqqTool.java create mode 100644 parser/src/main/java/cn/qaiu/util/URLUtil.java rename parser/src/test/java/{qaiu/web/test => cn/qaiu/parser}/WebClientExample.java (98%) rename parser/src/test/java/{qaiu/web/test => cn/qaiu/util}/TestAESUtil.java (99%) rename parser/src/test/java/{qaiu/web/test => cn/qaiu/util}/TestRegex.java (96%) create mode 100644 parser/src/test/java/cn/qaiu/util/URLUtilTest.java delete mode 100644 parser/src/test/java/qaiu/web/test/TestWebClient2.java create mode 100644 web-service/src/main/resources/http-tools/pan-mkg.http diff --git a/parser/src/main/java/cn/qaiu/parser/PanBase.java b/parser/src/main/java/cn/qaiu/parser/PanBase.java index 52a0d18..595c77d 100644 --- a/parser/src/main/java/cn/qaiu/parser/PanBase.java +++ b/parser/src/main/java/cn/qaiu/parser/PanBase.java @@ -15,7 +15,10 @@ import org.slf4j.LoggerFactory; /** * 解析器抽象类包含promise, HTTP Client, 默认失败方法等; - * 新增网盘解析器需要继承该类. + * 新增网盘解析器需要继承该类.
+ *

实现类命名规则:

+ *

{网盘标识}Tool, 网盘标识不超过3个字符, 可以取网盘名称首字母缩写或拼音首字母,
+ * 音乐类型的解析以M开头, 例如网易云音乐Mne

*/ public abstract class PanBase implements IPanTool { protected Logger log = LoggerFactory.getLogger(this.getClass()); @@ -55,6 +58,10 @@ public abstract class PanBase implements IPanTool { this.shareLinkInfo = shareLinkInfo; } + protected PanBase() { + } + + /** * 失败时生成异常消息 * diff --git a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java index 0aa7826..667fc65 100644 --- a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java +++ b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java @@ -80,6 +80,16 @@ public enum PanDomainTemplate { "http(s)?://163cn\\.tv/(.+)", "http://163cn.tv/{shareKey}", MneTool.class), + // https://c6.y.qq.com/base/fcgi-bin/u?__=xxx + MQQ("QQ音乐", + "https://(.+)\\.y\\.qq\\.com/base/fcgi-bin/u\\?__=(.+)", + "https://c6.y.qq.com/base/fcgi-bin/u?__={shareKey}", + MqqTool.class), + // https://t1.kugou.com/song.html?id=xxx + MKG("酷狗音乐", + "https://(.+)\\.kugou\\.com/song\\.html\\?id=(.+)", + "https://t1.kugou.com/song.html?id={shareKey}", + MkgTool.class), // https://pan.huang1111.cn/s/xxx // 通用域名([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,} CE("Cloudreve", diff --git a/parser/src/main/java/cn/qaiu/parser/impl/MkgTool.java b/parser/src/main/java/cn/qaiu/parser/impl/MkgTool.java new file mode 100644 index 0000000..e8dcd48 --- /dev/null +++ b/parser/src/main/java/cn/qaiu/parser/impl/MkgTool.java @@ -0,0 +1,97 @@ +package cn.qaiu.parser.impl; + +import cn.qaiu.entity.ShareLinkInfo; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.URLUtil; +import io.vertx.core.Future; +import io.vertx.core.MultiMap; +import io.vertx.core.json.JsonObject; +import io.vertx.uritemplate.UriTemplate; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 酷狗音乐分享 + */ +public class MkgTool extends PanBase { + + public static final String API_URL = "https://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash={hash}"; + + private static final MultiMap headers = MultiMap.caseInsensitiveMultiMap(); + static { + // 设置 User-Agent + headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"); + + // 设置 Accept + headers.set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"); + + // 设置 If-Modified-Since + headers.set("If-Modified-Since", "Mon, 21 Oct 2024 08:45:50 GMT"); + + // 设置 Priority + headers.set("Priority", "u=0, i"); + + // 设置 Sec-CH-UA + headers.set("Sec-CH-UA", "\"Microsoft Edge\";v=\"129\", \"Not=A?Brand\";v=\"8\", \"Chromium\";v=\"129\""); + + // 设置 Sec-CH-UA-Mobile + headers.set("Sec-CH-UA-Mobile", "?0"); + + // 设置 Sec-CH-UA-Platform + headers.set("Sec-CH-UA-Platform", "\"Windows\""); + + // 设置 Sec-Fetch-Dest + headers.set("Sec-Fetch-Dest", "document"); + + // 设置 Sec-Fetch-Mode + headers.set("Sec-Fetch-Mode", "navigate"); + + // 设置 Sec-Fetch-Site + headers.set("Sec-Fetch-Site", "none"); + + // 设置 Sec-Fetch-User + headers.set("Sec-Fetch-User", "?1"); + + // 设置 Upgrade-Insecure-Requests + headers.set("Upgrade-Insecure-Requests", "1"); + }; + + public MkgTool(ShareLinkInfo shareLinkInfo) { + super(shareLinkInfo); + } + + public Future parse() { + String shareUrl = shareLinkInfo.getStandardUrl(); + // String shareUrl = "https://t1.kugou.com/song.html?id=2bi8Fe9CSV3"; + clientNoRedirects.getAbs(shareUrl).send().onSuccess(res -> { + String locationURL = res.headers().get("Location"); + client.getAbs(locationURL).putHeaders(headers).send().onSuccess(res2->{ + String body = res2.bodyAsString(); + // 正则表达式匹配 hash 字段 + String regex = "\"hash\"\s*:\s*\"([A-F0-9]+)\""; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(body); + + // 查找并输出 hash 字段的值 + if (matcher.find()) { + String hashValue = matcher.group(1); // 获取第一个捕获组 + System.out.println(hashValue); + client.getAbs(UriTemplate.of(API_URL)).setTemplateParam("hash", hashValue).send().onSuccess(res3 -> { + JsonObject jsonObject = asJson(res3); + System.out.println(jsonObject.encodePrettily()); + if (jsonObject.containsKey("url")) { + promise.complete(jsonObject.getString("url")); + } else { + fail("下载链接不存在"); + } + }).onFailure(handleFail(API_URL.replace("{hash}", hashValue))); + } else { + fail("歌曲hash匹配失败, 可能分享已失效"); + } + }).onFailure(handleFail(locationURL)); + }).onFailure(handleFail(shareUrl)); + + return promise.future(); + } +} diff --git a/parser/src/main/java/cn/qaiu/parser/impl/MkwTool.java b/parser/src/main/java/cn/qaiu/parser/impl/MkwTool.java new file mode 100644 index 0000000..d266918 --- /dev/null +++ b/parser/src/main/java/cn/qaiu/parser/impl/MkwTool.java @@ -0,0 +1,62 @@ +package cn.qaiu.parser.impl; + +import cn.qaiu.entity.ShareLinkInfo; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.JsExecUtils; +import io.vertx.core.Future; +import io.vertx.uritemplate.UriTemplate; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 酷我音乐分享 + * 分享示例 + */ +public class MkwTool extends PanBase { + + public static final String API_URL = "https://www.kuwo.cn/api/v1/www/music/playUrl?mid={mid}&type=music&httpsStatus=1&reqId=&plat=web_www&from="; + + + public MkwTool(ShareLinkInfo shareLinkInfo) { + super(shareLinkInfo); + } + + public Future parse() { +// String shareUrl = shareLinkInfo.getStandardUrl(); + String shareUrl = "https://kuwo.cn/play_detail/395500809"; + clientSession.getAbs(shareUrl).send().onSuccess(result -> { + String cookie = result.headers().get("set-cookie"); + + if (!cookie.isEmpty()) { + + String regex = "([A-Za-z0-9_]+)=([A-Za-z0-9]+)"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(cookie); + if (matcher.find()) { + System.out.println(matcher.group(1)); + System.out.println(matcher.group(2)); + + var key = matcher.group(1); + var token = matcher.group(2); + String sign = JsExecUtils.getKwSign(token, key); + System.out.println(sign); + clientSession.getAbs(UriTemplate.of(API_URL)).setQueryParam("mid", "395500809") + .putHeader("Secret", sign).putHeader("Cookie", key + "=" + token).send().onSuccess(res -> { + System.out.println(res.bodyAsString()); + }); + } + } + + }); + + return promise.future(); + } + + MkwTool() { + } + + public static void main(String[] args) { + new MkwTool().parse(); + } +} diff --git a/parser/src/main/java/cn/qaiu/parser/impl/MmgTool.java b/parser/src/main/java/cn/qaiu/parser/impl/MmgTool.java new file mode 100644 index 0000000..07aa2cc --- /dev/null +++ b/parser/src/main/java/cn/qaiu/parser/impl/MmgTool.java @@ -0,0 +1,25 @@ +package cn.qaiu.parser.impl; + +import cn.qaiu.entity.ShareLinkInfo; +import cn.qaiu.parser.PanBase; +import io.vertx.core.Future; +import io.vertx.uritemplate.UriTemplate; + +/** + * 咪咕音乐分享 + */ +public class MmgTool extends PanBase { + + public static final String API_URL = ""; + + + public MmgTool(ShareLinkInfo shareLinkInfo) { + super(shareLinkInfo); + } + + public Future parse() { + String shareUrl = shareLinkInfo.getStandardUrl(); + + return promise.future(); + } +} diff --git a/parser/src/main/java/cn/qaiu/parser/impl/MneTool.java b/parser/src/main/java/cn/qaiu/parser/impl/MneTool.java index c79f2ce..7fcd84e 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/MneTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/MneTool.java @@ -2,12 +2,14 @@ package cn.qaiu.parser.impl; import cn.qaiu.entity.ShareLinkInfo; import cn.qaiu.parser.PanBase; +import cn.qaiu.util.URLUtil; import io.vertx.core.Future; import io.vertx.uritemplate.UriTemplate; /** * 网易云音乐, 单歌曲直链解析 - * 示例分享 + * 示例分享1 + * 示例分享2 */ public class MneTool extends PanBase { @@ -23,8 +25,7 @@ public class MneTool extends PanBase { String shareUrl = shareLinkInfo.getStandardUrl(); clientNoRedirects.getAbs(shareUrl).send().onSuccess(res -> { String locationURL = res.headers().get("Location"); - String substring = locationURL.substring(locationURL.indexOf("id=")); - String id = substring.substring("id=".length(), substring.indexOf('&')); + String id = URLUtil.from(locationURL).getParam("id"); clientNoRedirects.getAbs(UriTemplate.of(API_URL)).setTemplateParam("id", id).send() .onSuccess(res2 -> { promise.complete(res2.headers().get("Location")); diff --git a/parser/src/main/java/cn/qaiu/parser/impl/MqqTool.java b/parser/src/main/java/cn/qaiu/parser/impl/MqqTool.java new file mode 100644 index 0000000..48a7560 --- /dev/null +++ b/parser/src/main/java/cn/qaiu/parser/impl/MqqTool.java @@ -0,0 +1,65 @@ +package cn.qaiu.parser.impl; + +import cn.qaiu.entity.ShareLinkInfo; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.URLUtil; +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.uritemplate.UriTemplate; + + +/** + * + * QQ音乐分享解析 + * 分享示例 + * 详情页 + */ +public class MqqTool extends PanBase { + + public static final String API_URL = "https://u.y.qq.com/cgi-bin/musicu" + + ".fcg?-=getplaysongvkey2682247447678878&g_tk=5381&loginUin=956581739&hostUin=0&format=json&inCharset=utf8" + + "&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data=%7B%22req_0%22%3A%7B%22module%22%3A" + + "%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%222796982635" + + "%22%2C%22songmid%22%3A%5B%22{songmid}%22%5D%2C%22songtype%22%3A%5B1%5D%2C%22uin%22%3A%22956581739%22" + + "%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A956581739%2C" + + "%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D"; + + public MqqTool(ShareLinkInfo shareLinkInfo) { + super(shareLinkInfo); + } + + public Future parse() { + String shareUrl = shareLinkInfo.getStandardUrl(); + // https://c6.y.qq.com/base/fcgi-bin/u?__=uXXtsB + // String shareUrl = "https://c6.y.qq.com/base/fcgi-bin/u?__=k8gafY6HAQ5Y"; + + clientNoRedirects.getAbs(shareUrl).send().onSuccess(res -> { + String locationURL = res.headers().get("Location"); + String id = URLUtil.from(locationURL).getParam("songmid"); + clientNoRedirects.getAbs(UriTemplate.of(API_URL)).setTemplateParam("songmid", id).send().onSuccess(res2 -> { + JsonObject jsonObject = asJson(res2); + System.out.println(jsonObject.encodePrettily()); + try { + JsonObject data = jsonObject.getJsonObject("req_0").getJsonObject("data"); + String path = data.getJsonArray("midurlinfo").getJsonObject(0).getString("purl"); + if (path.isEmpty()) { + fail("暂不支持VIP音乐"); + return; + } + String downURL = data.getJsonArray("sip").getString(0) + .replace("http://", "https://") + path; + System.out.println(downURL); + promise.complete(downURL); + } catch (Exception e) { + fail("获取失败"); + } + }).onFailure(handleFail(API_URL.replace("{id}", id))); + }).onFailure(handleFail(shareUrl)); + + return promise.future(); + } + + public static void main(String[] args) { + new MqqTool(ShareLinkInfo.newBuilder().build()).parse(); + } +} diff --git a/parser/src/main/java/cn/qaiu/util/AESUtils.java b/parser/src/main/java/cn/qaiu/util/AESUtils.java index 767ce10..2514f39 100644 --- a/parser/src/main/java/cn/qaiu/util/AESUtils.java +++ b/parser/src/main/java/cn/qaiu/util/AESUtils.java @@ -329,4 +329,73 @@ public class AESUtils { return _0x53928f + "-" + _0x430930 + "-" + _0x49ec94; } + + public static String encrypt(String str, String pwd) { + if (pwd == null || pwd.length() <= 0) { + throw new IllegalArgumentException("Please enter a password with which to encrypt the message."); + } + + // 生成 prand 值 + StringBuilder prand = new StringBuilder(); + for (int i = 0; i < pwd.length(); i++) { + prand.append((int) pwd.charAt(i)); + } + + // 计算 sPos, mult, incr, modu + int sPos = prand.length() / 5; + long mult = Long.parseLong(prand.substring(sPos, sPos + 1) + + prand.substring(sPos * 2, sPos * 2 + 1) + + prand.substring(sPos * 3, sPos * 3 + 1) + + prand.substring(sPos * 4, sPos * 4 + 1) + + prand.substring(sPos * 5, sPos * 5 + 1)); + int incr = (int) Math.ceil(pwd.length() / 2.0); + long modu = (long) Math.pow(2, 31) - 1; + + if (mult < 2) { + throw new IllegalArgumentException("Algorithm cannot find a suitable hash. Please choose a different password."); + } + + // 生成 salt 并加到 prand 上 + long salt = Math.round(Math.random() * 1000000000) % 100000000; + prand.append(salt); + + // 使用 BigInteger 处理超过 Long 范围的 prand 值 + BigInteger prandValue = new BigInteger(prand.toString()); + while (prandValue.toString().length() > 10) { + prandValue = prandValue.divide(BigInteger.TEN).add(prandValue.remainder(BigInteger.TEN)); + } + + // 将 prand 转换为 long 进行后续处理 + prandValue = prandValue.multiply(BigInteger.valueOf(mult)).add(BigInteger.valueOf(incr)).mod(BigInteger.valueOf(modu)); + + // 加密过程 + StringBuilder encStr = new StringBuilder(); + for (int i = 0; i < str.length(); i++) { + // 将字符和异或的结果强制转换为 int + int encChr = (int) (str.charAt(i) ^ (int) ((prandValue.doubleValue() / modu) * 255)); + String hexStr = Integer.toHexString(encChr); + if (hexStr.length() < 2) { + encStr.append("0"); + } + encStr.append(hexStr); + + prandValue = prandValue.multiply(BigInteger.valueOf(mult)).add(BigInteger.valueOf(incr)).mod(BigInteger.valueOf(modu)); + } + + // 将 salt 转换为 16 进制并追加到加密结果 + String saltHex = Long.toHexString(salt); + while (saltHex.length() < 8) { + saltHex = "0" + saltHex; + } + encStr.append(saltHex); + + return encStr.toString(); + } + + public static void main(String[] args) { + // 示例 + String encrypted = encrypt("HelloWorld", "password123"); + System.out.println("Encrypted String: " + encrypted); + } + } diff --git a/parser/src/main/java/cn/qaiu/util/JsContent.java b/parser/src/main/java/cn/qaiu/util/JsContent.java index ed80ee7..02617b0 100644 --- a/parser/src/main/java/cn/qaiu/util/JsContent.java +++ b/parser/src/main/java/cn/qaiu/util/JsContent.java @@ -149,4 +149,41 @@ public interface JsContent { """; + String kwSignString = """ + function encrypt(str, pwd) { + if (pwd == null || pwd.length <= 0) { + return null; + } + var prand = ""; + for (var i = 0; i < pwd.length; i++) { + prand += pwd.charCodeAt(i).toString(); + } + var sPos = Math.floor(prand.length / 5); + var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5)); + var incr = Math.ceil(pwd.length / 2); + var modu = Math.pow(2, 31) - 1; + if (mult < 2) { + return null; + } + var salt = Math.round(Math.random() * 1000000000) % 100000000; + prand += salt; + while (prand.length > 10) { + prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString(); + } + prand = (mult * prand + incr) % modu; + var enc_chr = ""; + var enc_str = ""; + for (var i = 0; i < str.length; i++) { + enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255)); + if (enc_chr < 16) { + enc_str += "0" + enc_chr.toString(16); + } else enc_str += enc_chr.toString(16); + prand = (mult * prand + incr) % modu; + } + salt = salt.toString(16); + while (salt.length < 8) salt = "0" + salt; + enc_str += salt; + return enc_str; + } + """; } diff --git a/parser/src/main/java/cn/qaiu/util/JsExecUtils.java b/parser/src/main/java/cn/qaiu/util/JsExecUtils.java index 8c31cb0..9d9b830 100644 --- a/parser/src/main/java/cn/qaiu/util/JsExecUtils.java +++ b/parser/src/main/java/cn/qaiu/util/JsExecUtils.java @@ -8,6 +8,8 @@ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; +import static cn.qaiu.util.AESUtils.encrypt; + /** * 执行Js脚本 * @@ -57,4 +59,40 @@ public class JsExecUtils { } + /** + * 调用执行蓝奏云js文件 + */ + public static Object executeOtherJs(String jsText, String funName, Object ... args) throws ScriptException, + NoSuchMethodException { + ScriptEngineManager engineManager = new ScriptEngineManager(); + ScriptEngine engine = engineManager.getEngineByName("JavaScript"); // 得到脚本引擎 + engine.eval(jsText); + Invocable inv = (Invocable) engine; + //调用js中的函数 + if (StringUtils.isNotEmpty(funName)) { + return inv.invokeFunction(funName, args); + } + throw new ScriptException("funName is null"); + } + + public static String getKwSign(String s, String pwd) { + try { + return executeOtherJs(JsContent.kwSignString, "encrypt", s, pwd).toString(); + } catch (ScriptException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) { + //encrypt("ZYcEEs2JdncXG8zAaytJiXxmbyhH2wxb", "Hm_Iuvt_cdb524f42f23cer9b268564v7y735ewrq2324") + //'7909e8e754545a61ba4bc3c90c82cb6c69b6859d5ea2e46a6bf913d1b4f11dee011dced1' + // 1e3170f1cc1ca75172409e443b89261ec777e190ebc595b458b8e114a912a9544d2b467323f8ca011b2ed0 + // 93a44ef48949d950c91303c84d36 + // 95dea502a45fb153f68d8da0bf8e4a095a001e396f60837e9c1b58a48969eb77038234d2 + // 93c3750f6ccf9d11b5c304b32495 + System.out.println(getKwSign("Hm_lvt_cdb524f42f0ce19b169a8071123a4797", "1729503755")); + System.out.println(getKwSign("HelloWorld", "password123")); + + } + } diff --git a/parser/src/main/java/cn/qaiu/util/URLUtil.java b/parser/src/main/java/cn/qaiu/util/URLUtil.java new file mode 100644 index 0000000..1b38a31 --- /dev/null +++ b/parser/src/main/java/cn/qaiu/util/URLUtil.java @@ -0,0 +1,40 @@ +package cn.qaiu.util; + +import java.net.URL; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; + +public class URLUtil { + + private Map queryParams = new HashMap<>(); + + // 构造函数,传入URL并解析参数 + private URLUtil(String url) { + try { + URL parsedUrl = new URL(url); + String query = parsedUrl.getQuery(); + if (query != null) { + String[] pairs = query.split("&"); + for (String pair : pairs) { + String[] keyValue = pair.split("="); + String key = URLDecoder.decode(keyValue[0], "UTF-8"); + String value = keyValue.length > 1 ? URLDecoder.decode(keyValue[1], "UTF-8") : ""; + queryParams.put(key, value); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 静态方法,用于创建UrlUtil实例 + public static URLUtil from(String url) { + return new URLUtil(url); + } + + // 获取参数的方法 + public String getParam(String param) { + return queryParams.get(param); + } +} diff --git a/parser/src/test/java/qaiu/web/test/WebClientExample.java b/parser/src/test/java/cn/qaiu/parser/WebClientExample.java similarity index 98% rename from parser/src/test/java/qaiu/web/test/WebClientExample.java rename to parser/src/test/java/cn/qaiu/parser/WebClientExample.java index 98e944a..c27a1be 100644 --- a/parser/src/test/java/qaiu/web/test/WebClientExample.java +++ b/parser/src/test/java/cn/qaiu/parser/WebClientExample.java @@ -1,4 +1,4 @@ -package qaiu.web.test; +package cn.qaiu.parser; import io.vertx.core.MultiMap; import io.vertx.core.Vertx; diff --git a/parser/src/test/java/qaiu/web/test/TestAESUtil.java b/parser/src/test/java/cn/qaiu/util/TestAESUtil.java similarity index 99% rename from parser/src/test/java/qaiu/web/test/TestAESUtil.java rename to parser/src/test/java/cn/qaiu/util/TestAESUtil.java index 67a4a48..016145a 100644 --- a/parser/src/test/java/qaiu/web/test/TestAESUtil.java +++ b/parser/src/test/java/cn/qaiu/util/TestAESUtil.java @@ -1,4 +1,4 @@ -package qaiu.web.test; +package cn.qaiu.util; import cn.qaiu.util.AESUtils; import org.junit.Assert; diff --git a/parser/src/test/java/qaiu/web/test/TestRegex.java b/parser/src/test/java/cn/qaiu/util/TestRegex.java similarity index 96% rename from parser/src/test/java/qaiu/web/test/TestRegex.java rename to parser/src/test/java/cn/qaiu/util/TestRegex.java index f6f66bf..610f834 100644 --- a/parser/src/test/java/qaiu/web/test/TestRegex.java +++ b/parser/src/test/java/cn/qaiu/util/TestRegex.java @@ -1,4 +1,4 @@ -package qaiu.web.test; +package cn.qaiu.util; import org.junit.Test; diff --git a/parser/src/test/java/cn/qaiu/util/URLUtilTest.java b/parser/src/test/java/cn/qaiu/util/URLUtilTest.java new file mode 100644 index 0000000..0b49f10 --- /dev/null +++ b/parser/src/test/java/cn/qaiu/util/URLUtilTest.java @@ -0,0 +1,19 @@ +package cn.qaiu.util; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class URLUtilTest { + + @Test + public void getParam() { + + URLUtil util = URLUtil.from("https://i.y.qq.com/v8/playsong.html?ADTAG=cbshare&_wv=1&appshare=android_qq" + + "&appsongtype=1&appversion=13100008&channelId=10036163&hosteuin=7iosow-s7enz&openinqqmusic=1&platform" + + "=11&songmid=000XjcLg0fbRjv&type=0"); + Assert.assertEquals(util.getParam("songmid"), "000XjcLg0fbRjv"); + Assert.assertEquals(util.getParam("type"), "0"); + } +} diff --git a/parser/src/test/java/qaiu/web/test/TestWebClient2.java b/parser/src/test/java/qaiu/web/test/TestWebClient2.java deleted file mode 100644 index f8fcb05..0000000 --- a/parser/src/test/java/qaiu/web/test/TestWebClient2.java +++ /dev/null @@ -1,54 +0,0 @@ -package qaiu.web.test; - -import io.vertx.core.MultiMap; -import io.vertx.core.Vertx; -import io.vertx.core.json.JsonObject; -import io.vertx.ext.web.client.WebClient; -import org.junit.Test; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class TestWebClient2 { - - @Test - public void matcherHtml() { - - Pattern compile = Pattern.compile("class=\"ifr2\" name=.+src=\"(/fn\\?[a-zA-Z0-9_+/=]{16,})\""); - var text = """ -
-"""; - System.out.println(text); - Matcher matcher = compile.matcher(text); - if (matcher.find()) { - System.out.println(matcher.group(0)); - System.out.println(matcher.group(1)); - } - } - - @Test - public void lzClient() { - Vertx vertx = Vertx.vertx(); - WebClient client = WebClient.create(vertx); - MultiMap form = MultiMap.caseInsensitiveMultiMap(); - - - // action=downprocess&sign=AGYHOQk4BjdTWgQ7BzcGOlU_bATVSNQMxBDFQZgZoBj4HMFEgWnMOZ1I1A2NWOgUxB20HMlM_aUGoLOgQz&p=e4k4 - form.set("action", "downprocess"); - form.set("sign", "VzFWaA4_aBzYIAQI9ADBUaARvATVRNlNhUGUBNwBuATkDNFEgXHVVPAZhB2dTP1ZiVD5UYQBpV2EBPwA3"); - form.set("p", "e4k4"); - client.postAbs("https://wwsd.lanzoue.com/ajaxm.php") - .putHeader("referer", "https://wwsd.lanzoue.com/iFhd00x8k0kh") - .sendForm(form).onSuccess(res -> { - JsonObject jsonObject = res.bodyAsJsonObject(); - System.out.println(jsonObject); - - vertx.close(); - }); - - // - // https://developer.lanzoug.com/file/?VTMBPwEwU2IGD1dvV2ICblBvU2sENQZhVSZSMAA1WihSOVYsDTZTZlN2UXMFfAZjBzJXJQAxAG5XP1UyXGQGKlVlAXgBbVMpBmNXLFdhAmpQZFN4BCEGbVUiUnIAOloyUj5WZA0PU25TYVE6BWAGNgdlV2IAbQAyV2JValw3BiFVMwElAWFTNgZmVzBXMwIyUDpTYARrBiJVIlIkAGFaaVJiVjMNY1MoUzVRMgV+BjUHaFd9ADwAMVdlVTFcOAYyVWcBYgFqUz4GaVdlVzMCNFBrUzcEOAZgVWJSZQA/WmJSM1Y2DWhTNFMzUTEFYgY3B2VXZgBxAHhXOVUjXCYGclUmATMBLlNuBjRXPFcyAjNQP1NvBG8GPVVqUnIAKFoyUj9WZA02UzpTNFExBWkGMgdtV2IAaQAxV2FVYFwuBilVcwEwATBTcAZtVzBXNQI7UD9TZgRrBjFVY1JlAGlafVInVnENJ1M6UzRRMQVpBjIHbVdiAG0AMldgVWRcJgZyVTwBJgFhUzYGYVczVy0CMVA5U2QEdQY1VWZSYgByWmxSag== - // https://developer.lanzoug.com/file/?B2FWaA4/BDVTWgc/UWRVOQQ7BT1VZFYxUSJUNgE0UiAEbwJ4CDMOOwInU3EKc1w5ATRSIAIzUz1ROVcwATkDLwc3Vi8OYgR+UzYHfFFnVT0EMAUuVXBWPVEmVHQBO1I6BGgCMAgKDjMCMFM4Cm9cbAFjUmcCb1NhUWRXaAFqAyQHYVZyDm4EYVMzB2BRNVVlBG4FNlU6VnJRJlQiAWBSYQQ0AmcIZg51AmRTMApxXG8BblJ4Aj5TYlFjVzMBZQM3BzVWNQ5lBGlTPAc1UTVVYwQ/BWFVaVYwUWZUYwE+UmoEZQJiCG0OaQJiUzMKbVxtAWNSYwJzUytRP1chAXsDdwd0VmQOIQQ5U2EHbFE0VWQEawU5VT5WbVFuVHQBKVI6BGkCMAgzDmcCZVMzCmZcaAFrUmcCaFNlUWNXZwFzAywHIVZnDj8EJ1M4B2BRM1VsBGsFMFU6VmZRb1RgAW5SdQRxAiUIIg5nAmVTMwpmXGgBa1JnAm9TYVFmV2YBewN3B25WcQ5uBGFTNAdjUStVZgRtBTJVJFZlUWJUZAFzUmQEPA== - // https://developer.lanzoug.com/file/?CW9WaAk4BzZUXVRsCz5cMAE+Bj5UZVM0USJUNlRhA3FUPwJ4CTJUYQInASMHflI3ATQGdFdmAW9ROQFmVGwEKAk5Vi8JZQd9VDFULws9XDQBNQYtVHFTOFEmVHRUbgNrVDgCMAkLVGkCMAFqB2JSYgFjBjNXOgEzUWQBPlQ/BCMJb1ZyCWkHYlQ0VDMLb1xsAWsGNVQ7U3dRJlQiVDUDMFRkAmcJZ1QvAmQBYgd8UmEBbgYsV2sBMFFjAWVUMAQwCTtWNQliB2pUO1RmC29cagE6BmJUaFM1UWZUY1RrAztUNQJiCWxUMwJiAWEHYFJjAWMGN1cmAXlRPwF3VC4EcAl6VmQJJgc6VGZUPwtuXG0BbgY6VD9TaFFuVHRUfANrVDkCMAkyVD0CZQFhB2tSZgFrBjNXPgE6UWABM1QmBCsJL1ZnCTgHJFQ/VDMLaVxlAW4GM1Q7U2RRb1RmVDgDJFQhAiUJI1Q9AmUBYQdrUmYBawYzVzoBM1FmATBULgRwCWBWcQlpB2JUM1QwC3FcbwFoBjFUJVNgUWJUZFQmAzVUbA== - } -} diff --git a/web-service/src/main/resources/app-dev.yml b/web-service/src/main/resources/app-dev.yml index e345e3f..3987e60 100644 --- a/web-service/src/main/resources/app-dev.yml +++ b/web-service/src/main/resources/app-dev.yml @@ -58,5 +58,7 @@ cache: ws: ye: mne: 30 + mqq: 30 + mkg: 30 diff --git a/web-service/src/main/resources/http-tools/pan-mkg.http b/web-service/src/main/resources/http-tools/pan-mkg.http new file mode 100644 index 0000000..33e4b30 --- /dev/null +++ b/web-service/src/main/resources/http-tools/pan-mkg.http @@ -0,0 +1,45 @@ +#@no-cookie-jar +#@no-redirect +https://t1.kugou.com/song.html?id=2bi8Fe9CSV3 + + +### +GET https://www.kugou.com/share/2bi8Fe9CSV3.html?id=2bi8Fe9CSV3 +accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 +if-modified-since: Mon, 21 Oct 2024 08:45:50 GMT +priority: u=0, i +sec-ch-ua: "Microsoft Edge";v="129", "Not=A?Brand";v="8", "Chromium";v="129" +sec-ch-ua-mobile: ?0 +sec-ch-ua-platform: "Windows" +sec-fetch-dest: document +sec-fetch-mode: navigate +sec-fetch-site: none +sec-fetch-user: ?1 +upgrade-insecure-requests: 1 +user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0 + +### + + +https://www.kuwo.cn/api/v1/www/music/playUrl?mid=395500809&type=music&httpsStatus=1&reqId=&plat=web_www&from= +Cookie: Hm_Iuvt_cdb524f42f23cer9b268564v7y735ewrq2324=c7nkKBeXXzCyTQ8Wc8DRNYc4Th3f6hTE +Secret: 4067e5c95a650d73865fe3e81feb897a6bf7b58579a3ff335de848ffb0ee31c9058333c0 + +### +https://nmobi.kuwo.cn/mobi.s?f=kuwo&q=NI8S5evAnmGldi4g47EsqtfDbGsJckckbTQQd2LAgmDPITUWSd51OkjHRFj6xHPEQxNN6u+tD3K2e3HYhbE4U0pUYwqjd2kt + +### +https://m.kuwo.cn/newh5/singles/songinfoandlrc?musicId=395500809 + +### +https://kuwo.cn/api/v1/www/music/playUrl?mid=395500809&type=music&httpsStatus=1&reqId=e09294a0-8f90-11ef-9b50-49e06d70bd68&plat=web_www&from= + +### +https://kuwo.cn/play_detail/395500809 + +### +#@no-cookie-jar +https://www.kuwo.cn/api/v1/www/music/playUrl?mid=395500809&type=music&httpsStatus=1&reqId=&plat=web_www&from= +Cookie: Hm_Iuvt_cdb524f42f23cer9b268564v7y735ewrq2324=eZCHRdwSSYkG4d5XRGYtXrMpAXmGE5mh +Secret: 460ac8ea43431f788d7ccbd67fde84755a88a8a36f88d17748d816dec3b308e402f768e8 + diff --git a/web-service/src/main/resources/http-tools/pan-mne.http b/web-service/src/main/resources/http-tools/pan-mne.http index 6c0d593..647c121 100644 --- a/web-service/src/main/resources/http-tools/pan-mne.http +++ b/web-service/src/main/resources/http-tools/pan-mne.http @@ -9,3 +9,160 @@ https://music.163.com/song?id=233334 ### #@no-redirect https://music.163.com/song/media/outer/url?id=233334 + + +### +https://u.y.qq.com/cgi-bin/musicu.fcg?songmid=002MFDAV3rPFlo +referer: https://y.qq.com/portal/profile.html +user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 + + +### +POST https://u.y.qq.com/cgi-bin/musicu.fcg +referer: https://y.qq.com/portal/profile.html +Content-Type:application/json;charset=UTF-8 +user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 + +{"comm":{"ct":19,"cv":1845},"music.search.SearchCgiService":{"method":"DoSearchForQQMusicDesktop","module":"music.search.SearchCgiService","param":{"query":"周杰伦","num_per_page":30,"page_num":1}}} + + +### +https://c.y.qq.com/soso/fcgi-bin/search_for_qq_cp?g_tk=5381&uin=0&format=jsonp&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=h5&needNewCode=1&w='+val+'&zhidaqu=1&catZhida=1&t=0&flag=1&ie=utf-8&sem=1&aggr=0&perpage=20&n=20&p=1&remoteplace=txt.mqq.all&_=1520833663464 + + +### +http://api.bzqll.com/music/tencent/url?key=579621905&id=002MFDAV3rPFlo + +### +https://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg?songmid=002MFDAV3rPFlo +referer: https://y.qq.com/portal/profile.html +user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36 + +### +{"songmid": "002MFDAV3rPFlo", "platform": "yqq", "format": "json"} + +### + 'method' => 'GET', + 'url' => 'https://c.y.qq.com/v8/fcg-bin/fcg_play_single_song.fcg', + 'body' => array( + 'songmid' => $id, + 'platform' => 'yqq', + 'format' => 'json', + ), + 'format' => 'data', + + +### +https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg?g_tk=5381&uin=0&format=json&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=h5&needNewCode=1&tpl=3&page=detail&type=top&topid=36&_=1520777874472 + + +### +#@no-redirect +https://ws6.stream.qqmusic.qq.com/C400002a92Ao2TkHtl.m4a?guid=154085405&vkey=5CDECF499AA68CC5BECAB743B65A228B23541E276FC72CCEEF86DE5115F08D99C2D39CF4B20E7F9C76FF9EDA0D69FC5DDDC7CD92E17E7D38&uin=736226400&fromtag=120032&src=C600002hjf5d37WuNj.m4a + +### +http://dl.stream.qqmusic.qq.com/C100002B2EAA3brD5b.m4a?fromtag=38 + +### +POST https://u6.y.qq.com/cgi-bin/musics.fcg?_=1729474959529&sign=zzccf85a72agaweavmzguqxtrh2ozqekbdifsa9252c73 + +{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":736226400,"g_tk_new_20200303":224534732,"g_tk":224534732},"req_1":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":"001jFl4s2mgq6C","songID":527017844}},"req_2":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":"527017844","biz_sub_type":0}]}},"req_3":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":"002aZXjY0I7FdO"}},"req_4":{"module":"music.vkey.GetVkey","method":"GetUrl","param":{"guid":"2127560444","songmid":["001jFl4s2mgq6C"],"songtype":[0],"uin":"736226400","loginflag":1,"platform":"20"}}} +### +POST https://u6.y.qq.com/cgi-bin/musics.fcg?_=1729474959529&sign=zzccf85a72agaweavmzguqxtrh2ozqekbdifsa9252c73 +cookie: ptcz=6d7ee39c2233e09bcfae35e2342318fdfee5ab158e4a76d9a62102274ef34949; _clck=70lnr8|1|fmy|0; _qimei_uuid42=189070d23041001ab37e04a6e648f5c498cdaed314; pac_uid=0_SwYcnFy8AH0T2; _qimei_fingerprint=a923cb1832ef7822b94183ed0c00b1dd; _qimei_q36=; _qimei_h38=fdedf3b6b37e04a6e648f5c40200000b818907; ptui_loginuin=736226400; RK=tQXcoxUWOc; _qpsvr_localtk=0.45536025016981263; ts_uid=2654832736; pgv_pvid=2268917085; fqm_pvqid=f95b5969-a599-41f8-8a6c-c6f20ab16afd; fqm_sessionid=6d07efc8-7fbe-43fd-ba18-82ec08370845; pgv_info=ssid=s6481288078; ts_refer=ADTAGh5_playsong; login_type=1; qm_keyst=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; tmeLoginType=2; uin=736226400; euin=7iosow-s7enz; wxopenid=; psrf_musickey_createtime=1729473810; qqmusic_key=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; wxunionid=; psrf_qqaccess_token=448E090ED1C010135068CA37953E13B8; psrf_qqunionid=40847723EC5B5CD0F0F3A4D988FD324B; psrf_qqrefresh_token=369F406AB6DB8E3428E5A90F43EE3146; psrf_qqopenid=5F276E349AF31A352B0D07BB22E86773; music_ignore_pskey=202306271436Hn@vBj; wxrefresh_token=; psrf_access_token_expiresAt=1737249810; ts_last=y.qq.com/n/ryqq/player +referer: https://y.qq.com/ + +{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":736226400,"g_tk_new_20200303":224534732,"g_tk":224534732},"req_1":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":"001jFl4s2mgq6C","songID":527017844}},"req_2":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":"527017844","biz_sub_type":0}]}},"req_3":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":"002aZXjY0I7FdO"}},"req_4":{"module":"music.vkey.GetVkey","method":"GetUrl","param":{"guid":"2127560444","songmid":["001jFl4s2mgq6C"],"songtype":[0],"uin":"736226400","loginflag":1,"platform":"20"}}}: +### +{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":736226400,"g_tk_new_20200303":224534732,"g_tk":224534732},"req_1":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":"001jFl4s2mgq6C","songID":527017844}},"req_2":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":"527017844","biz_sub_type":0}]}},"req_3":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":"002aZXjY0I7FdO"}},"req_4":{"module":"music.vkey.GetVkey","method":"GetUrl","param":{"guid":"2127560444","songmid":["001jFl4s2mgq6C"],"songtype":[0],"uin":"736226400","loginflag":1,"platform":"20"}}} + +### + +{"code":0,"ts":1729474958812,"start_ts":1729474958706,"traceid":"0371d5609d26abcf","req_1":{"code":0,"data":{"songID":527017844,"songName":"","songType":0,"singerName":"","qrc":0,"crypt":0,"lyric":"W3RpOuS4jeWujOaVtOeahOS6ul0KW2FyOkVyaWPlkajlhbTlk7JdClthbDrkuI3lrozmlbTnmoTkurpdCltieTpdCltvZmZzZXQ6MF0KWzAwOjAwLjAwXeS4jeWujOaVtOeahOS6uiAtIEVyaWPlkajlhbTlk7IKWzAwOjAwLjcwXeivje+8mkhVU0gv5ZGo5YW05ZOyClswMDowMS4xMl3mm7LvvJrlkajlhbTlk7IKWzAwOjAxLjQ3XUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMDowNS4yM11UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAwOjA5LjM5XVRvIGJlIGJyb2tlbgpbMDA6MTIuMDldSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMDoxNi42Ml1XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDA6MjAuMDRdVGhpbmtpbmcgYWJvdXQgeW91ClswMDozNC4wMV3kuI3lrozmlbTnmoTkuroKWzAwOjM3LjE2XeS8pOe7iOeptuaXoOazleaEiOWQiApbMDA6NDQuNjVd5YaN5aaC5L2V5L6n6LqrClswMDo0Ny45M13ov47pnaLnmoTlhajmmK/miJHku6wKWzAwOjU0LjQwXeWDj+S4gOS4quS4quaVjOS6ugpbMDA6NTcuMTNd5ou/5pyA5rex55qE5b+r5LmQClswMDo1OS44M13orr3liLrmiJHnmoTnlqTnl5UKWzAxOjAyLjY5Xei/mOWtpuS4jeS8mgpbMDE6MDUuMDVd5Y+v5piv5oiR6YO96K6w5b6XClswMTowNy45M13mr4/kuIDmrKHnmoTmionmi6kKWzAxOjEwLjQ4XemDveS4uuS6hiDniLHkuroKWzAxOjE2LjEzXUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMToxOS45MV1UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAxOjI0LjA4XVRvIGJlIGJyb2tlbgpbMDE6MjYuNzJdSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMTozMS4zM11XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDE6MzQuODBdVGhpbmtpbmcgYWJvdXQgeW91ClswMTozNy4yM11JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMTo0OC4wN11JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMjowOS45M13mnKrlrozmiJDnmoTkuroKWzAyOjEzLjAxXeemu+WbmuWbsOWPquW3ruS4gOWvuApbMDI6MjAuNTdd6K+l5aaC5L2V5aWL6LqrClswMjoyMy43Ml3miY3og73orqnmmI7lpKnlr7zmraMKWzAyOjMwLjMyXeW9k+S4gOS4quS4quaVjOS6ugpbMDI6MzMuMTFd55So5pyA55yf55qE5Y+j5ZC7ClswMjozNS43MV3lmLLnrJHmiJHnmoTniLHmgagKWzAyOjM4LjM2XemDveaXoOaJgOiwkwpbMDI6NDEuMDRd5Zug5Li65oiR6YO96K6w5b6XClswMjo0My42OF3mr4/kuIDmrKHnmoTmionmi6kKWzAyOjQ2LjM4XemDveS4uuS6hiDniLHkuroKWzAyOjUyLjA1XUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMjo1NS45N11UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAzOjAwLjE2XVRvIGJlIGJyb2tlbgpbMDM6MDIuNzVdSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMzowNy4yNl1XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDM6MTAuNjZdVGhpbmtpbmcgYWJvdXQgeW91ClswMzoxMy41MV1JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMzoyNC4wMl1JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMzozNi4wMV1JIGNhbid0IGxvdmUgc29tZWJvZHkKWzAzOjM5LjA4XVNvbWVib2R5IHNvbWVib2R5ClswMzo1MC4wMF1JIGNhbid0ClswMzo1My4zOF1Tb21lYm9keQpbMDQ6MDAuOTddSSBjYW4ndCBsb3ZlIHNvbWVib2R5IHdpdGggYSBicm9rZW4gaGVhcnQKWzA0OjA1LjM4XVRoYXQgd2Fzbid0IG1lYW50IHRvIGJlIGJyb2tlbgpbMDQ6MTEuMTVdVG8gYmUgYnJva2VuClswNDoxNC42OV1JIGNhbid0IHdyaXRlIGFub3RoZXIgbG92ZSBzb25nIHdpdGggYSBicm9rZW4gaGVhcnQKWzA0OjIwLjA5XVdpdGhvdXQgdGhpbmtpbmcgYWJvdXQgeW91ClswNDoyMi44OF1UaGlua2luZyBhYm91dCB5b3UKWzA0OjIyLjk4XeivjSBMeXJpY2lzdO+8mkhVU0gv5ZGo5YW05ZOyRXJpYyBDaG91ClswNDoyMy4yNF3mm7IgQ29tcG9zZXLvvJrlkajlhbTlk7IgRXJpYyBDaG91ClswNDoyMy40OF1PUO+8muaYn+epuumjnuiFvuWbvemZheWoseS5kOiCoeS7veaciemZkOWFrOWPuE0gU3RhciBFbnRlcnRhaW5tZW50IEx0ZC4v55u45L+h6Z+z5LmQ5Zu96ZmF6IKh5Lu95pyJ6ZmQ5YWs5Y+4QidpbiBNdXNpYyBJbnRlcm5hdGlvbmFsIExpbWl0ZWQKWzA0OjI0LjYzXVNQ77ya546v55CD6Z+z5LmQ5Ye654mI6IKh5Lu95pyJ6ZmQ5YWs5Y+4VW5pdmVyc2FsIE11c2ljIFB1Ymxpc2hpbmcgTGltaXRlZC4KWzA0OjI1LjE5XcKp77ya5pif56m66aOe6IW+5Zu96ZmF5aix5LmQ6IKh5Lu95pyJ6ZmQ5YWs5Y+4TSBTdGFyIEVudGVydGFpbm1lbnQgTHRkLgpbMDQ6MjUuODJd4oSX77ya5pif56m66aOe6IW+5Zu96ZmF5aix5LmQ6IKh5Lu95pyJ6ZmQ5YWs5Y+4TSBTdGFyIEVudGVydGFpbm1lbnQgTHRkLgpbMDQ6MjYuNDVd5Yi25L2c5Lq6IFByb2R1ZXLvvJrpmYjlkJvosaogSG93ZUDmiJDnu6nlpb3lt6XkvZzlrqQKWzA0OjI2LjkxXee8luabsiBBcnJhbmdlbWVudO+8muW8oOWwkeeRnCBDaGFybGVzIENoYW5nL+WRqOWFtOWTsiBFcmljL+mZiOWQm+ixqkhvd2UKWzA0OjI3LjQ0XemFjeWUseWItuS9nOS6uiBWb2NhbCBQcm9kdWNlcu+8muiwouWHjOWQmyBMaXNhIERqYWF0aQpbMDQ6MjcuODNdUmhvZGVz77ya5byg5bCR55GcIENoYXJsZXMgQ2hhbmcKWzA0OjI4LjAzXemSoueQtCBQaWFub++8muWRqOWFtOWTsiBFcmljClswNDoyOC4yNl3mnKjlkInku5Yv55S15ZCJ5LuWIEFjb3VzdGljIEd1aXRhci9FbGVjdHJpYyBHdWl0YXLvvJrpmYjlkJvosapIb3dlClswNDoyOC43Ml3lkIjmiJDlmaggU3ludGhlc2l6ZXLvvJrlvKDlsJHnkZwgQ2hhcmxlcyBDaGFuZy/lkajlhbTlk7IgRXJpYy/pmYjlkJvosaogSG93ZQpbMDQ6MjkuMjhd6LSd5pavIEJhc3PvvJrpmYjlkJvosaogSG93ZQpbMDQ6MjkuNTJd6byTIERydW3vvJrpmYjlkJvosaogSG93ZQpbMDQ6MjkuNzFd5ZCI6Z+z57yW5YaZIEJhY2tncm91bmQgVm9jYWwgQXJyYW5nZW1lbnTvvJrosKLlh4zlkJsgTGlzYSBEamFhdGkKWzA0OjMwLjExXeWQiOmfsyBCYWNrZ3JvdW5kIFZvY2Fs77ya6LCi5YeM5ZCbIExpc2EgRGphYXRpL+WRqOWFtOWTsiBFcmljClswNDozMC41NF3lvZXpn7PluIggUmVjb3JkaW5nIEVuZ2luZWVy77ya5Y+26IKy6L2pIFl1SHN1YW4gWWVoL+iUoeWRqOe/sCBDaG91IEhhbiBUc2F5ClswNDozMS4wN13lvZXpn7PlrqQgUmVjb3JkaW5nIFN0dWRpb++8mkJCIFJvYWQgU3R1ZGlvL0xpZ2h0cyBVcCBTdHVkaW8KWzA0OjMxLjQzXea3t+mfs+W4iCBNaXhpbmcgRW5naW5lZXLvvJrpu4TmlofokLEgWml5YSBIdWFuZwpbMDQ6MzEuNzZd5re36Z+z5b2V6Z+z5a6kIE1peGluZyBTdHVkaW/vvJpQdXJyaW5nIFNvdW5kIFN0dWRpbwpbMDQ6MzIuMDld5q+N5bim5ZCO5pyf5bel56iL5biIIE1hc3RlcmluZyBFbmdpbmVlcu+8mkRhbGUgQmVja2VyClswNDozMi40NV3mr43luKblkI7mnJ/lt6XkvZzlrqQgTWFzdGVyaW5nIFN0dWRpb++8mkJlY2tlciBNYXN0ZXJpbmcKWzA0OjMyLjgxXeWItuS9nOWKqeeQhiBQcm9kdWN0aW9uIEFzc2lzdGFudO+8muael+miiSBKaWUgTGluL+W8oOe/lOa4hSBFcmljIENoYW5n","trans":"","roma":"","lrc_t":1729136050,"qrc_t":0,"trans_t":0,"roma_t":0,"lyric_style":0,"classical":0,"introduceTitle":"","introduceText":[{"title":"566A5LuL","content":""},{"title":"6IOM5pmv","content":""}],"vecSongID":null,"track":{"id":0,"type":0,"mid":"","name":"","title":"","subtitle":"","singer":null,"album":{"id":0,"mid":"","name":"","title":"","subtitle":"","time_public":"","pmid":""},"mv":{"id":0,"vid":"","name":"","title":"","vt":0},"interval":0,"isonly":0,"language":0,"genre":0,"index_cd":0,"index_album":0,"time_public":"","status":0,"fnote":0,"file":{"media_mid":"","size_24aac":0,"size_48aac":0,"size_96aac":0,"size_192ogg":0,"size_192aac":0,"size_128mp3":0,"size_320mp3":0,"size_ape":0,"size_flac":0,"size_dts":0,"size_try":0,"try_begin":0,"try_end":0,"url":"","size_hires":0,"hires_sample":0,"hires_bitdepth":0,"b_30s":0,"e_30s":0,"size_96ogg":0,"size_360ra":null,"size_dolby":0,"size_new":null},"pay":{"pay_month":0,"price_track":0,"price_album":0,"pay_play":0,"pay_down":0,"pay_status":0,"time_free":0},"action":{"switch":0,"msgid":0,"alert":0,"icons":0,"msgshare":0,"msgfav":0,"msgdown":0,"msgpay":0,"switch2":0,"icon2":0},"ksong":{"id":0,"mid":""},"volume":{"gain":0,"peak":0,"lra":0},"label":"","url":"","bpm":0,"version":0,"trace":"","data_type":0,"modify_stamp":0,"pingpong":"","aid":0,"ppurl":"","tid":0,"ov":0,"sa":0,"es":"","vs":null,"vi":null,"ktag":"","vf":null,"va":null},"startTs":0,"transSource":0}},"req_2":{"code":0,"data":{ "response_list": [ { "biz_id": "527017844", "biz_sub_type": 0, "biz_type": 1, "count": 483 } ] }},"req_3":{"code":0,"data":{"basicInfo":{"albumMid":"002aZXjY0I7FdO","albumName":"不完整的人","tranName":"","publishDate":"2024-10-18","desc":"不完整的人 I Can’t Love Somebody with A Broken Heart:剩我尚未离席的爱\n词:HUSH/周兴哲 曲:周兴哲\n\n“I can’t love somebody with a broken heart\nthat wasn’t meant to be broken”\n\n 人们天真地试图用新的感情来治愈旧伤口,这样太不负责。当然,覆盖是容易的,幸福是可以努力的,但遗落碎片的灵魂拼图永远是不完整的。\n\n「可是我都记得 每一次的抉择 都为了 爱人」\n\n 面朝过去,背向未来。明知这是对谁都不公平的,最辜负的其实是自己。被新住进的人漆上任何其他颜色,也只是另一首只有自己能听见的心碎情歌。在「不完整的人 I Can’t Love Somebody with A Broken Heart」Pop Rock的乐音中,Eric这样告诉着我们:最好先治愈自己,再去拥抱下一个人。","genre":"","language":"国语","albumType":"Single","genreURL":"","lanURL":"http://y.qq.com/m/client/categoryzone/detail.html?categoryId=1\u0026showType=2\u0026isParent=1\u0026_hidehd=1\u0026groupId=6","albumTag3":0,"recordNum":"","albumID":57119087,"pmid":"002aZXjY0I7FdO_1","type":10002,"modifyTime":1729238024,"color":4539851,"fpaymid":"","topListContent":"","topListSchema":"","adStatus":0,"encourageVideoStatus":0,"wikiurl":"","awards":[],"LanRenBookUrl":"","adJson":"{\"bu_data_str1\":\"\",\"bu_data_str2\":\"\"}","vid":"","operateStatus":0,"genres":[{"name":"","url":"qqmusic://qq.com/ui/similarSongs?p=%7B%22songid%22%3A%220%22%2C%22tagid%22%3A%220%22%2C%22tagName%22%3A%22%22%7D"}],"album_right":3145728,"adTag":0,"headVideoVid":"","headVideoFrame":"","headMediaList":null,"brand":{"id":0,"name":"","url":""}},"company":{"ID":1032971,"name":"Universal Music Taiwan","headPic":"","isShow":0,"brief":""},"singer":{"singerList":[{"mid":"0022bqqN3dRfN4","name":"Eric周兴哲","transName":"Eric Chou","role":"singer","instrument":"无乐器","singerID":200521,"type":1,"singerType":0,"pmid":"0022bqqN3dRfN4_6","indentity":0}]}}},"req_4":{"code":0,"data":{"uin":"","retcode":0,"verify_type":0,"login_key":"","msg":"58.56.79.114;fnameHitCache_200","sip":["http://ws.stream.qqmusic.qq.com/","http://isure.stream.qqmusic.qq.com/"],"thirdip":["",""],"testfile2g":"C400003mAan70zUy5O.m4a?guid=2127560444\u0026vkey=5960AEA67FDE9AABABFAF3F396913A7B32DF431B3130969BB813028E4E1EFE2B685E8B4D024911A68072E6A0537B4FAB022817D8263A6FC4\u0026uin=\u0026fromtag=3","testfilewifi":"C400003mAan70zUy5O.m4a?guid=2127560444\u0026vkey=5960AEA67FDE9AABABFAF3F396913A7B32DF431B3130969BB813028E4E1EFE2B685E8B4D024911A68072E6A0537B4FAB022817D8263A6FC4\u0026uin=\u0026fromtag=3","midurlinfo":[{"songmid":"001jFl4s2mgq6C","filename":"C400002a92Ao2TkHtl.m4a","purl":"C400002a92Ao2TkHtl.m4a?guid=2127560444\u0026vkey=134ADF1CE1E9BBF6E592F5A9DDEB2A0DBA262AB51985D98EC07CCFA846196D0C1165753FBC70AA6A3A3FCFD398886648BFA4EDDBD6736048\u0026uin=736226400\u0026fromtag=120032\u0026src=C400002F4Gf13Qu2MD.m4a","errtype":"","p2pfromtag":0,"qmdlfromtag":0,"common_downfromtag":0,"vip_downfromtag":0,"pdl":0,"premain":0,"hisdown":0,"hisbuy":0,"uiAlert":0,"isbuy":0,"pneedbuy":0,"pneed":0,"isonly":0,"onecan":0,"result":0,"tips":"","opi48kurl":"","opi96kurl":"","opi192kurl":"","opiflackurl":"","opi128kurl":"","opi192koggurl":"","wififromtag":"","flowfromtag":"","wifiurl":"","flowurl":"","vkey":"134ADF1CE1E9BBF6E592F5A9DDEB2A0DBA262AB51985D98EC07CCFA846196D0C1165753FBC70AA6A3A3FCFD398886648BFA4EDDBD6736048","opi30surl":"","ekey":"","auth_switch":16888579,"subcode":0,"opi96koggurl":"","auth_switch2":917504}],"servercheck":"e07bd743a5d88cabf53e0154a7e12825","expiration":80400}}} + +{"code":0,"ts":1729475693245,"start_ts":1729475693187,"traceid":"215a635f125167c3","req_1":{"code":0,"data":{"songID":527017844,"songName":"","songType":0,"singerName":"","qrc":0,"crypt":0,"lyric":"W3RpOuS4jeWujOaVtOeahOS6ul0KW2FyOkVyaWPlkajlhbTlk7JdClthbDrkuI3lrozmlbTnmoTkurpdCltieTpdCltvZmZzZXQ6MF0KWzAwOjAwLjAwXeS4jeWujOaVtOeahOS6uiAtIEVyaWPlkajlhbTlk7IKWzAwOjAwLjcwXeivje+8mkhVU0gv5ZGo5YW05ZOyClswMDowMS4xMl3mm7LvvJrlkajlhbTlk7IKWzAwOjAxLjQ3XUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMDowNS4yM11UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAwOjA5LjM5XVRvIGJlIGJyb2tlbgpbMDA6MTIuMDldSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMDoxNi42Ml1XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDA6MjAuMDRdVGhpbmtpbmcgYWJvdXQgeW91ClswMDozNC4wMV3kuI3lrozmlbTnmoTkuroKWzAwOjM3LjE2XeS8pOe7iOeptuaXoOazleaEiOWQiApbMDA6NDQuNjVd5YaN5aaC5L2V5L6n6LqrClswMDo0Ny45M13ov47pnaLnmoTlhajmmK/miJHku6wKWzAwOjU0LjQwXeWDj+S4gOS4quS4quaVjOS6ugpbMDA6NTcuMTNd5ou/5pyA5rex55qE5b+r5LmQClswMDo1OS44M13orr3liLrmiJHnmoTnlqTnl5UKWzAxOjAyLjY5Xei/mOWtpuS4jeS8mgpbMDE6MDUuMDVd5Y+v5piv5oiR6YO96K6w5b6XClswMTowNy45M13mr4/kuIDmrKHnmoTmionmi6kKWzAxOjEwLjQ4XemDveS4uuS6hiDniLHkuroKWzAxOjE2LjEzXUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMToxOS45MV1UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAxOjI0LjA4XVRvIGJlIGJyb2tlbgpbMDE6MjYuNzJdSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMTozMS4zM11XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDE6MzQuODBdVGhpbmtpbmcgYWJvdXQgeW91ClswMTozNy4yM11JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMTo0OC4wN11JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMjowOS45M13mnKrlrozmiJDnmoTkuroKWzAyOjEzLjAxXeemu+WbmuWbsOWPquW3ruS4gOWvuApbMDI6MjAuNTdd6K+l5aaC5L2V5aWL6LqrClswMjoyMy43Ml3miY3og73orqnmmI7lpKnlr7zmraMKWzAyOjMwLjMyXeW9k+S4gOS4quS4quaVjOS6ugpbMDI6MzMuMTFd55So5pyA55yf55qE5Y+j5ZC7ClswMjozNS43MV3lmLLnrJHmiJHnmoTniLHmgagKWzAyOjM4LjM2XemDveaXoOaJgOiwkwpbMDI6NDEuMDRd5Zug5Li65oiR6YO96K6w5b6XClswMjo0My42OF3mr4/kuIDmrKHnmoTmionmi6kKWzAyOjQ2LjM4XemDveS4uuS6hiDniLHkuroKWzAyOjUyLjA1XUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMjo1NS45N11UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAzOjAwLjE2XVRvIGJlIGJyb2tlbgpbMDM6MDIuNzVdSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMzowNy4yNl1XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDM6MTAuNjZdVGhpbmtpbmcgYWJvdXQgeW91ClswMzoxMy41MV1JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMzoyNC4wMl1JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMzozNi4wMV1JIGNhbid0IGxvdmUgc29tZWJvZHkKWzAzOjM5LjA4XVNvbWVib2R5IHNvbWVib2R5ClswMzo1MC4wMF1JIGNhbid0ClswMzo1My4zOF1Tb21lYm9keQpbMDQ6MDAuOTddSSBjYW4ndCBsb3ZlIHNvbWVib2R5IHdpdGggYSBicm9rZW4gaGVhcnQKWzA0OjA1LjM4XVRoYXQgd2Fzbid0IG1lYW50IHRvIGJlIGJyb2tlbgpbMDQ6MTEuMTVdVG8gYmUgYnJva2VuClswNDoxNC42OV1JIGNhbid0IHdyaXRlIGFub3RoZXIgbG92ZSBzb25nIHdpdGggYSBicm9rZW4gaGVhcnQKWzA0OjIwLjA5XVdpdGhvdXQgdGhpbmtpbmcgYWJvdXQgeW91ClswNDoyMi44OF1UaGlua2luZyBhYm91dCB5b3UKWzA0OjIyLjk4XeivjSBMeXJpY2lzdO+8mkhVU0gv5ZGo5YW05ZOyRXJpYyBDaG91ClswNDoyMy4yNF3mm7IgQ29tcG9zZXLvvJrlkajlhbTlk7IgRXJpYyBDaG91ClswNDoyMy40OF1PUO+8muaYn+epuumjnuiFvuWbvemZheWoseS5kOiCoeS7veaciemZkOWFrOWPuE0gU3RhciBFbnRlcnRhaW5tZW50IEx0ZC4v55u45L+h6Z+z5LmQ5Zu96ZmF6IKh5Lu95pyJ6ZmQ5YWs5Y+4QidpbiBNdXNpYyBJbnRlcm5hdGlvbmFsIExpbWl0ZWQKWzA0OjI0LjYzXVNQ77ya546v55CD6Z+z5LmQ5Ye654mI6IKh5Lu95pyJ6ZmQ5YWs5Y+4VW5pdmVyc2FsIE11c2ljIFB1Ymxpc2hpbmcgTGltaXRlZC4KWzA0OjI1LjE5XcKp77ya5pif56m66aOe6IW+5Zu96ZmF5aix5LmQ6IKh5Lu95pyJ6ZmQ5YWs5Y+4TSBTdGFyIEVudGVydGFpbm1lbnQgTHRkLgpbMDQ6MjUuODJd4oSX77ya5pif56m66aOe6IW+5Zu96ZmF5aix5LmQ6IKh5Lu95pyJ6ZmQ5YWs5Y+4TSBTdGFyIEVudGVydGFpbm1lbnQgTHRkLgpbMDQ6MjYuNDVd5Yi25L2c5Lq6IFByb2R1ZXLvvJrpmYjlkJvosaogSG93ZUDmiJDnu6nlpb3lt6XkvZzlrqQKWzA0OjI2LjkxXee8luabsiBBcnJhbmdlbWVudO+8muW8oOWwkeeRnCBDaGFybGVzIENoYW5nL+WRqOWFtOWTsiBFcmljL+mZiOWQm+ixqkhvd2UKWzA0OjI3LjQ0XemFjeWUseWItuS9nOS6uiBWb2NhbCBQcm9kdWNlcu+8muiwouWHjOWQmyBMaXNhIERqYWF0aQpbMDQ6MjcuODNdUmhvZGVz77ya5byg5bCR55GcIENoYXJsZXMgQ2hhbmcKWzA0OjI4LjAzXemSoueQtCBQaWFub++8muWRqOWFtOWTsiBFcmljClswNDoyOC4yNl3mnKjlkInku5Yv55S15ZCJ5LuWIEFjb3VzdGljIEd1aXRhci9FbGVjdHJpYyBHdWl0YXLvvJrpmYjlkJvosapIb3dlClswNDoyOC43Ml3lkIjmiJDlmaggU3ludGhlc2l6ZXLvvJrlvKDlsJHnkZwgQ2hhcmxlcyBDaGFuZy/lkajlhbTlk7IgRXJpYy/pmYjlkJvosaogSG93ZQpbMDQ6MjkuMjhd6LSd5pavIEJhc3PvvJrpmYjlkJvosaogSG93ZQpbMDQ6MjkuNTJd6byTIERydW3vvJrpmYjlkJvosaogSG93ZQpbMDQ6MjkuNzFd5ZCI6Z+z57yW5YaZIEJhY2tncm91bmQgVm9jYWwgQXJyYW5nZW1lbnTvvJrosKLlh4zlkJsgTGlzYSBEamFhdGkKWzA0OjMwLjExXeWQiOmfsyBCYWNrZ3JvdW5kIFZvY2Fs77ya6LCi5YeM5ZCbIExpc2EgRGphYXRpL+WRqOWFtOWTsiBFcmljClswNDozMC41NF3lvZXpn7PluIggUmVjb3JkaW5nIEVuZ2luZWVy77ya5Y+26IKy6L2pIFl1SHN1YW4gWWVoL+iUoeWRqOe/sCBDaG91IEhhbiBUc2F5ClswNDozMS4wN13lvZXpn7PlrqQgUmVjb3JkaW5nIFN0dWRpb++8mkJCIFJvYWQgU3R1ZGlvL0xpZ2h0cyBVcCBTdHVkaW8KWzA0OjMxLjQzXea3t+mfs+W4iCBNaXhpbmcgRW5naW5lZXLvvJrpu4TmlofokLEgWml5YSBIdWFuZwpbMDQ6MzEuNzZd5re36Z+z5b2V6Z+z5a6kIE1peGluZyBTdHVkaW/vvJpQdXJyaW5nIFNvdW5kIFN0dWRpbwpbMDQ6MzIuMDld5q+N5bim5ZCO5pyf5bel56iL5biIIE1hc3RlcmluZyBFbmdpbmVlcu+8mkRhbGUgQmVja2VyClswNDozMi40NV3mr43luKblkI7mnJ/lt6XkvZzlrqQgTWFzdGVyaW5nIFN0dWRpb++8mkJlY2tlciBNYXN0ZXJpbmcKWzA0OjMyLjgxXeWItuS9nOWKqeeQhiBQcm9kdWN0aW9uIEFzc2lzdGFudO+8muael+miiSBKaWUgTGluL+W8oOe/lOa4hSBFcmljIENoYW5n","trans":"","roma":"","lrc_t":1729136050,"qrc_t":0,"trans_t":0,"roma_t":0,"lyric_style":0,"classical":0,"introduceTitle":"","introduceText":[{"title":"566A5LuL","content":""},{"title":"6IOM5pmv","content":""}],"vecSongID":null,"track":{"id":0,"type":0,"mid":"","name":"","title":"","subtitle":"","singer":null,"album":{"id":0,"mid":"","name":"","title":"","subtitle":"","time_public":"","pmid":""},"mv":{"id":0,"vid":"","name":"","title":"","vt":0},"interval":0,"isonly":0,"language":0,"genre":0,"index_cd":0,"index_album":0,"time_public":"","status":0,"fnote":0,"file":{"media_mid":"","size_24aac":0,"size_48aac":0,"size_96aac":0,"size_192ogg":0,"size_192aac":0,"size_128mp3":0,"size_320mp3":0,"size_ape":0,"size_flac":0,"size_dts":0,"size_try":0,"try_begin":0,"try_end":0,"url":"","size_hires":0,"hires_sample":0,"hires_bitdepth":0,"b_30s":0,"e_30s":0,"size_96ogg":0,"size_360ra":null,"size_dolby":0,"size_new":null},"pay":{"pay_month":0,"price_track":0,"price_album":0,"pay_play":0,"pay_down":0,"pay_status":0,"time_free":0},"action":{"switch":0,"msgid":0,"alert":0,"icons":0,"msgshare":0,"msgfav":0,"msgdown":0,"msgpay":0,"switch2":0,"icon2":0},"ksong":{"id":0,"mid":""},"volume":{"gain":0,"peak":0,"lra":0},"label":"","url":"","bpm":0,"version":0,"trace":"","data_type":0,"modify_stamp":0,"pingpong":"","aid":0,"ppurl":"","tid":0,"ov":0,"sa":0,"es":"","vs":null,"vi":null,"ktag":"","vf":null,"va":null},"startTs":1477,"transSource":0}},"req_2":{"code":0,"data":{ "response_list": [ { "biz_id": "527017844", "biz_sub_type": 0, "biz_type": 1, "count": 483 } ] }},"req_3":{"code":0,"data":{"basicInfo":{"albumMid":"002aZXjY0I7FdO","albumName":"不完整的人","tranName":"","publishDate":"2024-10-18","desc":"不完整的人 I Can’t Love Somebody with A Broken Heart:剩我尚未离席的爱\n词:HUSH/周兴哲 曲:周兴哲\n\n“I can’t love somebody with a broken heart\nthat wasn’t meant to be broken”\n\n 人们天真地试图用新的感情来治愈旧伤口,这样太不负责。当然,覆盖是容易的,幸福是可以努力的,但遗落碎片的灵魂拼图永远是不完整的。\n\n「可是我都记得 每一次的抉择 都为了 爱人」\n\n 面朝过去,背向未来。明知这是对谁都不公平的,最辜负的其实是自己。被新住进的人漆上任何其他颜色,也只是另一首只有自己能听见的心碎情歌。在「不完整的人 I Can’t Love Somebody with A Broken Heart」Pop Rock的乐音中,Eric这样告诉着我们:最好先治愈自己,再去拥抱下一个人。","genre":"","language":"国语","albumType":"Single","genreURL":"","lanURL":"http://y.qq.com/m/client/categoryzone/detail.html?categoryId=1&showType=2&isParent=1&_hidehd=1&groupId=6","albumTag3":0,"recordNum":"","albumID":57119087,"pmid":"002aZXjY0I7FdO_1","type":10002,"modifyTime":1729238024,"color":4539851,"fpaymid":"","topListContent":"","topListSchema":"","adStatus":0,"encourageVideoStatus":0,"wikiurl":"","awards":[],"LanRenBookUrl":"","adJson":"{\"bu_data_str1\":\"\",\"bu_data_str2\":\"\"}","vid":"","operateStatus":0,"genres":[{"name":"","url":"qqmusic://qq.com/ui/similarSongs?p=%7B%22songid%22%3A%220%22%2C%22tagid%22%3A%220%22%2C%22tagName%22%3A%22%22%7D"}],"album_right":3145728,"adTag":0,"headVideoVid":"","headVideoFrame":"","headMediaList":null,"brand":{"id":0,"name":"","url":""}},"company":{"ID":1032971,"name":"Universal Music Taiwan","headPic":"","isShow":0,"brief":""},"singer":{"singerList":[{"mid":"0022bqqN3dRfN4","name":"Eric周兴哲","transName":"Eric Chou","role":"singer","instrument":"无乐器","singerID":200521,"type":1,"singerType":0,"pmid":"0022bqqN3dRfN4_6","indentity":0}]}}},"req_4":{"code":1000}} + +### +# curl 'https://u6.y.qq.com/cgi-bin/musics.fcg?_=1729474959529&sign=zzccf85a72agaweavmzguqxtrh2ozqekbdifsa9252c73' +# -H 'accept: application/json' +# -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' +# -H 'content-type: application/x-www-form-urlencoded' +# -H 'cookie: ptcz=6d7ee39c2233e09bcfae35e2342318fdfee5ab158e4a76d9a62102274ef34949; _clck=70lnr8|1|fmy|0; _qimei_uuid42=189070d23041001ab37e04a6e648f5c498cdaed314; pac_uid=0_SwYcnFy8AH0T2; _qimei_fingerprint=a923cb1832ef7822b94183ed0c00b1dd; _qimei_q36=; _qimei_h38=fdedf3b6b37e04a6e648f5c40200000b818907; ptui_loginuin=736226400; RK=tQXcoxUWOc; _qpsvr_localtk=0.45536025016981263; ts_uid=2654832736; pgv_pvid=2268917085; fqm_pvqid=f95b5969-a599-41f8-8a6c-c6f20ab16afd; fqm_sessionid=6d07efc8-7fbe-43fd-ba18-82ec08370845; pgv_info=ssid=s6481288078; ts_refer=ADTAGh5_playsong; login_type=1; qm_keyst=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; tmeLoginType=2; uin=736226400; euin=7iosow-s7enz; wxopenid=; psrf_musickey_createtime=1729473810; qqmusic_key=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; wxunionid=; psrf_qqaccess_token=448E090ED1C010135068CA37953E13B8; psrf_qqunionid=40847723EC5B5CD0F0F3A4D988FD324B; psrf_qqrefresh_token=369F406AB6DB8E3428E5A90F43EE3146; psrf_qqopenid=5F276E349AF31A352B0D07BB22E86773; music_ignore_pskey=202306271436Hn@vBj; wxrefresh_token=; psrf_access_token_expiresAt=1737249810; ts_last=y.qq.com/n/ryqq/player' +# -H 'dnt: 1' +# -H 'origin: https://y.qq.com' +# -H 'priority: u=1, i' +# -H 'referer: https://y.qq.com/' +# -H 'sec-ch-ua: "Microsoft Edge";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' +# -H 'sec-ch-ua-mobile: ?0' +# -H 'sec-ch-ua-platform: "Windows"' +# -H 'sec-fetch-dest: empty' +# -H 'sec-fetch-mode: cors' +# -H 'sec-fetch-site: same-site' +# -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0' +# --data-raw '{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":736226400,"g_tk_new_20200303":224534732,"g_tk":224534732},"req_1":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":"001jFl4s2mgq6C","songID":527017844}},"req_2":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":"527017844","biz_sub_type":0}]}},"req_3":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":"002aZXjY0I7FdO"}},"req_4":{"module":"music.vkey.GetVkey","method":"GetUrl","param":{"guid":"2127560444","songmid":["001jFl4s2mgq6C"],"songtype":[0],"uin":"736226400","loginflag":1,"platform":"20"}}}' +POST https://u6.y.qq.com/cgi-bin/musics.fcg?_=1729474959529&sign=zzccf85a72agaweavmzguqxtrh2ozqekbdifsa9252c73 +accept: application/json +accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 +cookie: ptcz=6d7ee39c2233e09bcfae35e2342318fdfee5ab158e4a76d9a62102274ef34949; _clck=70lnr8|1|fmy|0; _qimei_uuid42=189070d23041001ab37e04a6e648f5c498cdaed314; pac_uid=0_SwYcnFy8AH0T2; _qimei_fingerprint=a923cb1832ef7822b94183ed0c00b1dd; _qimei_q36=; _qimei_h38=fdedf3b6b37e04a6e648f5c40200000b818907; ptui_loginuin=736226400; RK=tQXcoxUWOc; _qpsvr_localtk=0.45536025016981263; ts_uid=2654832736; pgv_pvid=2268917085; fqm_pvqid=f95b5969-a599-41f8-8a6c-c6f20ab16afd; fqm_sessionid=6d07efc8-7fbe-43fd-ba18-82ec08370845; pgv_info=ssid=s6481288078; ts_refer=ADTAGh5_playsong; login_type=1; qm_keyst=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; tmeLoginType=2; uin=736226400; euin=7iosow-s7enz; wxopenid=; psrf_musickey_createtime=1729473810; qqmusic_key=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; wxunionid=; psrf_qqaccess_token=448E090ED1C010135068CA37953E13B8; psrf_qqunionid=40847723EC5B5CD0F0F3A4D988FD324B; psrf_qqrefresh_token=369F406AB6DB8E3428E5A90F43EE3146; psrf_qqopenid=5F276E349AF31A352B0D07BB22E86773; music_ignore_pskey=202306271436Hn@vBj; wxrefresh_token=; psrf_access_token_expiresAt=1737249810; ts_last=y.qq.com/n/ryqq/player + +{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":736226400,"g_tk_new_20200303":224534732,"g_tk":224534732},"req_1":{"module":"music.musichallSong.PlayLyricInfo","method":"GetPlayLyricInfo","param":{"songMID":"001jFl4s2mgq6C","songID":527017844}},"req_2":{"method":"GetCommentCount","module":"music.globalComment.GlobalCommentRead","param":{"request_list":[{"biz_type":1,"biz_id":"527017844","biz_sub_type":0}]}},"req_3":{"module":"music.musichallAlbum.AlbumInfoServer","method":"GetAlbumDetail","param":{"albumMid":"002aZXjY0I7FdO"}},"req_4":{"module":"music.vkey.GetVkey","method":"GetUrl","param":{"guid":"2127560444","songmid":["001jFl4s2mgq6C"],"songtype":[0],"uin":"736226400","loginflag":1,"platform":"20"}}} + +### + + +{"code":0,"ts":1729475772247,"start_ts":1729475772185,"traceid":"69023e27cff653a8","req_1":{"code":0,"data":{"songID":527017844,"songName":"","songType":0,"singerName":"","qrc":0,"crypt":0,"lyric":"W3RpOuS4jeWujOaVtOeahOS6ul0KW2FyOkVyaWPlkajlhbTlk7JdClthbDrkuI3lrozmlbTnmoTkurpdCltieTpdCltvZmZzZXQ6MF0KWzAwOjAwLjAwXeS4jeWujOaVtOeahOS6uiAtIEVyaWPlkajlhbTlk7IKWzAwOjAwLjcwXeivje+8mkhVU0gv5ZGo5YW05ZOyClswMDowMS4xMl3mm7LvvJrlkajlhbTlk7IKWzAwOjAxLjQ3XUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMDowNS4yM11UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAwOjA5LjM5XVRvIGJlIGJyb2tlbgpbMDA6MTIuMDldSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMDoxNi42Ml1XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDA6MjAuMDRdVGhpbmtpbmcgYWJvdXQgeW91ClswMDozNC4wMV3kuI3lrozmlbTnmoTkuroKWzAwOjM3LjE2XeS8pOe7iOeptuaXoOazleaEiOWQiApbMDA6NDQuNjVd5YaN5aaC5L2V5L6n6LqrClswMDo0Ny45M13ov47pnaLnmoTlhajmmK/miJHku6wKWzAwOjU0LjQwXeWDj+S4gOS4quS4quaVjOS6ugpbMDA6NTcuMTNd5ou/5pyA5rex55qE5b+r5LmQClswMDo1OS44M13orr3liLrmiJHnmoTnlqTnl5UKWzAxOjAyLjY5Xei/mOWtpuS4jeS8mgpbMDE6MDUuMDVd5Y+v5piv5oiR6YO96K6w5b6XClswMTowNy45M13mr4/kuIDmrKHnmoTmionmi6kKWzAxOjEwLjQ4XemDveS4uuS6hiDniLHkuroKWzAxOjE2LjEzXUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMToxOS45MV1UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAxOjI0LjA4XVRvIGJlIGJyb2tlbgpbMDE6MjYuNzJdSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMTozMS4zM11XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDE6MzQuODBdVGhpbmtpbmcgYWJvdXQgeW91ClswMTozNy4yM11JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMTo0OC4wN11JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMjowOS45M13mnKrlrozmiJDnmoTkuroKWzAyOjEzLjAxXeemu+WbmuWbsOWPquW3ruS4gOWvuApbMDI6MjAuNTdd6K+l5aaC5L2V5aWL6LqrClswMjoyMy43Ml3miY3og73orqnmmI7lpKnlr7zmraMKWzAyOjMwLjMyXeW9k+S4gOS4quS4quaVjOS6ugpbMDI6MzMuMTFd55So5pyA55yf55qE5Y+j5ZC7ClswMjozNS43MV3lmLLnrJHmiJHnmoTniLHmgagKWzAyOjM4LjM2XemDveaXoOaJgOiwkwpbMDI6NDEuMDRd5Zug5Li65oiR6YO96K6w5b6XClswMjo0My42OF3mr4/kuIDmrKHnmoTmionmi6kKWzAyOjQ2LjM4XemDveS4uuS6hiDniLHkuroKWzAyOjUyLjA1XUkgY2FuJ3QgbG92ZSBzb21lYm9keSB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMjo1NS45N11UaGF0IHdhc24ndCBtZWFudCB0byBiZSBicm9rZW4KWzAzOjAwLjE2XVRvIGJlIGJyb2tlbgpbMDM6MDIuNzVdSSBjYW4ndCB3cml0ZSBhbm90aGVyIGxvdmUgc29uZyB3aXRoIGEgYnJva2VuIGhlYXJ0ClswMzowNy4yNl1XaXRob3V0IHRoaW5raW5nIGFib3V0IHlvdQpbMDM6MTAuNjZdVGhpbmtpbmcgYWJvdXQgeW91ClswMzoxMy41MV1JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMzoyNC4wMl1JIGNhbid0IGxvdmUgc29tZWJvZHkgd29vClswMzozNi4wMV1JIGNhbid0IGxvdmUgc29tZWJvZHkKWzAzOjM5LjA4XVNvbWVib2R5IHNvbWVib2R5ClswMzo1MC4wMF1JIGNhbid0ClswMzo1My4zOF1Tb21lYm9keQpbMDQ6MDAuOTddSSBjYW4ndCBsb3ZlIHNvbWVib2R5IHdpdGggYSBicm9rZW4gaGVhcnQKWzA0OjA1LjM4XVRoYXQgd2Fzbid0IG1lYW50IHRvIGJlIGJyb2tlbgpbMDQ6MTEuMTVdVG8gYmUgYnJva2VuClswNDoxNC42OV1JIGNhbid0IHdyaXRlIGFub3RoZXIgbG92ZSBzb25nIHdpdGggYSBicm9rZW4gaGVhcnQKWzA0OjIwLjA5XVdpdGhvdXQgdGhpbmtpbmcgYWJvdXQgeW91ClswNDoyMi44OF1UaGlua2luZyBhYm91dCB5b3UKWzA0OjIyLjk4XeivjSBMeXJpY2lzdO+8mkhVU0gv5ZGo5YW05ZOyRXJpYyBDaG91ClswNDoyMy4yNF3mm7IgQ29tcG9zZXLvvJrlkajlhbTlk7IgRXJpYyBDaG91ClswNDoyMy40OF1PUO+8muaYn+epuumjnuiFvuWbvemZheWoseS5kOiCoeS7veaciemZkOWFrOWPuE0gU3RhciBFbnRlcnRhaW5tZW50IEx0ZC4v55u45L+h6Z+z5LmQ5Zu96ZmF6IKh5Lu95pyJ6ZmQ5YWs5Y+4QidpbiBNdXNpYyBJbnRlcm5hdGlvbmFsIExpbWl0ZWQKWzA0OjI0LjYzXVNQ77ya546v55CD6Z+z5LmQ5Ye654mI6IKh5Lu95pyJ6ZmQ5YWs5Y+4VW5pdmVyc2FsIE11c2ljIFB1Ymxpc2hpbmcgTGltaXRlZC4KWzA0OjI1LjE5XcKp77ya5pif56m66aOe6IW+5Zu96ZmF5aix5LmQ6IKh5Lu95pyJ6ZmQ5YWs5Y+4TSBTdGFyIEVudGVydGFpbm1lbnQgTHRkLgpbMDQ6MjUuODJd4oSX77ya5pif56m66aOe6IW+5Zu96ZmF5aix5LmQ6IKh5Lu95pyJ6ZmQ5YWs5Y+4TSBTdGFyIEVudGVydGFpbm1lbnQgTHRkLgpbMDQ6MjYuNDVd5Yi25L2c5Lq6IFByb2R1ZXLvvJrpmYjlkJvosaogSG93ZUDmiJDnu6nlpb3lt6XkvZzlrqQKWzA0OjI2LjkxXee8luabsiBBcnJhbmdlbWVudO+8muW8oOWwkeeRnCBDaGFybGVzIENoYW5nL+WRqOWFtOWTsiBFcmljL+mZiOWQm+ixqkhvd2UKWzA0OjI3LjQ0XemFjeWUseWItuS9nOS6uiBWb2NhbCBQcm9kdWNlcu+8muiwouWHjOWQmyBMaXNhIERqYWF0aQpbMDQ6MjcuODNdUmhvZGVz77ya5byg5bCR55GcIENoYXJsZXMgQ2hhbmcKWzA0OjI4LjAzXemSoueQtCBQaWFub++8muWRqOWFtOWTsiBFcmljClswNDoyOC4yNl3mnKjlkInku5Yv55S15ZCJ5LuWIEFjb3VzdGljIEd1aXRhci9FbGVjdHJpYyBHdWl0YXLvvJrpmYjlkJvosapIb3dlClswNDoyOC43Ml3lkIjmiJDlmaggU3ludGhlc2l6ZXLvvJrlvKDlsJHnkZwgQ2hhcmxlcyBDaGFuZy/lkajlhbTlk7IgRXJpYy/pmYjlkJvosaogSG93ZQpbMDQ6MjkuMjhd6LSd5pavIEJhc3PvvJrpmYjlkJvosaogSG93ZQpbMDQ6MjkuNTJd6byTIERydW3vvJrpmYjlkJvosaogSG93ZQpbMDQ6MjkuNzFd5ZCI6Z+z57yW5YaZIEJhY2tncm91bmQgVm9jYWwgQXJyYW5nZW1lbnTvvJrosKLlh4zlkJsgTGlzYSBEamFhdGkKWzA0OjMwLjExXeWQiOmfsyBCYWNrZ3JvdW5kIFZvY2Fs77ya6LCi5YeM5ZCbIExpc2EgRGphYXRpL+WRqOWFtOWTsiBFcmljClswNDozMC41NF3lvZXpn7PluIggUmVjb3JkaW5nIEVuZ2luZWVy77ya5Y+26IKy6L2pIFl1SHN1YW4gWWVoL+iUoeWRqOe/sCBDaG91IEhhbiBUc2F5ClswNDozMS4wN13lvZXpn7PlrqQgUmVjb3JkaW5nIFN0dWRpb++8mkJCIFJvYWQgU3R1ZGlvL0xpZ2h0cyBVcCBTdHVkaW8KWzA0OjMxLjQzXea3t+mfs+W4iCBNaXhpbmcgRW5naW5lZXLvvJrpu4TmlofokLEgWml5YSBIdWFuZwpbMDQ6MzEuNzZd5re36Z+z5b2V6Z+z5a6kIE1peGluZyBTdHVkaW/vvJpQdXJyaW5nIFNvdW5kIFN0dWRpbwpbMDQ6MzIuMDld5q+N5bim5ZCO5pyf5bel56iL5biIIE1hc3RlcmluZyBFbmdpbmVlcu+8mkRhbGUgQmVja2VyClswNDozMi40NV3mr43luKblkI7mnJ/lt6XkvZzlrqQgTWFzdGVyaW5nIFN0dWRpb++8mkJlY2tlciBNYXN0ZXJpbmcKWzA0OjMyLjgxXeWItuS9nOWKqeeQhiBQcm9kdWN0aW9uIEFzc2lzdGFudO+8muael+miiSBKaWUgTGluL+W8oOe/lOa4hSBFcmljIENoYW5n","trans":"","roma":"","lrc_t":1729136050,"qrc_t":0,"trans_t":0,"roma_t":0,"lyric_style":0,"classical":0,"introduceTitle":"","introduceText":[{"title":"566A5LuL","content":""},{"title":"6IOM5pmv","content":""}],"vecSongID":null,"track":{"id":0,"type":0,"mid":"","name":"","title":"","subtitle":"","singer":null,"album":{"id":0,"mid":"","name":"","title":"","subtitle":"","time_public":"","pmid":""},"mv":{"id":0,"vid":"","name":"","title":"","vt":0},"interval":0,"isonly":0,"language":0,"genre":0,"index_cd":0,"index_album":0,"time_public":"","status":0,"fnote":0,"file":{"media_mid":"","size_24aac":0,"size_48aac":0,"size_96aac":0,"size_192ogg":0,"size_192aac":0,"size_128mp3":0,"size_320mp3":0,"size_ape":0,"size_flac":0,"size_dts":0,"size_try":0,"try_begin":0,"try_end":0,"url":"","size_hires":0,"hires_sample":0,"hires_bitdepth":0,"b_30s":0,"e_30s":0,"size_96ogg":0,"size_360ra":null,"size_dolby":0,"size_new":null},"pay":{"pay_month":0,"price_track":0,"price_album":0,"pay_play":0,"pay_down":0,"pay_status":0,"time_free":0},"action":{"switch":0,"msgid":0,"alert":0,"icons":0,"msgshare":0,"msgfav":0,"msgdown":0,"msgpay":0,"switch2":0,"icon2":0},"ksong":{"id":0,"mid":""},"volume":{"gain":0,"peak":0,"lra":0},"label":"","url":"","bpm":0,"version":0,"trace":"","data_type":0,"modify_stamp":0,"pingpong":"","aid":0,"ppurl":"","tid":0,"ov":0,"sa":0,"es":"","vs":null,"vi":null,"ktag":"","vf":null,"va":null},"startTs":1477,"transSource":0}},"req_2":{"code":0,"data":{ "response_list": [ { "biz_id": "527017844", "biz_sub_type": 0, "biz_type": 1, "count": 483 } ] }},"req_3":{"code":0,"data":{"basicInfo":{"albumMid":"002aZXjY0I7FdO","albumName":"不完整的人","tranName":"","publishDate":"2024-10-18","desc":"不完整的人 I Can’t Love Somebody with A Broken Heart:剩我尚未离席的爱\n词:HUSH/周兴哲 曲:周兴哲\n\n“I can’t love somebody with a broken heart\nthat wasn’t meant to be broken”\n\n 人们天真地试图用新的感情来治愈旧伤口,这样太不负责。当然,覆盖是容易的,幸福是可以努力的,但遗落碎片的灵魂拼图永远是不完整的。\n\n「可是我都记得 每一次的抉择 都为了 爱人」\n\n 面朝过去,背向未来。明知这是对谁都不公平的,最辜负的其实是自己。被新住进的人漆上任何其他颜色,也只是另一首只有自己能听见的心碎情歌。在「不完整的人 I Can’t Love Somebody with A Broken Heart」Pop Rock的乐音中,Eric这样告诉着我们:最好先治愈自己,再去拥抱下一个人。","genre":"","language":"国语","albumType":"Single","genreURL":"","lanURL":"http://y.qq.com/m/client/categoryzone/detail.html?categoryId=1&showType=2&isParent=1&_hidehd=1&groupId=6","albumTag3":0,"recordNum":"","albumID":57119087,"pmid":"002aZXjY0I7FdO_1","type":10002,"modifyTime":1729238024,"color":4539851,"fpaymid":"","topListContent":"","topListSchema":"","adStatus":0,"encourageVideoStatus":0,"wikiurl":"","awards":[],"LanRenBookUrl":"","adJson":"{\"bu_data_str1\":\"\",\"bu_data_str2\":\"\"}","vid":"","operateStatus":0,"genres":[{"name":"","url":"qqmusic://qq.com/ui/similarSongs?p=%7B%22songid%22%3A%220%22%2C%22tagid%22%3A%220%22%2C%22tagName%22%3A%22%22%7D"}],"album_right":3145728,"adTag":0,"headVideoVid":"","headVideoFrame":"","headMediaList":null,"brand":{"id":0,"name":"","url":""}},"company":{"ID":1032971,"name":"Universal Music Taiwan","headPic":"","isShow":0,"brief":""},"singer":{"singerList":[{"mid":"0022bqqN3dRfN4","name":"Eric周兴哲","transName":"Eric Chou","role":"singer","instrument":"无乐器","singerID":200521,"type":1,"singerType":0,"pmid":"0022bqqN3dRfN4_6","indentity":0}]}}},"req_4":{"code":0,"data":{"uin":"","retcode":0,"verify_type":0,"login_key":"","msg":"2a09:bac5:a5fa:6e::b:25a;fnameHitCache_200","sip":["http://ws.stream.qqmusic.qq.com/","http://isure.stream.qqmusic.qq.com/"],"thirdip":["",""],"testfile2g":"C400003mAan70zUy5O.m4a?guid=2127560444&vkey=291AF2235065949CC0F0B32EB1DB6D81E2CD02B4DFA63A9782973FB691163022D4ABBDBC07224B14973B25F25A06A333113967C40B18ED8C&uin=&fromtag=3","testfilewifi":"C400003mAan70zUy5O.m4a?guid=2127560444&vkey=291AF2235065949CC0F0B32EB1DB6D81E2CD02B4DFA63A9782973FB691163022D4ABBDBC07224B14973B25F25A06A333113967C40B18ED8C&uin=&fromtag=3","midurlinfo":[{"songmid":"001jFl4s2mgq6C","filename":"C400002a92Ao2TkHtl.m4a","purl":"","errtype":"","p2pfromtag":0,"qmdlfromtag":0,"common_downfromtag":0,"vip_downfromtag":0,"pdl":0,"premain":0,"hisdown":0,"hisbuy":0,"uiAlert":0,"isbuy":0,"pneedbuy":0,"pneed":0,"isonly":0,"onecan":0,"result":104003,"tips":"","opi48kurl":"","opi96kurl":"","opi192kurl":"","opiflackurl":"","opi128kurl":"","opi192koggurl":"","wififromtag":"","flowfromtag":"","wifiurl":"","flowurl":"","vkey":"","opi30surl":"","ekey":"","auth_switch":1,"subcode":0,"opi96koggurl":"","auth_switch2":0}],"servercheck":"e07bd743a5d88cabf53e0154a7e12825","expiration":80400}}} + +### +POST https://u6.y.qq.com/cgi-bin/musicu.fcg?_=1729474959529&sign=zzccf85a72agaweavmzguqxtrh2ozqekbdifsa9252c73 +accept: application/json +accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 +cookie: ptcz=6d7ee39c2233e09bcfae35e2342318fdfee5ab158e4a76d9a62102274ef34949; _clck=70lnr8|1|fmy|0; _qimei_uuid42=189070d23041001ab37e04a6e648f5c498cdaed314; pac_uid=0_SwYcnFy8AH0T2; _qimei_fingerprint=a923cb1832ef7822b94183ed0c00b1dd; _qimei_q36=; _qimei_h38=fdedf3b6b37e04a6e648f5c40200000b818907; ptui_loginuin=736226400; RK=tQXcoxUWOc; _qpsvr_localtk=0.45536025016981263; ts_uid=2654832736; pgv_pvid=2268917085; fqm_pvqid=f95b5969-a599-41f8-8a6c-c6f20ab16afd; fqm_sessionid=6d07efc8-7fbe-43fd-ba18-82ec08370845; pgv_info=ssid=s6481288078; ts_refer=ADTAGh5_playsong; login_type=1; qm_keyst=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; tmeLoginType=2; uin=736226400; euin=7iosow-s7enz; wxopenid=; psrf_musickey_createtime=1729473810; qqmusic_key=Q_H_L_63k3NNxdfF7fbLLeLLuBq20twcXjUZxcY4_Pk11nTRTasB3FMFKGqwBsKMbTLsrefK8vIF_GXLiK0BCJg3DAEFg; wxunionid=; psrf_qqaccess_token=448E090ED1C010135068CA37953E13B8; psrf_qqunionid=40847723EC5B5CD0F0F3A4D988FD324B; psrf_qqrefresh_token=369F406AB6DB8E3428E5A90F43EE3146; psrf_qqopenid=5F276E349AF31A352B0D07BB22E86773; music_ignore_pskey=202306271436Hn@vBj; wxrefresh_token=; psrf_access_token_expiresAt=1737249810; ts_last=y.qq.com/n/ryqq/player + +{"comm": {"cv":4747474,"ct":24}, + "queryvkey": {"method": "CgiGetVkey", "module": "vkey.GetVkeyServer", "param": { + "uin": "956581739", + "guid": "2796982635", + "referer": "y.qq.com", + "songtype": [0], + "filename": ["C600002hjf5d37WuNj.m4a"], + "songmid": ["002MFDAV3rPFlo"] + }}} + + + +### +#@no-cookie-jar +https://u.y.qq.com/cgi-bin/musicu.fcg?-=getplaysongvkey2682247447678878&g_tk=5381&loginUin=956581739&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&data=%7B%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%222796982635%22%2C%22songmid%22%3A%5B%220039MnYb0qxYhV%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%22956581739%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A956581739%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D + +### +{"code":0,"ts":1729479066423,"start_ts":1729479066395,"traceid":"204925b86913ddc2","req_0":{"code":0,"data":{"uin":"","retcode":0,"verify_type":0,"login_key":"","msg":"104.28.245.36;fnameHitCache_200","sip":["http://ws.stream.qqmusic.qq.com/","http://isure.stream.qqmusic.qq.com/"],"thirdip":["",""],"testfile2g":"C400003mAan70zUy5O.m4a?guid=2796982635&vkey=D1A480621286FC4622B40102BEBB9CF6758168AA5F6F4F3E2D4AB1DB46812E36B094AC98EC37B9D15B3DB8017C330E7E201F72C3A6B5AA05&uin=&fromtag=3","testfilewifi":"C400003mAan70zUy5O.m4a?guid=2796982635&vkey=D1A480621286FC4622B40102BEBB9CF6758168AA5F6F4F3E2D4AB1DB46812E36B094AC98EC37B9D15B3DB8017C330E7E201F72C3A6B5AA05&uin=&fromtag=3","midurlinfo":[{"songmid":"002MFDAV3rPFlo","filename":"C400000WIYfh14JEQT.m4a","purl":"","errtype":"","p2pfromtag":0,"qmdlfromtag":0,"common_downfromtag":0,"vip_downfromtag":0,"pdl":0,"premain":0,"hisdown":0,"hisbuy":0,"uiAlert":0,"isbuy":0,"pneedbuy":0,"pneed":0,"isonly":0,"onecan":0,"result":104003,"tips":"","opi48kurl":"","opi96kurl":"","opi192kurl":"","opiflackurl":"","opi128kurl":"","opi192koggurl":"","wififromtag":"","flowfromtag":"","wifiurl":"","flowurl":"","vkey":"","opi30surl":"","ekey":"","auth_switch":1,"subcode":0,"opi96koggurl":"","auth_switch2":0}],"servercheck":"32dc571b1aaa9622ce4e4b41be20f309","expiration":80400}}} +### +{"code":0,"ts":1729484383945,"start_ts":1729484383915,"traceid":"6b26d27a2c1a3bfe","req_0":{"code":0,"data":{"uin":"","retcode":0,"verify_type":0,"login_key":"","msg":"104.28.245.36;fnameHitCache_200","sip":["http://ws.stream.qqmusic.qq.com/","http://isure.stream.qqmusic.qq.com/"],"thirdip":["",""],"testfile2g":"C400003mAan70zUy5O.m4a?guid=2796982635&vkey=C854FEB8BAE5136298FB08A340D8BEBB9C0696CEC6BFA36C44EA2ECC4D5C4D9A672A6ACE2474DF423747BC1A8CC33DC78BE2388978DD025A&uin=&fromtag=3","testfilewifi":"C400003mAan70zUy5O.m4a?guid=2796982635&vkey=C854FEB8BAE5136298FB08A340D8BEBB9C0696CEC6BFA36C44EA2ECC4D5C4D9A672A6ACE2474DF423747BC1A8CC33DC78BE2388978DD025A&uin=&fromtag=3","midurlinfo":[{"songmid":"002MFDAV3rPFlo","filename":"C400000WIYfh14JEQT.m4a","purl":"","errtype":"","p2pfromtag":0,"qmdlfromtag":0,"common_downfromtag":0,"vip_downfromtag":0,"pdl":0,"premain":0,"hisdown":0,"hisbuy":0,"uiAlert":0,"isbuy":0,"pneedbuy":0,"pneed":0,"isonly":0,"onecan":0,"result":104003,"tips":"","opi48kurl":"","opi96kurl":"","opi192kurl":"","opiflackurl":"","opi128kurl":"","opi192koggurl":"","wififromtag":"","flowfromtag":"","wifiurl":"","flowurl":"","vkey":"","opi30surl":"","ekey":"","auth_switch":1,"subcode":0,"opi96koggurl":"","auth_switch2":0}],"servercheck":"32dc571b1aaa9622ce4e4b41be20f309","expiration":80400}}} + +### +https://ws6.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=2796982635&vkey=D1A480621286FC4622B40102BEBB9CF6758168AA5F6F4F3E2D4AB1DB46812E36B094AC98EC37B9D15B3DB8017C330E7E201F72C3A6B5AA05&uin=123456&fromtag=120032&src=C400002202B43Cq4V4.m4a +### +https://ws6.stream.qqmusic.qq.com/C400002a92Ao2TkHtl.m4a?guid=154085405&vkey=5CDECF499AA68CC5BECAB743B65A228B23541E276FC72CCEEF86DE5115F08D99C2D39CF4B20E7F9C76FF9EDA0D69FC5DDDC7CD92E17E7D38&uin=736226400&fromtag=120032&src=C400002F4Gf13Qu2MD.m4a +### +https://ws6.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=2796982635&vkey=D1A480621286FC4622B40102BEBB9CF6758168AA5F6F4F3E2D4AB1DB46812E36B094AC98EC37B9D15B3DB8017C330E7E201F72C3A6B5AA05&uin=736226400&fromtag=120032&src=C600002hjf5d37WuNj.m4a + +### +https://ws6.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=2796982635&vkey=309DFA3B53156EE7A27DAF202F077FC0CD6309BECC4AA7B942896CA8998FB74412F4655353E50D200F803030F443018B5070D1A9C5010EC8&uin=&fromtag=3&uin=&fromtag=3 + +### +C400003mAan70zUy5O.m4a?guid=2796982635&vkey=D1A480621286FC4622B40102BEBB9CF6758168AA5F6F4F3E2D4AB1DB46812E36B094AC98EC37B9D15B3DB8017C330E7E201F72C3A6B5AA05&uin=&fromtag=3 + + +### +#@no-redirect +https://c6.y.qq.com/base/fcgi-bin/u?__=w3lqEpOHACLO + +### + +{"code":0,"ts":1729488724718,"start_ts":1729488724690,"traceid":"22f418ca64662343","req_0":{"code":0,"data":{"uin":"","retcode":0,"verify_type":0,"login_key":"","msg":"104.28.245.36;fnameHitCache_200","sip":["http://ws.stream.qqmusic.qq.com/","http://isure.stream.qqmusic.qq.com/"],"thirdip":["",""],"testfile2g":"C400003mAan70zUy5O.m4a?guid=2796982635&vkey=B2EDD08E318F0C0D2B3A9462FC5754CBCA9AEFD796FA0662C83A102821425D31547F957451751901F195095830842E1565FF8815B210B25A&uin=&fromtag=3","testfilewifi":"C400003mAan70zUy5O.m4a?guid=2796982635&vkey=B2EDD08E318F0C0D2B3A9462FC5754CBCA9AEFD796FA0662C83A102821425D31547F957451751901F195095830842E1565FF8815B210B25A&uin=&fromtag=3","midurlinfo":[{"songmid":"002GIhI70qS6jL","filename":"C400002GIhI70qS6jL.m4a","purl":"","errtype":"","p2pfromtag":0,"qmdlfromtag":0,"common_downfromtag":0,"vip_downfromtag":0,"pdl":0,"premain":0,"hisdown":0,"hisbuy":0,"uiAlert":0,"isbuy":0,"pneedbuy":0,"pneed":0,"isonly":0,"onecan":0,"result":104003,"tips":"","opi48kurl":"","opi96kurl":"","opi192kurl":"","opiflackurl":"","opi128kurl":"","opi192koggurl":"","wififromtag":"","flowfromtag":"","wifiurl":"","flowurl":"","vkey":"","opi30surl":"","ekey":"","auth_switch":1,"subcode":0,"opi96koggurl":"","auth_switch2":0}],"servercheck":"32dc571b1aaa9622ce4e4b41be20f309","expiration":80400}}} + +### +https://ws6.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=2796982635&vkey=B2EDD08E318F0C0D2B3A9462FC5754CBCA9AEFD796FA0662C83A102821425D31547F957451751901F195095830842E1565FF8815B210B25A&uin=&fromtag=3&src=C400002GIhI70qS6jL.m4a + +### +https://ws.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?fromtag=666&guid=2796982635&vkey=B2EDD08E318F0C0D2B3A9462FC5754CBCA9AEFD796FA0662C83A102821425D31547F957451751901F195095830842E1565FF8815B210B25A diff --git a/web-service/src/main/resources/http-tools/test.http b/web-service/src/main/resources/http-tools/test.http index 16f9846..6ed1fa5 100644 --- a/web-service/src/main/resources/http-tools/test.http +++ b/web-service/src/main/resources/http-tools/test.http @@ -199,8 +199,15 @@ GET http://127.0.0.1:6401/parser?url=https://474b.com/file/4015376-131945810 # @no-redirect GET http://127.0.0.1:6401/parser?url=http://163cn.tv/ykLZJJT +### PASS MQQ +# @no-redirect +GET http://127.0.0.1:6401/parser?url=https://c6.y.qq.com/base/fcgi-bin/u?__=k8gafY6HAQ5Y +### PASS MKG +# @no-redirect +GET http://127.0.0.1:6401/parser?url=https://t1.kugou.com/song.html?id=2bi8Fe9CSV3 ### n1 http://127.0.0.1:6401/n1/statisticsInfo + diff --git a/web-service/src/main/resources/server-proxy.yml b/web-service/src/main/resources/server-proxy.yml index 9842d01..47aba5b 100644 --- a/web-service/src/main/resources/server-proxy.yml +++ b/web-service/src/main/resources/server-proxy.yml @@ -15,7 +15,7 @@ proxy: # 1.origin代理地址端口后有目录(包括 / ),转发后地址:代理地址+访问URL目录部分去除location匹配目录 # 2.origin代理地址端口后无任何,转发后地址:代理地址+访问URL目录部 location: - - path: ~^/(json/|v2/|parser|ye/|lz/|cow/|ec/|fj/|fc/|le/|qq/|ws/|iz/|ce|mne/).* + - path: ~^/(json/|v2/|parser|ye/|lz/|cow/|ec/|fj/|fc/|le/|qq/|ws/|iz/|ce|mne|mqq|mkg/).* origin: 127.0.0.1:6400 # json/parser -> xxx/parser