diff --git a/app.js b/app.js index 2fec1b8efe1a5a253eb7605ecdc24f88822ec1e8..cd5060987793d55debc1c50e67fbf01a499d9e4d 100644 --- a/app.js +++ b/app.js @@ -1,5 +1,4 @@ const express = require("express"); -const http = require("http"); const apicache = require("apicache"); const path = require("path"); @@ -248,7 +247,7 @@ app.use("/user/record", require("./router/user_playrecord")); const port = process.env.PORT || 3000; app.listen(port, () => { - console.log(`server running @${port}`); + console.log(`server running @ http://localhost:${port}`); }); module.exports = app; diff --git a/router/comment_music.js b/router/comment_music.js index 9dff354983f095ef267fe4eb268132b748789518..8c5697c531dcf566bc502b41c82ffeb3956074aa 100644 --- a/router/comment_music.js +++ b/router/comment_music.js @@ -1,27 +1,27 @@ -const express = require('express') -const router = express() -const { createWebAPIRequest } = require('../util/util') +const express = require("express"); +const router = express(); +const { createWebAPIRequest } = require("../util/util"); -router.get('/', (req, res) => { - const rid = req.query.id - const cookie = req.get('Cookie') ? req.get('Cookie') : '' +router.get("/", (req, res) => { + const rid = req.query.id; + const cookie = req.get("Cookie") ? req.get("Cookie") : ""; const data = { offset: req.query.offset || 0, rid: rid, limit: req.query.limit || 20, - csrf_token: '' - } + csrf_token: "" + }; createWebAPIRequest( - 'music.163.com', + "music.163.com", `/weapi/v1/resource/comments/R_SO_4_${rid}/?csrf_token=`, - 'POST', + "POST", data, cookie, music_req => { - res.send(music_req) + res.send(music_req); }, - err => res.status(502).send('fetch error') - ) -}) + err => res.status(502).send(err.message) + ); +}); -module.exports = router +module.exports = router; diff --git a/test/musicUrl.test.js b/test/musicUrl.test.js index 3b10109af94fd794c3afeeed5441b33daf5b88a8..bd4528657dd53a8a72bfef41cb0828638d8f31c9 100644 --- a/test/musicUrl.test.js +++ b/test/musicUrl.test.js @@ -1,32 +1,33 @@ -const assert = require('assert') -const crypto = require('crypto') -const { createWebAPIRequest } = require('../util/util') +const assert = require("assert"); +const crypto = require("crypto"); +const { createWebAPIRequest } = require("../util/util"); -describe('测试获取歌曲是否正常', () => { - it('歌曲的 url 不应该为空', done => { - const id = 347230 - const br = 999000 +describe("测试获取歌曲是否正常", () => { + it("歌曲的 url 不应该为空", done => { + const id = 462791935; + const br = 999000; const data = { ids: [id], br: br, - csrf_token: '' - } - const cookie = '' + csrf_token: "" + }; + const cookie = ""; createWebAPIRequest( - 'music.163.com', - '/weapi/song/enhance/player/url', - 'POST', + "music.163.com", + "/weapi/song/enhance/player/url", + "POST", data, cookie, music_req => { - console.log(JSON.parse(music_req).data[0].url) - assert(!!JSON.parse(music_req).data[0].url) - done() + console.log(music_req); + console.log(JSON.parse(music_req).data[0].url); + assert(!!JSON.parse(music_req).data[0].url); + done(); }, err => { - done(err) + done(err); } - ) - }) -}) + ); + }); +}); diff --git a/util/util.js b/util/util.js index 0447cdb826b4f9d2de705c902075b370695ccb2c..1ac5b80bb8af423b5f4ee639ddfb7fa9a74c0e51 100644 --- a/util/util.js +++ b/util/util.js @@ -1,32 +1,33 @@ -const Encrypt = require('./crypto.js') -const http = require('http') -const querystring = require('querystring') +const Encrypt = require("./crypto.js"); +const request = require("request"); +const querystring = require("querystring"); function randomUserAgent() { const userAgentList = [ - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1', - 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36', - 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89;GameHelper', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4', - 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:46.0) Gecko/20100101 Firefox/46.0', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0', - 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)', - 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)', - 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', - 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)', - 'Mozilla/5.0 (Windows NT 6.3; Win64, x64; Trident/7.0; rv:11.0) like Gecko', - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586', - 'Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1' - ] - const num = Math.floor(Math.random() * userAgentList.length) - return userAgentList[num] + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1", + "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1", + "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36", + "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89;GameHelper", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4", + "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:46.0) Gecko/20100101 Firefox/46.0", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0", + "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", + "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)", + "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", + "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)", + "Mozilla/5.0 (Windows NT 6.3; Win64, x64; Trident/7.0; rv:11.0) like Gecko", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586", + "Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1" + ]; + const num = Math.floor(Math.random() * userAgentList.length); + return userAgentList[num]; } + function createWebAPIRequest( host, path, @@ -36,94 +37,62 @@ function createWebAPIRequest( callback, errorcallback ) { - let music_req = '' - const cryptoreq = Encrypt(data) - const http_client = http.request( - { - hostname: host, - method: method, - path: path, - headers: { - Accept: '*/*', - 'Accept-Language': 'zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4', - Connection: 'keep-alive', - 'Content-Type': 'application/x-www-form-urlencoded', - Referer: 'http://music.163.com', - Host: 'music.163.com', - Cookie: cookie, - 'User-Agent': randomUserAgent() - } + const cryptoreq = Encrypt(data); + const options = { + url: `http://${host}${path}`, + method: method, + headers: { + Accept: "*/*", + "Accept-Language": "zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4", + Connection: "keep-alive", + "Content-Type": "application/x-www-form-urlencoded", + Referer: "http://music.163.com", + Host: "music.163.com", + Cookie: cookie, + "User-Agent": randomUserAgent() }, - function(res) { - res.on('error', function(err) { - errorcallback(err) - }) - res.setEncoding('utf8') - if (res.statusCode != 200) { - createWebAPIRequest(host, path, method, data, cookie, callback) - return - } else { - res.on('data', function(chunk) { - music_req += chunk - }) - res.on('end', function() { - if (music_req == '') { - createWebAPIRequest(host, path, method, data, cookie, callback) - return - } - if (res.headers['set-cookie']) { - callback(music_req, res.headers['set-cookie']) - } else { - callback(music_req) - } - }) - } - } - ) - http_client.write( - querystring.stringify({ + body: querystring.stringify({ params: cryptoreq.params, encSecKey: cryptoreq.encSecKey }) - ) - http_client.end() + }; + + request(options, function(error, res, body) { + if (error) { + errorcallback(error); + } else { + callback(body, res.headers["set-cookie"]); + } + }); } -function createRequest(path, method, data, callback, errorcallback) { +function createRequest(path, method, data) { return new Promise((resolve, reject) => { - let ne_req = '' - const http_client = http.request( - { - hostname: 'music.163.com', - method: method, - path: path, - headers: { - Referer: 'http://music.163.com', - Cookie: 'appver=1.5.2', - 'Content-Type': 'application/x-www-form-urlencoded', - 'User-Agent': randomUserAgent() - } - }, - res => { - res.setEncoding('utf8') - res.on('error', err => { - reject(err) - }) - res.on('data', chunk => { - ne_req += chunk - }) - res.on('end', () => { - resolve(ne_req) - }) + const options = { + url: `http://music.163.com${path}`, + method: method, + headers: { + Referer: "http://music.163.com", + Cookie: "appver=1.5.2", + "Content-Type": "application/x-www-form-urlencoded", + "User-Agent": randomUserAgent() } - ) - if (method == 'POST') { - http_client.write(data) + }; + + if (method.toLowerCase() === "post") { + options.body = data; } - http_client.end() - }) + + request(options, function(error, res, body) { + if (error) { + reject(error); + } else { + resolve(body); + } + }); + }); } module.exports = { createWebAPIRequest, createRequest -} +};