2026-06-20 12:54:16 +08:00
|
|
|
# Koneko QZ Music v2/v3 鎻掍欢寮€鍙戞枃妗?
|
2026-06-20 12:48:28 +08:00
|
|
|
> 鐗堟湰锛?.0.4 | 浣滆€咃細浜戞眬(Miao-moe) | 鏁寸悊鏃ユ湡锛?026-06-20
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 涓€銆佹杩?
|
|
|
|
|
涓?QZ Music v2/v3 缂栧啓 6 涓煶涔愬钩鍙版嫇灞曟彃浠讹細
|
|
|
|
|
- QQ闊充箰 (`koneko_tx`)
|
|
|
|
|
- 閰风嫍闊充箰 (`koneko_kg`)
|
|
|
|
|
- 閰锋垜闊充箰 (`koneko_kw`)
|
|
|
|
|
- 缃戞槗浜戦煶涔?(`koneko_wy`)
|
|
|
|
|
- 鍜挄闊充箰 (`koneko_mg`)
|
|
|
|
|
- GIT闊虫簮 (`koneko_git`)
|
|
|
|
|
|
|
|
|
|
## 浜屻€佹彃浠惰鑼?
|
|
|
|
|
### 2.1 杩愯鐜
|
|
|
|
|
|
|
|
|
|
- Node.js 杩愯鏃讹紙Javet/V8锛?- CommonJS 妯″潡瑙勮寖
|
|
|
|
|
- `module.exports` 瀵煎嚭鎺ュ彛
|
|
|
|
|
- 涓嶆敮鎸?`axios`锛屼娇鐢ㄥ唴缃?`http`/`https` 妯″潡
|
|
|
|
|
|
|
|
|
|
### 2.2 ES5 鍏煎锛圝avet/V8 闄愬埗锛?
|
|
|
|
|
| 璇硶 | 鐘舵€?| 鏇夸唬 |
|
|
|
|
|
|------|------|------|
|
|
|
|
|
| `let` / `const` | 鉂?| `var` |
|
|
|
|
|
| 绠ご鍑芥暟 | 鉂?| `function() {}` |
|
|
|
|
|
| `async`/`await` | 鉂?| Promise 閾惧紡 |
|
|
|
|
|
| `catch { }` 鏃犲弬鏁?| 鉂?| `catch (e) { }` |
|
|
|
|
|
| `Promise.allSettled` | 鉂?| `Promise.all` + 鎵嬪姩鍖呰 |
|
|
|
|
|
| `Object.entries/values` | 鉂?| `for...in` |
|
|
|
|
|
| `Array.includes` | 鉂?| `indexOf` |
|
|
|
|
|
| `String.startsWith` | 鉂?| `indexOf(...) === 0` |
|
|
|
|
|
| `class` | 鉂?| 瀵硅薄瀛楅潰閲?|
|
|
|
|
|
| 妯℃澘瀛楃涓?`${}` | 鉁?| - |
|
|
|
|
|
| `Buffer` | 鉁?| - |
|
|
|
|
|
|
|
|
|
|
### 2.3 鎻掍欢瀵煎嚭鏍煎紡
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
module.exports = {
|
|
|
|
|
musicSearch: { search: fn, tipSearch: fn, hotSearch: fn },
|
|
|
|
|
tipSearch: { getList: fn },
|
|
|
|
|
hotSearch: { getList: fn },
|
|
|
|
|
getUrl: fn,
|
|
|
|
|
getLyric: fn,
|
|
|
|
|
songList: { getListDetail: fn },
|
|
|
|
|
album: { getListDetail: fn },
|
|
|
|
|
pluginInfo: { info, env, ext, quality, supportFunc },
|
|
|
|
|
// 缃戞槗浜戠壒鏈? userPlaylist: fn,
|
|
|
|
|
dailyRecommend: fn,
|
|
|
|
|
personalFm: fn,
|
|
|
|
|
myLikedSongs: fn
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.4 鎼滅储缁撴灉鏍煎紡
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
{
|
|
|
|
|
list: [{
|
|
|
|
|
id: String,
|
|
|
|
|
name: String,
|
|
|
|
|
artists: String, // 鐢?"銆? 鍒嗛殧
|
|
|
|
|
source: String, // tx/kg/kw/wy/mg
|
|
|
|
|
pic: String, // 灏侀潰澶у浘
|
|
|
|
|
mPic: String, // 灏侀潰涓浘
|
|
|
|
|
sPic: String, // 灏侀潰灏忓浘
|
|
|
|
|
albumName: String,
|
|
|
|
|
albumId: String,
|
|
|
|
|
interval: String, // "m:ss"
|
|
|
|
|
qualities: { standard: '3.21MB', exhigh: '7.85MB', ... }
|
|
|
|
|
}],
|
|
|
|
|
allPage: Number,
|
|
|
|
|
limit: Number,
|
|
|
|
|
total: Number,
|
|
|
|
|
source: String
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.5 鐜鍙橀噺
|
|
|
|
|
|
|
|
|
|
閫氳繃 `global.env` 璇诲彇锛?
|
|
|
|
|
```js
|
|
|
|
|
var env = global.env || {}
|
|
|
|
|
var CERU_KEY = env.ceru_key || ''
|
|
|
|
|
var WY_COOKIE = env.cookie || ''
|
|
|
|
|
var PLAYLIST_URL = env.playlist_url || ''
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.6 闊宠川鏍囪瘑
|
|
|
|
|
|
|
|
|
|
| ID | 鍚箟 |
|
|
|
|
|
|----|------|
|
|
|
|
|
| `standard` | 鏍囧噯闊宠川 (128k) |
|
|
|
|
|
| `exhigh` | 楂樺搧闊宠川 (320k) |
|
|
|
|
|
| `lossless` | 鏃犳崯闊宠川 (FLAC) |
|
|
|
|
|
| `hires` | Hi-Res |
|
|
|
|
|
| `jyeffect` | 楂樻竻鐜粫澹?|
|
|
|
|
|
| `sky` | 娌夋蹈鐜粫澹?|
|
|
|
|
|
| `jymaster` | 瓒呮竻姣嶅甫 |
|
|
|
|
|
|
|
|
|
|
## 涓夈€佸悇骞冲彴 API
|
|
|
|
|
|
|
|
|
|
### 3.1 QQ闊充箰 (tx)
|
|
|
|
|
|
|
|
|
|
**鎼滅储绛惧悕**: `zzcSign` = SHA1 + 鑷畾涔夌储寮曟彁鍙?+ XOR 娣锋穯 + base64
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
var PART_1_INDEXES = [23, 14, 6, 36, 16, 40, 7, 19]
|
|
|
|
|
var PART_2_INDEXES = [16, 1, 32, 12, 19, 27, 8, 5]
|
|
|
|
|
var SCRAMBLE_VALUES = [89, 39, 179, 150, 218, 82, 58, 252, 177, 52, 186, 123, 120, 64, 242, 133, 143, 161, 121, 179]
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**灏侀潰鍥捐鍒?*锛?- 鏈変笓杈慖D锛歚https://y.gtimg.cn/music/photo_new/T002R500x500M000{albumId}.jpg`
|
|
|
|
|
- 鏃犱笓杈慖D锛歚https://y.gtimg.cn/music/photo_new/T001R500x500M000{singerMid}.jpg`
|
|
|
|
|
|
|
|
|
|
**getUrl 闊宠川鍙傛暟**锛歚128k` / `320k` / `999k`
|
|
|
|
|
|
|
|
|
|
### 3.2 閰风嫍闊充箰 (kg)
|
|
|
|
|
|
|
|
|
|
**鎼滅储鎺ュ彛**锛歚http://mobilecdn.kugou.com/api/v3/search/song`
|
|
|
|
|
|
|
|
|
|
**娉ㄦ剰**锛氳繑鍥炲瓧娈垫槸 `errcode`锛堜笉鏄?`error_code`锛?
|
|
|
|
|
**灏侀潰鍥?*锛氭悳绱㈢粨鏋滆嚜甯?`imgurl`锛屾浛鎹?`{size}` 涓?`400`
|
|
|
|
|
|
|
|
|
|
### 3.3 閰锋垜闊充箰 (kw)
|
|
|
|
|
|
|
|
|
|
**鎼滅储鎺ュ彛**锛歚http://search.kuwo.cn/r.s`
|
|
|
|
|
|
|
|
|
|
**灏侀潰鍥?*锛歚https://img2.kuwo.cn/star/albumcover/300/{ALBUMID}.jpg`
|
|
|
|
|
|
|
|
|
|
**闊宠川淇℃伅**锛氬湪 `N_MINFO` 瀛楁涓В鏋?
|
|
|
|
|
### 3.4 缃戞槗浜戦煶涔?(wy)
|
|
|
|
|
|
|
|
|
|
**鎼滅储鎺ュ彛**锛歚https://music.163.com/api/search/get/web`锛圙ET锛屼笉闇€瑕?weapi锛?
|
|
|
|
|
**灏侀潰鍥?*锛歚picId` 闇€ Base64 缂栫爜
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
var picIdB64 = Buffer.from(String(s.album.picId)).toString('base64').replace(/=/g, '')
|
|
|
|
|
var pic = 'https://p2.music.126.net/' + picIdB64 + '/' + picIdStr + '.jpg'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**鍔犲瘑鎺ュ彛**锛?- `eapi`锛欰ES-128-ECB锛宬ey = `e82ckenh8dichen8`
|
|
|
|
|
- `weapi`锛欰ES-128-CBC + RSA
|
|
|
|
|
|
|
|
|
|
**Cookie 鍔熻兘**锛堥渶璁剧疆 `cookie` 鐜鍙橀噺锛夛細
|
|
|
|
|
- `userPlaylist()` - 涓汉姝屽崟锛堥渶 `playlist_url`锛?- `dailyRecommend()` - 姣忔棩鎺ㄨ崘
|
|
|
|
|
- `personalFm()` - 绉佷汉FM
|
|
|
|
|
- `myLikedSongs()` - 鎴戝枩娆㈢殑闊充箰
|
|
|
|
|
- `songList(id)` - 姝屽崟璇︽儏
|
|
|
|
|
- `album(id)` - 涓撹緫璇︽儏
|
|
|
|
|
- `getLyric(id)` - 姝岃瘝鑾峰彇
|
|
|
|
|
|
|
|
|
|
### 3.5 鍜挄闊充箰 (mg)
|
|
|
|
|
|
|
|
|
|
**鎼滅储绛惧悕**锛歁D5 鎷兼帴
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
var sign = crypto.createHash('md5').update(
|
|
|
|
|
str + signatureMd5 + 'yyapp2d16148780a1dcc7408e06336b98cfd50' + deviceId + time
|
|
|
|
|
).digest('hex')
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**灏侀潰鍥?*锛氭悳绱㈢粨鏋滃彲鑳借繑鍥炵浉瀵硅矾寰勶紝闇€鎷兼帴 `https://d.musicapp.migu.cn`
|
|
|
|
|
|
|
|
|
|
### 3.6 GIT闊虫簮 (git)
|
|
|
|
|
|
|
|
|
|
绾煶婧愭彃浠讹紝鏃犳悳绱㈠姛鑳斤紝浠?`getUrl`
|
|
|
|
|
|
|
|
|
|
## 鍥涖€乬etUrl 瀹圭伨鏈哄埗
|
|
|
|
|
|
|
|
|
|
鎵€鏈夊钩鍙扮粺涓€浣跨敤**骞跺彂娴嬮€?*妯″紡锛?
|
|
|
|
|
```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.url
|
|
|
|
|
}
|
|
|
|
|
return ''
|
|
|
|
|
})
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 闊虫簮 API 鍒楄〃
|
|
|
|
|
|
|
|
|
|
| API | 骞冲彴 | 璇存槑 |
|
|
|
|
|
|-----|------|------|
|
|
|
|
|
| 鑱嗘緶 | 鍏ㄩ儴 | 闇€ `ceru_key`锛屾渶绋冲畾 |
|
|
|
|
|
| HUIBQ | 鍏ㄩ儴 | `X-Request-Key: share-v3` |
|
|
|
|
|
| 鏄熸捣 | 鍏ㄩ儴 | 鑱氬悎鎺ュ彛 |
|
|
|
|
|
| 蹇靛績 | tx/kg/kw/mg | 涓汉缁存姢 |
|
|
|
|
|
| 闀块潚 | tx/kg/kw/mg | 涓汉缁存姢 |
|
|
|
|
|
| 鏄熸捣澶?| 鍏ㄩ儴 | 澶囩敤 |
|
|
|
|
|
| fish | 鍏ㄩ儴 | 涓汉缁存姢 |
|
|
|
|
|
| HYW | 鍏ㄩ儴 | 闇€ `X-Card-Key` |
|
|
|
|
|
| 蹇嗛煶 | tx | 鐩存帴杩斿洖 URL |
|
|
|
|
|
| 鏀堕泦QQ | tx | QQ涓撶敤 |
|
|
|
|
|
| 鏀堕泦KW | kw | 閰锋垜涓撶敤 |
|
|
|
|
|
| bb | wy | 缃戞槗浜戜笓鐢?|
|
|
|
|
|
| ymc | wy | 缃戞槗浜戜笓鐢?|
|
|
|
|
|
| unms | wy | 缃戞槗浜戜笓鐢?|
|
|
|
|
|
| 瀹樻柟 weapi | wy | 缃戞槗浜戝畼鏂?|
|
|
|
|
|
|
|
|
|
|
## 浜斻€佺増鏈鐞?
|
|
|
|
|
- 鎵€鏈夊钩鍙扮粺涓€鐗堟湰鍙?- 褰撳墠鐗堟湰锛歚0.0.1`
|
|
|
|
|
- 鏂囦欢鍚嶆牸寮忥細`Koneko_{骞冲彴鍚峿_v{鐗堟湰鍙穧.js`
|
|
|
|
|
|
|
|
|
|
## 鍏€佸父瑙侀棶棰?
|
|
|
|
|
| 闂 | 鍘熷洜 | 瑙e喅 |
|
|
|
|
|
|------|------|------|
|
|
|
|
|
| `Cannot find module 'axios'` | 鐢ㄤ簡 axios | 鏀圭敤鍐呯疆 `http`/`https` |
|
|
|
|
|
| `Field 'list' is required` | 杩斿洖 `songs` 鑰岄潪 `list` | 鏀瑰瓧娈靛悕涓?`list` |
|
|
|
|
|
| 鎼滅储鏃犵粨鏋?| 瀛楁鍚嶄笉鍖归厤 | 妫€鏌?`errcode` vs `error_code` |
|
|
|
|
|
| 鎾斁澶辫触 | `mapBr` 杩斿洖鏍煎紡涓嶅 | tx/kg/kw/mg/git 鐢?`320k`锛寃y 鐢?`320000` |
|
|
|
|
|
| 灏侀潰鍥句笉鏄剧ず | URL 鏍煎紡閿欒 | 妫€鏌ュ悇骞冲彴鎷兼帴瑙勫垯 |
|
|
|
|
|
|
|
|
|
|
## 涓冦€佺浉鍏抽摼鎺?
|
|
|
|
|
- Gitea: http://171.80.3.149:4321/miao-moe
|
|
|
|
|
- CeruMusic: http://171.80.3.149:4321/miao-moe/CeruMusic
|
|
|
|
|
- QZMusic PC: http://171.80.3.149:4321/miao-moe/QZMusic_PC
|