diff --git a/nodejs/index.js b/nodejs/index.js index 1665f85..7c010f0 100644 --- a/nodejs/index.js +++ b/nodejs/index.js @@ -10,4 +10,5 @@ app.get('/', require('./routes/get')); app.post('/', require('./routes/post')); app.get('/list', require('./routes/list')); app.get('/bilibili', require('./routes/bilibili')); +app.get('/video/bilibili', require('./routes/video-bilibili')); app.listen(1207); \ No newline at end of file diff --git a/nodejs/package.json b/nodejs/package.json index 771365b..9ab3b24 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -7,6 +7,7 @@ "license": "MIT", "devDependencies": {}, "dependencies": { + "blueimp-md5": "^2.4.0", "express": "^4.13.4", "log4js": "^0.6.36", "mongoose": "^4.1.9", diff --git a/nodejs/routes/video-bilibili.js b/nodejs/routes/video-bilibili.js new file mode 100644 index 0000000..f61ca43 --- /dev/null +++ b/nodejs/routes/video-bilibili.js @@ -0,0 +1,54 @@ +var url = require('url'); +var logger = require('../tools/logger'); +var redis = require('../tools/redis'); +var fetch = require('node-fetch'); +var md5 = require('blueimp-md5'); + +module.exports = function (req, res) { + var ip = req.headers['x-forwarded-for'] || + req.connection.remoteAddress || + req.socket.remoteAddress || + req.connection.socket.remoteAddress; + + var query = url.parse(req.url,true).query; + var aid = query.aid; + var appkey = '4ebafd7c4951b366'; + var secret = '8cb98205e9b2ad3669aad0fce12a4c13'; + + redis.client.get(`bilibilicid${aid}`, function(err, reply) { + if (reply) { + logger.info(`Video Bilibili AV${aid} form redis, IP: ${ip}`); + + var sign = md5(`appkey=${appkey}&cid=${reply}&otype=json&quality=2&type=mp4${secret}`); + fetch(`https://interface.bilibili.com/playurl?appkey=${appkey}&cid=${reply}&otype=json&quality=2&type=mp4&sign=${sign}`).then( + response => response.text() + ).then((data) => { + res.send(data); + } + ).catch( + e => logger.error("Video Bilibilib Error: getting data", e) + ); + } + else { + logger.info(`Video Bilibili AV${aid} form origin, IP: ${ip}`); + + fetch(`http://www.bilibili.com/widget/getPageList?aid=${aid}`).then( + response => response.json() + ).then((data) => { + redis.set(`bilibilicid${aid}`, data[0].cid); + var sign = md5(`appkey=${appkey}&cid=${data[0].cid}&otype=json&quality=2&type=mp4${secret}`); + fetch(`https://interface.bilibili.com/playurl?appkey=${appkey}&cid=${data[0].cid}&otype=json&quality=2&type=mp4&sign=${sign}`).then( + response => response.text() + ).then((data) => { + res.send(data); + } + ).catch( + e => logger.error("Video Bilibilib Error: getting data", e) + ); + } + ).catch( + e => logger.error("Video Bilibilib Error: getting cid", e) + ); + } + }); +}; \ No newline at end of file