|
@@ -1,5 +1,6 @@
|
|
|
var url = require('url');
|
|
|
var logger = require('../tools/logger');
|
|
|
+var redis = require('../tools/redis');
|
|
|
var fetch = require('node-fetch');
|
|
|
var parseString = require('xml2js').parseString;
|
|
|
|
|
@@ -8,58 +9,69 @@ module.exports = function (req, res) {
|
|
|
req.connection.remoteAddress ||
|
|
|
req.socket.remoteAddress ||
|
|
|
req.connection.socket.remoteAddress;
|
|
|
- logger.info(`bilibili form IP: ${ip}`);
|
|
|
|
|
|
var query = url.parse(req.url,true).query;
|
|
|
var aid = query.aid;
|
|
|
- var dan = {
|
|
|
- code: 1,
|
|
|
- danmaku: []
|
|
|
- };
|
|
|
|
|
|
function addZero(str, length){
|
|
|
return new Array(length - str.length + 1).join("0") + str;
|
|
|
}
|
|
|
|
|
|
- fetch(`http://www.bilibili.com/widget/getPageList?aid=${aid}`).then(
|
|
|
- response => response.json()
|
|
|
- ).then((data) => {
|
|
|
- fetch(`http://comment.bilibili.com/${data[0].cid}.xml`).then(
|
|
|
- response => response.text()
|
|
|
- ).then((data) => {
|
|
|
- parseString(data, function (err, result) {
|
|
|
- var danOriginal = result.i.d;
|
|
|
- for (var i = 0; i < danOriginal.length; i++) {
|
|
|
- console.log(danOriginal[i].$.p);
|
|
|
- var info = danOriginal[i].$.p.split(',');
|
|
|
- console.log(info);
|
|
|
- var type = '';
|
|
|
- if (info[1] === '4') {
|
|
|
- type = 'bottom';
|
|
|
- }
|
|
|
- else if (info[1] === '5') {
|
|
|
- type = 'top';
|
|
|
- }
|
|
|
- else {
|
|
|
- type = 'right';
|
|
|
+ redis.client.get(`bilibili${aid}`, function(err, reply) {
|
|
|
+ if (reply) {
|
|
|
+ logger.info(`Bilibili AV${aid} form redis, IP: ${ip}`);
|
|
|
+ res.send(reply);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ logger.info(`Bilibili AV${aid} form origin, IP: ${ip}`);
|
|
|
+
|
|
|
+ var dan = {
|
|
|
+ code: 1,
|
|
|
+ danmaku: []
|
|
|
+ };
|
|
|
+
|
|
|
+ fetch(`http://www.bilibili.com/widget/getPageList?aid=${aid}`).then(
|
|
|
+ response => response.json()
|
|
|
+ ).then((data) => {
|
|
|
+ fetch(`http://comment.bilibili.com/${data[0].cid}.xml`).then(
|
|
|
+ response => response.text()
|
|
|
+ ).then((data) => {
|
|
|
+ parseString(data, function (err, result) {
|
|
|
+ var danOriginal = result.i.d;
|
|
|
+ for (var i = 0; i < danOriginal.length; i++) {
|
|
|
+ var info = danOriginal[i].$.p.split(',');
|
|
|
+ var type = '';
|
|
|
+ if (info[1] === '4') {
|
|
|
+ type = 'bottom';
|
|
|
+ }
|
|
|
+ else if (info[1] === '5') {
|
|
|
+ type = 'top';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ type = 'right';
|
|
|
+ }
|
|
|
+ var danOne = {
|
|
|
+ author: 'bilibili' + info[6],
|
|
|
+ time: info[0],
|
|
|
+ text: danOriginal[i]._,
|
|
|
+ color: '#' + addZero(parseInt(info[3]).toString(16), 6),
|
|
|
+ type: type
|
|
|
+ };
|
|
|
+ dan.danmaku.push(danOne);
|
|
|
+ }
|
|
|
+ var sendDan = JSON.stringify(dan);
|
|
|
+ res.send(sendDan);
|
|
|
+
|
|
|
+ redis.set(`bilibili${aid}`, sendDan);
|
|
|
+ });
|
|
|
}
|
|
|
- var danOne = {
|
|
|
- author: 'bilibili' + info[6],
|
|
|
- time: info[0],
|
|
|
- text: danOriginal[i]._,
|
|
|
- color: '#' + addZero(parseInt(info[3]).toString(16), 6),
|
|
|
- type: type
|
|
|
- };
|
|
|
- dan.danmaku.push(danOne);
|
|
|
- }
|
|
|
- res.send(JSON.stringify(dan));
|
|
|
- });
|
|
|
- }
|
|
|
- ).catch(
|
|
|
- e => console.log("获取弹幕失败", e)
|
|
|
- );
|
|
|
- }
|
|
|
- ).catch(
|
|
|
- e => console.log("获取cid失败", e)
|
|
|
- );
|
|
|
+ ).catch(
|
|
|
+ e => logger.error("Bilibilib Error: getting danmaku", e)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ ).catch(
|
|
|
+ e => logger.error("Bilibilib Error: getting cid", e)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ });
|
|
|
};
|