修复代理配置失效的问题 #992,修复新碟上架不返回周数据的问题,修复推荐新音乐接口返回数量问题,并添加limit参数支持 #981, 添加云贝相关接口 #985,添加用户账号信息接口,替换接口文件所有http url 为 https

This commit is contained in:
binaryify 2020-10-25 21:59:29 +08:00
parent 0ca29afda6
commit e8f9a7539a
38 changed files with 333 additions and 46 deletions

View File

@ -2,7 +2,7 @@
name: 创建问题反馈 name: 创建问题反馈
about: 问题反馈 about: 问题反馈
title: "<不按照模版格式或者删除模版信息将得不到处理,确认看完了调用前须知再发 issues>" title: "<不按照模版格式或者删除模版信息将得不到处理,确认看完了调用前须知再发 issues>"
labels: bug labels: ''
assignees: '' assignees: ''
--- ---
@ -25,6 +25,10 @@ assignees: ''
---
>维护项目都是业余时间,精力有限,我只能挑容易解决的issues处理,为了节约双方时间,请尽可能提供足够的有用的信息,给的信息不够我只能根据精力和时间看情况处理,如果模板信息看都不看就删掉,我不会进行任何回复,并且一个月后close掉issue
>先看文档有没有相关说明,调用前须知必看,确认看完了调用前须知再发 issues >先看文档有没有相关说明,调用前须知必看,确认看完了调用前须知再发 issues
>先在 issues 搜一下是否有相似问题,没有再发,否则直接关闭 >先在 issues 搜一下是否有相似问题,没有再发,否则直接关闭

View File

@ -1,4 +1,15 @@
# 更新日志 # 更新日志
### 3.45.0 | 2020.10.25
- 修复代理配置失效的问题 [#992](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/992)
- 修复新碟上架不返回周数据的问题,修复推荐新音乐接口返回数量问题,并添加limit参数支持 [#981](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/981)
- 添加`云贝`相关接口 [#985](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/985)
- 添加`用户账号信息`接口
- 替换接口文件所有http url 为 https
### 3.44.0 | 2020.10.17 ### 3.44.0 | 2020.10.17
- 更新`电台详情`,`电台节目详情`接口 [#977](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/977) - 更新`电台详情`,`电台节目详情`接口 [#977](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/977)

View File

@ -279,7 +279,16 @@ banner({ type:0 }).then(res=>{
177. 最近播放的视频 177. 最近播放的视频
178. 音乐日历 178. 音乐日历
179. 电台订阅者列表 179. 电台订阅者列表
180. 云贝签到信息
181. 云贝签到
182. 云贝所有任务
183. 云贝todo任务
184. 云贝今日签到信息
185. 云贝完成任务
186. 云贝收入
187. 云贝支出
188. 云贝账户信息
189. 账号信息
## 更新日志 ## 更新日志

View File

@ -195,6 +195,16 @@
177. 最近播放的视频 177. 最近播放的视频
178. 音乐日历 178. 音乐日历
179. 电台订阅者列表 179. 电台订阅者列表
180. 云贝签到信息
181. 云贝签到
182. 云贝所有任务
183. 云贝todo任务
184. 云贝今日签到信息
185. 云贝完成任务
186. 云贝收入
187. 云贝支出
188. 云贝账户信息
189. 账号信息
## 安装 ## 安装
@ -520,6 +530,14 @@ v3.30.0后支持手动传入cookie,登录接口返回内容新增 `cookie` 字
**调用例子 :** `/user/detail?uid=32953014` **调用例子 :** `/user/detail?uid=32953014`
### 获取账号信息
说明 : 登录后调用此接口 ,可获取用户账号信息
**接口地址 :** `/user/account`
**调用例子 :** `/user/account`
### 获取用户信息 , 歌单收藏mv, dj 数量 ### 获取用户信息 , 歌单收藏mv, dj 数量
说明 : 登录后调用此接口 , 可以获取用户信息 说明 : 登录后调用此接口 , 可以获取用户信息
@ -2179,12 +2197,12 @@ mp3url 不能直接用 , 可通过 `/song/url` 接口传入歌曲 id 获取具
**调用例子 :** `/personalized?limit=1` **调用例子 :** `/personalized?limit=1`
### 推荐新音乐 ### 推荐新音乐
说明 : 调用此接口 , 可获取推荐新音乐 说明 : 调用此接口 , 可获取推荐新音乐
**可选参数 :** `limit`: 取出数量 , 默认为 10 (不支持 offset)
**接口地址 :** `/personalized/newsong` **接口地址 :** `/personalized/newsong`
**调用例子 :** `/personalized/newsong` **调用例子 :** `/personalized/newsong`
@ -2916,12 +2934,82 @@ type='1009' 获取其 id, 如`/search?keywords= 代码时间 &type=1009`
**调用例子 :** `/digitalAlbum/ordering?id=86286082&payment=3&quantity=1` **调用例子 :** `/digitalAlbum/ordering?id=86286082&payment=3&quantity=1`
### 音乐日历 ### 音乐日历
说明 : 登录后调用此接口 传入开始和结束时间,可获取音乐日历 说明 : 登录后调用此接口,传入开始和结束时间,可获取音乐日历
**接口地址 :** `/calendar` **接口地址 :** `/calendar`
**调用例子 :** `/calendar?startTime=1606752000000&endTime=1609430399999` **调用例子 :** `/calendar?startTime=1606752000000&endTime=1609430399999`
### 云贝
说明 : 登录后调用此接口可获取云贝签到信息(连续签到天数,第二天全部可获得的云贝)
**接口地址 :** `/yunbei`
**调用例子 :** `/yunbei`
### 云贝今日签到信息
说明 : 登录后调用此接口可获取云贝今日签到信息(今日签到获取的云贝数)
**接口地址 :** `/yunbei/today`
**调用例子 :** `/yunbei/today`
### 云贝签到
说明 : 登录后调用此接口可进行云贝签到
**接口地址 :** `/yunbei/sign`
**调用例子 :** `/yunbei/sign`
### 云贝账户信息
说明 :登录后调用此接口可获取云贝账户信息(账户云贝数)
**接口地址 :** `/yunbei/info`
**调用例子 :** `/yunbei/info`
### 云贝所有任务
说明 :登录后调用此接口可获取云贝所有任务
**接口地址 :** `/yunbei/tasks`
**调用例子 :** `/yunbei/tasks`
### 云贝todo任务
说明 :登录后调用此接口可获取云贝todo任务
**接口地址 :** `/yunbei/tasks/todo`
**调用例子 :** `/yunbei/tasks/todo`
### 云贝完成任务
**必选参数 :**
`userTaskId` : 任务id
**接口地址 :** `/yunbei/task/finish`
**调用例子 :** `/yunbei/task/finish?userTaskId=5146243240`
### 云贝收入
说明 :登录后调用此接口可获取云贝收入
**可选参数 :** `limit`: 取出评论数量 , 默认为 10
`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*10, 其中 10 为 limit 的值
**接口地址 :** `/yunbei/tasks/receipt`
**调用例子 :** `/yunbei/tasks/receipt?limit=1`
### 云贝支出
说明 :登录后调用此接口可获取云贝支出
**可选参数 :** `limit`: 取出评论数量 , 默认为 10
`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*10, 其中 10 为 limit 的值
**接口地址 :** `/yunbei/tasks/expense`
**调用例子 :** `/yunbei/tasks/expense?limit=1`
### batch批量请求接口 ### batch批量请求接口
说明 : 登录后调用此接口 ,传入接口和对应原始参数(原始参数非文档里写的参数,需参考源码),可批量请求接口 说明 : 登录后调用此接口 ,传入接口和对应原始参数(原始参数非文档里写的参数,需参考源码),可批量请求接口

37
interface.d.ts vendored
View File

@ -802,7 +802,10 @@ export function personalized_djprogram(
export function personalized_mv(params: RequestBaseConfig): Promise<Response> export function personalized_mv(params: RequestBaseConfig): Promise<Response>
export function personalized_newsong( export function personalized_newsong(
params: RequestBaseConfig, params: {
area?: string | number
limit?: string | number
} & RequestBaseConfig,
): Promise<Response> ): Promise<Response>
export function personalized_privatecontent( export function personalized_privatecontent(
@ -1269,3 +1272,35 @@ export function dj_subscriber(
time?: number | string time?: number | string
} & RequestBaseConfig, } & RequestBaseConfig,
): Promise<Response> ): Promise<Response>
export function user_account(params: RequestBaseConfig): Promise<Response>
export function yunbei(params: RequestBaseConfig): Promise<Response>
export function yunbei_info(params: RequestBaseConfig): Promise<Response>
export function yunbei_sign(params: RequestBaseConfig): Promise<Response>
export function yunbei_receipt(
params: {
limit?: number | string
offset?: number | string
} & RequestBaseConfig,
): Promise<Response>
export function yunbei_expense(
params: {
limit?: number | string
offset?: number | string
} & RequestBaseConfig,
): Promise<Response>
export function yunbei_tasks(params: RequestBaseConfig): Promise<Response>
export function yunbei_today(params: RequestBaseConfig): Promise<Response>
export function yunbei_tasks_todo(params: RequestBaseConfig): Promise<Response>
export function yunbei_task_finish(
params: { userTaskId?: number | string } & RequestBaseConfig,
): Promise<Response>

View File

@ -6,7 +6,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://music.163.com/eapi/activate/initProfile`, `https://music.163.com/eapi/activate/initProfile`,
data, data,
{ {
crypto: 'eapi', crypto: 'eapi',

View File

@ -9,7 +9,7 @@ module.exports = (query, request) => {
data[i] = query[i] data[i] = query[i]
} }
}) })
return request('POST', `http://music.163.com/eapi/batch`, data, { return request('POST', `https://music.163.com/eapi/batch`, data, {
crypto: 'eapi', crypto: 'eapi',
proxy: query.proxy, proxy: query.proxy,
url: '/api/batch', url: '/api/batch',

View File

@ -7,7 +7,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://music.163.com/eapi/cellphone/existence/check`, `https://music.163.com/eapi/cellphone/existence/check`,
data, data,
{ {
crypto: 'eapi', crypto: 'eapi',

View File

@ -3,7 +3,7 @@ module.exports = (query, request) => {
const data = {} const data = {}
return request( return request(
'POST', 'POST',
`http://interface3.music.163.com/eapi/lbs/countries/v1`, `https://interface3.music.163.com/eapi/lbs/countries/v1`,
data, data,
{ {
crypto: 'eapi', crypto: 'eapi',

View File

@ -5,7 +5,7 @@ module.exports = (query, request) => {
query.cookie.os = 'pc' query.cookie.os = 'pc'
return request( return request(
'POST', 'POST',
`http://music.163.com/weapi/djradio/banner/get`, `https://music.163.com/weapi/djradio/banner/get`,
{}, {},
{ {
crypto: 'weapi', crypto: 'weapi',

View File

@ -3,7 +3,7 @@
module.exports = (query, request) => { module.exports = (query, request) => {
return request( return request(
'POST', 'POST',
`http://music.163.com/weapi/djradio/category/excludehot`, `https://music.163.com/weapi/djradio/category/excludehot`,
{}, {},
{ {
crypto: 'weapi', crypto: 'weapi',

View File

@ -3,7 +3,7 @@
module.exports = (query, request) => { module.exports = (query, request) => {
return request( return request(
'POST', 'POST',
`http://music.163.com/weapi/djradio/home/category/recommend`, `https://music.163.com/weapi/djradio/home/category/recommend`,
{}, {},
{ {
crypto: 'weapi', crypto: 'weapi',

View File

@ -6,7 +6,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://music.163.com/weapi/djradio/home/today/perfered`, `https://music.163.com/weapi/djradio/home/today/perfered`,
data, data,
{ {
crypto: 'weapi', crypto: 'weapi',

View File

@ -5,7 +5,7 @@ module.exports = (query, request) => {
limit: query.limit || 20, limit: query.limit || 20,
offset: query.offset || 0, offset: query.offset || 0,
} }
return request('POST', `http://music.163.com/weapi/act/hot`, data, { return request('POST', `https://music.163.com/weapi/act/hot`, data, {
crypto: 'weapi', crypto: 'weapi',
cookie: query.cookie, cookie: query.cookie,
proxy: query.proxy, proxy: query.proxy,

View File

@ -3,6 +3,8 @@
module.exports = (query, request) => { module.exports = (query, request) => {
const data = { const data = {
type: 'recommend', type: 'recommend',
limit: query.limit || 10,
areaId: query.areaId || 0,
} }
return request( return request(
'POST', 'POST',

View File

@ -7,7 +7,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://interface3.music.163.com/eapi/playlist/desc/update`, `https://interface3.music.163.com/eapi/playlist/desc/update`,
data, data,
{ {
crypto: 'eapi', crypto: 'eapi',

View File

@ -7,7 +7,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://interface3.music.163.com/eapi/playlist/update/name`, `https://interface3.music.163.com/eapi/playlist/update/name`,
data, data,
{ {
crypto: 'eapi', crypto: 'eapi',

View File

@ -7,7 +7,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://interface3.music.163.com/eapi/playlist/tags/update`, `https://interface3.music.163.com/eapi/playlist/tags/update`,
data, data,
{ {
crypto: 'eapi', crypto: 'eapi',

View File

@ -11,7 +11,7 @@ module.exports = async (query, request) => {
} }
console.log(data) console.log(data)
return request('POST', `http://music.163.com/api/playlist/track/add`, data, { return request('POST', `https://music.163.com/api/playlist/track/add`, data, {
crypto: 'weapi', crypto: 'weapi',
cookie: query.cookie, cookie: query.cookie,
proxy: query.proxy, proxy: query.proxy,

View File

@ -14,7 +14,7 @@ module.exports = async (query, request) => {
return request( return request(
'POST', 'POST',
`http://music.163.com/api/playlist/track/delete`, `https://music.163.com/api/playlist/track/delete`,
data, data,
{ {
crypto: 'weapi', crypto: 'weapi',

View File

@ -13,7 +13,7 @@ module.exports = async (query, request) => {
try { try {
const res = await request( const res = await request(
'POST', 'POST',
`http://music.163.com/api/playlist/manipulate/tracks`, `https://music.163.com/api/playlist/manipulate/tracks`,
data, data,
{ {
crypto: 'weapi', crypto: 'weapi',
@ -32,7 +32,7 @@ module.exports = async (query, request) => {
if (error.body.code === 512) { if (error.body.code === 512) {
return request( return request(
'POST', 'POST',
`http://music.163.com/api/playlist/manipulate/tracks`, `https://music.163.com/api/playlist/manipulate/tracks`,
{ {
op: query.op, // del,add op: query.op, // del,add
pid: query.pid, // 歌单id pid: query.pid, // 歌单id

View File

@ -10,7 +10,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://music.163.com/weapi/playmode/intelligence/list`, `https://music.163.com/weapi/playmode/intelligence/list`,
data, data,
{ {
crypto: 'weapi', crypto: 'weapi',

View File

@ -9,15 +9,10 @@ module.exports = (query, request) => {
password: crypto.createHash('md5').update(query.password).digest('hex'), password: crypto.createHash('md5').update(query.password).digest('hex'),
nickname: query.nickname, nickname: query.nickname,
} }
return request( return request('POST', `https://music.163.com/api/register/cellphone`, data, {
'POST', crypto: 'weapi',
`https://music.163.com/weapi/register/cellphone`, cookie: query.cookie,
data, proxy: query.proxy,
{ realIP: query.realIP,
crypto: 'weapi', })
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
},
)
} }

View File

@ -3,7 +3,7 @@
module.exports = (query, request) => { module.exports = (query, request) => {
return request( return request(
'POST', 'POST',
`http://interface3.music.163.com/eapi/search/defaultkeyword/get`, `https://interface3.music.163.com/eapi/search/defaultkeyword/get`,
{}, {},
{ {
crypto: 'eapi', crypto: 'eapi',

View File

@ -8,7 +8,7 @@ module.exports = (query, request) => {
} }
return request( return request(
'POST', 'POST',
`http://music.163.com/weapi/share/friends/resource`, `https://music.163.com/weapi/share/friends/resource`,
data, data,
{ {
crypto: 'weapi', crypto: 'weapi',

9
module/user_account.js Normal file
View File

@ -0,0 +1,9 @@
module.exports = (query, request) => {
const data = {}
return request('POST', `https://music.163.com/api/nuser/account/get`, data, {
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
})
}

View File

@ -4,7 +4,7 @@ module.exports = (query, request) => {
const data = { const data = {
songIds: [query.id], songIds: [query.id],
} }
return request('POST', `http://music.163.com/weapi/cloud/del`, data, { return request('POST', `https://music.163.com/weapi/cloud/del`, data, {
crypto: 'weapi', crypto: 'weapi',
cookie: query.cookie, cookie: query.cookie,
proxy: query.proxy, proxy: query.proxy,

10
module/yunbei.js Normal file
View File

@ -0,0 +1,10 @@
module.exports = (query, request) => {
const data = {}
// /api/point/today/get
return request('POST', `https://music.163.com/api/point/signed/get`, data, {
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
})
}

17
module/yunbei_expense.js Normal file
View File

@ -0,0 +1,17 @@
module.exports = (query, request) => {
const data = {
limit: query.limit || 10,
offset: query.offset || 0,
}
return request(
'POST',
`https://music.163.com/store/api/point/expense`,
data,
{
crypto: 'api',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
},
)
}

9
module/yunbei_info.js Normal file
View File

@ -0,0 +1,9 @@
module.exports = (query, request) => {
const data = {}
return request('POST', `https://music.163.com/api/v1/user/info`, data, {
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
})
}

17
module/yunbei_receipt.js Normal file
View File

@ -0,0 +1,17 @@
module.exports = (query, request) => {
const data = {
limit: query.limit || 10,
offset: query.offset || 0,
}
return request(
'POST',
`https://music.163.com/store/api/point/receipt`,
data,
{
crypto: 'api',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
},
)
}

11
module/yunbei_sign.js Normal file
View File

@ -0,0 +1,11 @@
module.exports = (query, request) => {
const data = {
type: '0',
}
return request('POST', `https://music.163.com/api/point/dailyTask`, data, {
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
})
}

View File

@ -0,0 +1,17 @@
module.exports = (query, request) => {
const data = {
userTaskId: query.userTaskId,
depositCode: '0',
}
return request(
'POST',
`https://music.163.com/api/usertool/task/point/receive`,
data,
{
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
},
)
}

14
module/yunbei_tasks.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = (query, request) => {
const data = {}
return request(
'POST',
`https://music.163.com/api/usertool/task/list/all`,
data,
{
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
},
)
}

View File

@ -0,0 +1,14 @@
module.exports = (query, request) => {
const data = {}
return request(
'POST',
`https://music.163.com/api/usertool/task/todo/query`,
data,
{
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
},
)
}

9
module/yunbei_today.js Normal file
View File

@ -0,0 +1,9 @@
module.exports = (query, request) => {
const data = {}
return request('POST', `https://music.163.com/api/point/today/get`, data, {
crypto: 'weapi',
cookie: query.cookie,
proxy: query.proxy,
realIP: query.realIP,
})
}

View File

@ -1,6 +1,6 @@
{ {
"name": "NeteaseCloudMusicApi", "name": "NeteaseCloudMusicApi",
"version": "3.44.0", "version": "3.45.0",
"description": "网易云音乐 NodeJS 版 API", "description": "网易云音乐 NodeJS 版 API",
"scripts": { "scripts": {
"start": "node app.js", "start": "node app.js",
@ -44,7 +44,8 @@
"axios": "^0.20.0", "axios": "^0.20.0",
"express": "^4.17.1", "express": "^4.17.1",
"express-fileupload": "^1.1.9", "express-fileupload": "^1.1.9",
"pac-proxy-agent": "^4.0.0" "pac-proxy-agent": "^4.0.0",
"tunnel": "^0.0.6"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "14.11.10", "@types/node": "14.11.10",

View File

@ -4,11 +4,11 @@ const queryString = require('querystring')
const PacProxyAgent = require('pac-proxy-agent') const PacProxyAgent = require('pac-proxy-agent')
const http = require('http') const http = require('http')
const https = require('https') const https = require('https')
const tunnel = require('tunnel')
const qs = require('url')
// request.debug = true // 开启可看到更详细信息 // request.debug = true // 开启可看到更详细信息
const chooseUserAgent = (ua = false) => { const chooseUserAgent = (ua = false) => {
// UA 列表要经常更新啊
const userAgentList = { const userAgentList = {
mobile: [ mobile: [
// iOS 13.5.1 14.0 beta with safari // iOS 13.5.1 14.0 beta with safari
@ -122,11 +122,26 @@ const createRequest = (method, url, data, options) => {
if (options.crypto === 'eapi') settings.encoding = null if (options.crypto === 'eapi') settings.encoding = null
if (/\.pac$/i.test(options.proxy)) { if (options.proxy) {
settings.httpAgent = new PacProxyAgent(options.proxy) if (options.proxy.indexOf('pac') > -1) {
settings.httpsAgent = new PacProxyAgent(options.proxy) settings.httpAgent = new PacProxyAgent(options.proxy)
} else { settings.httpsAgent = new PacProxyAgent(options.proxy)
settings.proxy = options.proxy } else {
var purl = qs.parse(options.proxy)
if (purl.hostname) {
const agent = tunnel.httpsOverHttp({
proxy: {
host: purl.hostname,
port: purl.port || 80,
},
})
settings.httpsAgent = agent
settings.httpAgent = agent
settings.proxy = false
} else {
console.error('代理配置无效,不使用代理')
}
}
} }
axios(settings) axios(settings)