diff --git a/package.json b/package.json index 2189408..6637e31 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,12 @@ "eslint-plugin-prettier": "2.6.1" }, "dependencies": { + "cheerio": "1.0.0-rc.2", "koa": "2.5.1", "koa-bodyparser": "4.2.1", "koa-router": "7.4.0", "mongoose": "5.1.7", + "node-fetch": "2.1.2", "redis": "2.8.0", "winston": "3.0.0", "xml2js": "0.4.19" diff --git a/router.js b/router.js index a7eb9b9..21c1fb5 100644 --- a/router.js +++ b/router.js @@ -3,5 +3,6 @@ const router = new Router(); router.get('/v3', require('./routes/get')); router.post('/v3', require('./routes/post')); +router.get('/v3/bilibili', require('./routes/bilibili')); module.exports = router; \ No newline at end of file diff --git a/routes/bilibili.js b/routes/bilibili.js new file mode 100644 index 0000000..8f80f90 --- /dev/null +++ b/routes/bilibili.js @@ -0,0 +1,46 @@ +const fetch = require('node-fetch'); +const cheerio = require('cheerio'); + +module.exports = async (ctx) => { + const aid = ctx.request.query.aid; + let cid = ctx.request.query.cid; + + if (!cid && aid) { + cid = await ctx.redis.get(`v3bilibiliaid2cid${aid}`); + if (!cid) { + const res = await fetch(`http://www.bilibili.com/widget/getPageList?aid=${aid}`); + const result = await res.json(); + cid = result[0].cid; + ctx.redis.set(`v3bilibiliaid2cid${aid}`, cid); + } + } + let data = await ctx.redis.get(`v3bilibilicid2dan${cid}`); + if (data) { + ctx.response.set('X-Koa-Redis', 'true'); + data = JSON.parse(data); + } else { + const res = await fetch(`https://api.bilibili.com/x/v1/dm/list.so?oid=${cid}`); + const result = await res.text(); + const $ = cheerio.load(result.replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g, ''), { + xmlMode: true + }); + data = $('d').map((i, el) => { + const item = $(el); + const p = item.attr('p').split(','); + let type = 0; + if (p[1] === '4') { + type = 2; + } + else if (p[1] === '5') { + type = 1; + } + return [[parseFloat(p[0]), type, parseInt(p[3]), p[6], item.text()]]; + }).get(); + ctx.redis.set(`v3bilibilicid2dan${cid}`, JSON.stringify(data)); + ctx.response.set('X-Koa-Origin', 'true'); + } + ctx.body = JSON.stringify({ + code: 0, + data: data, + }); +}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 7213c37..9945bcb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,10 @@ # yarn lockfile v1 +"@types/node@*": + version "10.5.2" + resolved "https://registry.npmjs.org/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" + accepts@^1.2.2: version "1.3.5" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" @@ -100,6 +104,10 @@ bluebird@3.5.0: version "3.5.0" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -151,6 +159,17 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +cheerio@1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -261,6 +280,19 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + debug@*, debug@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -330,6 +362,41 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + dependencies: + dom-serializer "0" + domelementtype "1" + double-ended-queue@^2.1.0-0: version "2.1.0-0" resolved "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" @@ -344,6 +411,10 @@ enabled@1.0.x: dependencies: env-variable "0.0.x" +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + env-variable@0.0.x: version "0.0.4" resolved "https://registry.npmjs.org/env-variable/-/env-variable-0.0.4.tgz#0d6280cf507d84242befe35a512b5ae4be77c54e" @@ -604,6 +675,17 @@ has@^1.0.1: dependencies: function-bind "^1.1.1" +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + http-assert@^1.1.0: version "1.3.0" resolved "https://registry.npmjs.org/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" @@ -645,7 +727,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -849,7 +931,7 @@ lodash.get@4.4.2: version "4.4.2" resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" -lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: +lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: version "4.17.10" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -971,6 +1053,16 @@ nice-try@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" +node-fetch@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" + +nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + object-assign@^4.0.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1020,6 +1112,12 @@ os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + dependencies: + "@types/node" "*" + parseurl@^1.3.0: version "1.3.2" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -1089,7 +1187,7 @@ raw-body@^2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" -readable-stream@^2.3.6: +readable-stream@^2.0.2, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: