From 77775b25f53d708681e72c030c9820fbe48a17e6 Mon Sep 17 00:00:00 2001 From: binaryify Date: Thu, 31 Dec 2020 15:26:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8C=E7=BB=B4=E7=A0=81?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 2 ++ docs/README.md | 20 +++++++++++- module/login_qr_check.js | 34 ++++++++++++++++++++ module/login_qr_create.js | 18 +++++++++++ module/login_qr_key.js | 26 +++++++++++++++ module/login_status.js | 43 ++++++++++++++----------- package.json | 1 + public/qrlogin.html | 66 +++++++++++++++++++++++++++++++++++++++ util/request.js | 6 +++- 9 files changed, 195 insertions(+), 21 deletions(-) create mode 100644 module/login_qr_check.js create mode 100644 module/login_qr_create.js create mode 100644 module/login_qr_key.js create mode 100644 public/qrlogin.html diff --git a/README.MD b/README.MD index 3b3744a..8384ff3 100644 --- a/README.MD +++ b/README.MD @@ -18,6 +18,8 @@ [sqaiyan/netmusic-node](https://github.com/sqaiyan/netmusic-node) +[greats3an/pyncm](https://github.com/greats3an/pyncm) + ## 环境要求 diff --git a/docs/README.md b/docs/README.md index ac3eda7..51698bf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -373,7 +373,7 @@ $ sudo docker run -d -p 3000:3000 netease-music-api ### 登录 -说明 : 登录有两个接口,建议使用`encodeURIComponent`对密码编码或者使用`POST`请求,避免某些特殊字符无法解析,如`#`(`#`在url中会被识别为hash,而不是query) +说明 : 登录有三个接口,建议使用`encodeURIComponent`对密码编码或者使用`POST`请求,避免某些特殊字符无法解析,如`#`(`#`在url中会被识别为hash,而不是query) #### 1. 手机登录 @@ -419,6 +419,24 @@ v3.30.0后支持手动传入cookie,登录接口返回内容新增 `cookie` 字 cookie:"xxx" } ``` +#### 3. 二维码登录 +说明: 二维码登录涉及到3个接口 +1. 二维码key生成接口 +说明: 调用此接口可生成一个key +**接口地址 :** `/login/qr/key` + +2. 二维码生成接口 +说明: 调用此接口传入上一个接口生成的key可生成二维码图片的base64和二维码信息,可使用base64展示图片,或者使用二维码信息内容自行使用第三方二维码生产库渲染二维码 +可选参数: `qrimg` 传入后 +**接口地址 :** `/login/qr/create` + + +3. 二维码检测扫码状态接口 +说明: 轮询此接口可获取二维码扫码状态,801为等待扫码,802为待确认,803为授权登陆成功 + +**接口地址 :** `/login/qr/check` + + #### 注意 diff --git a/module/login_qr_check.js b/module/login_qr_check.js new file mode 100644 index 0000000..9c396e2 --- /dev/null +++ b/module/login_qr_check.js @@ -0,0 +1,34 @@ +module.exports = async (query, request) => { + const data = { + key: query.key, + type: 1, + } + try { + let result = await request( + 'POST', + `https://music.163.com/weapi/login/qrcode/client/login`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) + result = { + status: 200, + body: { + ...result.body, + cookie: result.cookie.join(';'), + }, + cookie: result.cookie, + } + return result + } catch (error) { + return { + status: 200, + body: {}, + cookie: result.cookie, + } + } +} diff --git a/module/login_qr_create.js b/module/login_qr_create.js new file mode 100644 index 0000000..aeb6943 --- /dev/null +++ b/module/login_qr_create.js @@ -0,0 +1,18 @@ +const QRCode = require('qrcode') + +module.exports = (query, request) => { + return new Promise(async (resolve) => { + const url = `https://music.163.com/login?codekey=${query.key}` + return resolve({ + code: 200, + status: 200, + body: { + code: 200, + data: { + qrurl: url, + qrimg: query.qrimg ? await QRCode.toDataURL(url) : '', + }, + }, + }) + }) +} diff --git a/module/login_qr_key.js b/module/login_qr_key.js new file mode 100644 index 0000000..23c2ef6 --- /dev/null +++ b/module/login_qr_key.js @@ -0,0 +1,26 @@ +module.exports = async (query, request) => { + const data = { + type: 1, + } + const result = await request( + 'POST', + `https://music.163.com/weapi/login/qrcode/unikey`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) + return { + status: 200, + body: { + data: { + ...result.body, + code: 200, + }, + }, + cookie: result.cookie, + } +} diff --git a/module/login_status.js b/module/login_status.js index 3a38665..23286bc 100644 --- a/module/login_status.js +++ b/module/login_status.js @@ -1,21 +1,26 @@ -// 登录状态 - -module.exports = (query, request) => { - return request( - 'GET', - `https://music.163.com`, - {}, - { cookie: query.cookie, proxy: query.proxy, realIP: query.realIP }, - ).then((response) => { - try { - let profile = eval(`(${/GUser\s*=\s*([^;]+);/.exec(response.body)[1]})`) - let bindings = eval(`(${/GBinds\s*=\s*([^;]+);/.exec(response.body)[1]})`) - response.body = { code: 200, profile: profile, bindings: bindings } - return response - } catch (err) { - response.status = 301 - response.body = { code: 301 } - return Promise.reject(response) +module.exports = async (query, request) => { + const data = {} + let result = await request( + 'POST', + `https://music.163.com/weapi/w/nuser/account/get`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) + if (result.body.code === 200) { + result = { + status: 200, + body: { + data: { + ...result.body, + }, + }, + cookie: result.cookie, } - }) + } + return result } diff --git a/package.json b/package.json index 264d83c..fc960d8 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "express": "^4.17.1", "express-fileupload": "^1.1.9", "pac-proxy-agent": "^4.0.0", + "qrcode": "^1.4.4", "tunnel": "^0.0.6" }, "devDependencies": { diff --git a/public/qrlogin.html b/public/qrlogin.html new file mode 100644 index 0000000..a6beb3e --- /dev/null +++ b/public/qrlogin.html @@ -0,0 +1,66 @@ + + + + + + 二维码登录 + + + + +
+ + + + + diff --git a/util/request.js b/util/request.js index 425b2a5..0ad3b55 100644 --- a/util/request.js +++ b/util/request.js @@ -153,7 +153,11 @@ const createRequest = (method, url, data, options) => { try { answer.body = body answer.status = answer.body.code || res.status - if (answer.body.code === 502) { + if ( + [201, 302, 400, 502, 800, 801, 802, 803].indexOf(answer.body.code) > + -1 + ) { + // 特殊状态码 answer.status = 200 } } catch (e) {