# Koneko QZ Music v2/v3 鎻掍欢寮€鍙戦伩鍧戞寚鍗? > 鐗堟湰: 0.0.1 | 浣滆€? 浜戞眬(Miao-moe) | 鐩爣: 鏀寔杩佺Щ鍒板叾浠?AI 缁х画寮€鍙? --- ## 涓€銆侀」鐩儗鏅? QZ Music v2/v3 鏄竴娆?Android/PC 闊充箰鎾斁鍣紝鏀寔閫氳繃**鎷撳睍鎻掍欢**鎺ュ叆澶氬钩鍙伴煶婧愩€傛彃浠剁郴缁熷熀浜?Node.js 杩愯鏃讹紙Javet/V8锛夛紝姣忎釜鎻掍欢鏄竴涓崟鐙殑 `.js` 鏂囦欢锛岄€氳繃 `module.exports` 瀵煎嚭鎺ュ彛銆? ### 鎻掍欢鍔犺浇鏈哄埗 - 杩愯鏃剁幆澧冨彉閲忛€氳繃 `global.env` 璁块棶锛?*涓嶆槸** `process.env` - 鎻掍欢涓哄崟 `.js` 鏂囦欢鏍煎紡 ## 浜屻€丣avet/V8 鍏煎鎬уぇ鍧戯紙鏈€閲嶈锛? QZ Music 浣跨敤 Javet 浣滀负 JS 杩愯鏃讹紙鍩轰簬 V8锛夛紝**涓嶆敮鎸佺幇浠?ES 璇硶**锛? | 璇硶 | 鐘舵€?| 姝g‘鍐欐硶 | |------|------|---------| | `let` / `const` | 鉂?| `var` | | 绠ご鍑芥暟 `() => {}` | 鉂?| `function() {}` | | `async` / `await` | 鉂?| `Promise` 閾惧紡 | | `catch { }`锛堟棤鍙傛暟锛墊 鉂?| `catch (e) { }` | | `Promise.allSettled` | 鉂?| `Promise.all` + 鎵嬪姩鍖呰 | | `Object.entries` / `Object.values` | 鉂?| `for...in` 閬嶅巻 | | `Array.prototype.includes` | 鉂?| `indexOf(...) !== -1` | | `String.prototype.startsWith` | 鉂?| `indexOf(...) === 0` | | `class` | 鉂?| 瀵硅薄瀛楅潰閲?| | 妯℃澘瀛楃涓?`${}` | 鉁?| 鍙敤 | | `Buffer` | 鉁?| Node.js 鍐呯疆 | ### Promise.allSettled 鏇夸唬鏂规 ```js Promise.all(promises.map(function(p) { return p.then(function(v) { return { status: 'fulfilled', value: v } }).catch(function(e) { return { status: 'rejected', reason: e } }) })).then(function(results) { for (var i = 0; i < results.length; i++) { if (results[i].status === 'fulfilled') return results[i].value } throw new Error('all failed') }) ``` ## 涓夈€佹悳绱㈢粨鏋滄牸寮? App 鐨?`MusicListResponse` 瑕佹眰**蹇呴』鏈?`list` 瀛楁**锛屼笉鏄?`songs`锛? ```js // 鉁?姝g‘ return { list: [...], allPage: N, limit: N, total: N, source: 'tx' } // 鉂?閿欒 return { songs: [...], total: N } ``` ### 瀛楁鍚嶅鐓? | 鍚箟 | 姝g‘瀛楁 | 閿欒瀛楁 | |------|---------|---------| | 姝屾墜 | `artists` | `artist` | | 灏侀潰鍥?| `pic`/`mPic`/`sPic` | `picUrl` | | 鏃堕暱 | `interval` (m:ss) | `duration` | | 鍒楄〃 | `list` | `songs` | ## 鍥涖€佸悇骞冲彴韪╁潙鐐? ### QQ闊充箰 (tx) - 鎼滅储绛惧悕锛歚zzcSign` = SHA1 + 绱㈠紩鎻愬彇 + XOR + base64 - 灏侀潰鍥撅細鏈変笓杈慖D鐢?T002锛屾棤涓撹緫ID鐢?T001 - getUrl 闊宠川鍙傛暟锛氬甫 `k` (128k/320k/999k) ### 閰风嫍闊充箰 (kg) - 鎼滅储杩斿洖鍊煎瓧娈垫槸 `errcode`锛堜笉鏄?`error_code`锛?- 灏侀潰鍥撅細鏇挎崲 `{size}` 涓?`400` ### 閰锋垜闊充箰 (kw) - 闊宠川淇℃伅鍦?`N_MINFO` 瀛楁瑙f瀽 - 灏侀潰鍥撅細`https://img2.kuwo.cn/star/albumcover/300/{ALBUMID}.jpg` ### 缃戞槗浜戦煶涔?(wy) - 鎼滅储鐢?GET锛歚/api/search/get/web`锛屼笉闇€瑕?weapi - 灏侀潰鍥撅細`picId` 闇€ Base64 缂栫爜 - getUrl 闊宠川鍙傛暟锛氭暟瀛楁牸寮?`128000`/`320000`/`999000` - Cookie 鐢ㄤ簬 weapi 鍔犲瘑鎺ュ彛锛堟瘡鏃ユ帹鑽愩€佺浜篎M銆佸枩娆㈡瓕鏇层€佹瓕鍗曘€佷笓杈戙€佹瓕璇嶏級 ### 鍜挄闊充箰 (mg) - 鎼滅储闇€ MD5 绛惧悕 - 灏侀潰鍥撅細鐩稿璺緞闇€鎷兼帴 `https://d.musicapp.migu.cn` ### GIT闊虫簮 (git) - 鏃犳悳绱紝绾煶婧?- getUrl 闊宠川鍙傛暟锛歚128k`/`320k`/`999k` ## 浜斻€乬etUrl 瀹圭伨閫昏緫 鎵€鏈夊钩鍙颁娇鐢?*骞跺彂娴嬮€?*妯″紡锛氬悓鏃惰姹傚涓?API锛屽彇绗竴涓垚鍔熺粨鏋溿€? API 璋冪敤椤哄簭锛?1. 鑱嗘緶锛堥渶 `ceru_key` 鐜鍙橀噺锛?2. HUIBQ (lxmusicapi) 3. 鏄熸捣 / 蹇嗛煶 / 蹇靛績 / 闀块潚 / 鏄熸捣澶?/ fish / HYW 缃戞槗浜戦澶栨湁锛?4. bb / lx / ymc / unms / 瀹樻柟 weapi ## 鍏€佺幆澧冨彉閲忚鏄? | key | 鐢ㄩ€?| 閫傜敤骞冲彴 | 蹇呭~ | |-----|------|---------|------| | `ceru_key` | 鑱嗘緶闊虫簮 API 瀵嗛挜 | 鍏ㄩ儴 | 鍚?| | `playlist_url` | 缃戞槗浜戜釜浜轰富椤甸摼鎺?| 缃戞槗浜?| 鍚?| | `cookie` | 缃戞槗浜?Cookie | 缃戞槗浜?| 鍚?| ## 涓冦€佺増鏈鐞? - 鎵€鏈夊钩鍙扮粺涓€鐗堟湰鍙?- 褰撳墠鐗堟湰锛?*0.0.1** - 鏂囦欢鍚嶆牸寮忥細`Koneko_{骞冲彴鍚峿_v{鐗堟湰鍙穧.js` ## 鍏€佸父瑙佹姤閿? | 鎶ラ敊 | 鍘熷洜 | 瑙e喅 | |------|------|------| | `Cannot find module 'axios'` | 鐢ㄤ簡 axios | 鏀圭敤 `http`/`https` 鍐呯疆妯″潡 | | `Field 'list' is required` | 鎼滅储杩斿洖 `songs` 鑰岄潪 `list` | 鏀瑰瓧娈靛悕涓?`list` | | `SyntaxError: Invalid or unexpected token` | 鐢ㄤ簡 `catch { }` | 鏀逛负 `catch (e) { }` | | 鎼滅储鏃犵粨鏋?| 瀛楁鍚嶄笉鍖归厤 | 妫€鏌?`errcode` vs `error_code` | | 鎾斁澶辫触 | `mapBr` 杩斿洖鏍煎紡涓嶅 | QQ/kg/kw/mg/git 鐢?`320k`锛寃y 鐢?`320000` | | 灏侀潰鍥句笉鏄剧ず | URL 鏍煎紡閿欒鎴栬法鍩?| 妫€鏌ュ悇骞冲彴灏侀潰鍥炬嫾鎺ヨ鍒?| ## 涔濄€佸悗缁紑鍙戝缓璁? 1. 姣忔淇敼鍏ㄩ儴骞冲彴缁熶竴鍗囩骇鐗堟湰鍙?2. 鍏堝湪娴忚鍣?curl 娴嬭瘯 API 鏄惁鍙敤 3. 娉ㄦ剰 Javet 鍏煎鎬э紝閬垮厤鐜颁唬 JS 璇硶 4. 鎼滅储杩斿洖鍔″繀鍖呭惈 `list` 瀛楁 5. getUrl 娉ㄦ剰鍚勫钩鍙伴煶璐ㄥ弬鏁版牸寮忓樊寮?6. 鎵€鏈夊紓姝ユ搷浣滃姞 `.catch()` 鍏滃簳 7. 浼樺厛浣跨敤瀹樻柟鎼滅储鎺ュ彛锛岄煶婧愮敤绗笁鏂?API 瀹圭伨