diff --git a/index.js b/index.js
index 1981abc79f..fde0501bf2 100644
--- a/index.js
+++ b/index.js
@@ -8,4 +8,12 @@ app.engine('art', require('express-art-template'));
app.all('*', require('./routes/all'));
+// bilibili
+app.get('/bilibili/user/video/:uid', require('./routes/bilibili/video'));
+app.get('/bilibili/user/fav/:uid', require('./routes/bilibili/fav'));
+app.get('/bilibili/user/coin/:uid', require('./routes/bilibili/coin'));
+app.get('/bilibili/user/dynamic/:uid', require('./routes/bilibili/dynamic'));
+app.get('/bilibili/partion/:tid', require('./routes/bilibili/partion'));
+app.get('/bilibili/bangumi/:seasonid', require('./routes/bilibili/bangumi'));
+
app.listen(1200);
\ No newline at end of file
diff --git a/routes/bilibili/bangumi.js b/routes/bilibili/bangumi.js
new file mode 100644
index 0000000000..c1e5d37a98
--- /dev/null
+++ b/routes/bilibili/bangumi.js
@@ -0,0 +1,46 @@
+const request = require('request');
+const art = require('art-template');
+const path = require('path');
+const base = require('../base');
+const mix = require('../../utils/mix');
+
+module.exports = (req, res) => {
+ const seasonid = req.params.seasonid;
+
+ base({
+ req: req,
+ res: res,
+ getHTML: (callback) => {
+ request.get({
+ url: `https://bangumi.bilibili.com/jsonp/seasoninfo/${seasonid}.ver?callback=seasonListCallback&jsonp=jsonp&_=${+new Date()}`,
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://bangumi.bilibili.com/anime/${seasonid}/`
+ }
+ }, (err, httpResponse, body) => {
+ let data;
+ try {
+ data = JSON.parse(body.match(/^seasonListCallback\((.*)\);$/)[1]);
+ }
+ catch (e) {
+ data = {};
+ }
+ const result = data.result || {};
+
+ const html = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: result.title,
+ link: `https://bangumi.bilibili.com/anime/${seasonid}/`,
+ description: result.evaluate,
+ lastBuildDate: new Date().toUTCString(),
+ item: result.episodes && result.episodes.map((item) => ({
+ title: `第${item.index}话 ${item.index_title}`,
+ description: `更新时间:${item.update_time}
`,
+ pubDate: new Date(item.update_time).toUTCString(),
+ link: item.webplay_url
+ })),
+ });
+ callback(html);
+ });
+ }
+ });
+};
\ No newline at end of file
diff --git a/routes/bilibili/coin.js b/routes/bilibili/coin.js
new file mode 100644
index 0000000000..ff35293b68
--- /dev/null
+++ b/routes/bilibili/coin.js
@@ -0,0 +1,57 @@
+const request = require('request');
+const art = require('art-template');
+const path = require('path');
+const base = require('../base');
+const mix = require('../../utils/mix');
+
+module.exports = (req, res) => {
+ const uid = req.params.uid;
+
+ base({
+ req: req,
+ res: res,
+ getHTML: (callback) => {
+ request.post({
+ url: 'https://space.bilibili.com/ajax/member/GetInfo',
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ 'Origin': 'https://space.bilibili.com'
+ },
+ form: {
+ mid: uid
+ }
+ }, function (err, httpResponse, body) {
+ const name = JSON.parse(body).data.name;
+ request.get({
+ url: `https://space.bilibili.com/ajax/member/getCoinVideos?mid=${uid}`,
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`
+ }
+ }, function (err, httpResponse, body) {
+ let data;
+ try {
+ data = JSON.parse(body);
+ }
+ catch (e) {
+ data = {};
+ }
+
+ const html = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: `${name} 的 bilibili 投币视频`,
+ link: `https://space.bilibili.com/${uid}`,
+ description: `${name} 的 bilibili 投币视频`,
+ lastBuildDate: new Date().toUTCString(),
+ item: data.data && data.data.list && data.data.list.map((item) => ({
+ title: item.title,
+ description: `${item.title}
`,
+ link: `https://www.bilibili.com/video/av${item.stat.aid}`
+ })),
+ });
+ callback(html);
+ });
+ });
+ }
+ });
+};
\ No newline at end of file
diff --git a/routes/bilibili/dynamic.js b/routes/bilibili/dynamic.js
new file mode 100644
index 0000000000..ea580d4b9f
--- /dev/null
+++ b/routes/bilibili/dynamic.js
@@ -0,0 +1,74 @@
+const request = require('request');
+const art = require('art-template');
+const path = require('path');
+const base = require('../base');
+const mix = require('../../utils/mix');
+
+module.exports = (req, res) => {
+ const uid = req.params.uid;
+
+ base({
+ req: req,
+ res: res,
+ getHTML: (callback) => {
+ request.get({
+ url: `https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?host_uid=${uid}`,
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`
+ }
+ }, (err, httpResponse, body) => {
+ let data;
+ try {
+ data = JSON.parse(body);
+ }
+ catch (e) {
+ data = {};
+ }
+ const result = data.data && data.data.cards || {};
+
+ const html = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: `${result[0].desc.user_profile.info.uname} 的 bilibili 动态`,
+ link: `https://space.bilibili.com/${uid}/#/dynamic`,
+ description: `${result[0].desc.user_profile.info.uname} 的 bilibili 动态`,
+ lastBuildDate: new Date().toUTCString(),
+ item: result.map((item) => {
+ const parsed = JSON.parse(item.card);
+ const data = parsed.item || parsed;
+
+ // img
+ let imgHTML = '';
+ if (data.pictures) {
+ for (let i = 0; i < data.pictures.length; i++) {
+ imgHTML += `
`;
+ }
+ }
+ if (data.pic) {
+ imgHTML += `
`;
+ }
+
+ // link
+ let link = '';
+ if (data.dynamic_id) {
+ link = `https://t.bilibili.com/${data.dynamic_id}`;
+ }
+ else if (data.aid) {
+ link = `https://www.bilibili.com/video/av${data.aid}`;
+ }
+ else if (data.id) {
+ link = `https://h.bilibili.com/${data.id}`;
+ }
+
+ return {
+ title: data.title || data.description || data.content,
+ description: `${data.desc || data.description || data.content}${imgHTML}`,
+ pubDate: new Date((data.pubdate || data.upload_time || data.timestamp) * 1000).toUTCString(),
+ link: link
+ };
+ }),
+ });
+ callback(html);
+ });
+ }
+ });
+};
\ No newline at end of file
diff --git a/routes/bilibili/fav.js b/routes/bilibili/fav.js
new file mode 100644
index 0000000000..f22850327e
--- /dev/null
+++ b/routes/bilibili/fav.js
@@ -0,0 +1,58 @@
+const request = require('request');
+const art = require('art-template');
+const path = require('path');
+const base = require('../base');
+const mix = require('../../utils/mix');
+
+module.exports = (req, res) => {
+ const uid = req.params.uid;
+
+ base({
+ req: req,
+ res: res,
+ getHTML: (callback) => {
+ request.post({
+ url: 'https://space.bilibili.com/ajax/member/GetInfo',
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ 'Origin': 'https://space.bilibili.com'
+ },
+ form: {
+ mid: uid
+ }
+ }, function (err, httpResponse, body) {
+ const name = JSON.parse(body).data.name;
+ request.get({
+ url: `https://api.bilibili.com/x/v2/fav/video?vmid=${uid}&ps=30&tid=0&keyword=&pn=1&order=fav_time`,
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/#/favlist`
+ }
+ }, function (err, httpResponse, body) {
+ let data;
+ try {
+ data = JSON.parse(body);
+ }
+ catch (e) {
+ data = {};
+ }
+
+ const html = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: `${name} 的 bilibili 收藏夹`,
+ link: `https://space.bilibili.com/${uid}/#/favlist`,
+ description: `${name} 的 bilibili 收藏夹`,
+ lastBuildDate: new Date().toUTCString(),
+ item: data.data && data.data.archives && data.data.archives.map((item) => ({
+ title: item.title,
+ description: `${item.desc}
`,
+ pubDate: new Date(item.fav_at * 1000).toUTCString(),
+ link: `https://www.bilibili.com/video/av${item.aid}`
+ })),
+ });
+ callback(html);
+ });
+ });
+ }
+ });
+};
\ No newline at end of file
diff --git a/routes/bilibili/partion.js b/routes/bilibili/partion.js
new file mode 100644
index 0000000000..59d5e4feef
--- /dev/null
+++ b/routes/bilibili/partion.js
@@ -0,0 +1,51 @@
+const request = require('request');
+const art = require('art-template');
+const path = require('path');
+const base = require('../base');
+const mix = require('../../utils/mix');
+
+module.exports = (req, res) => {
+ const tid = req.params.tid;
+
+ base({
+ req: req,
+ res: res,
+ getHTML: (callback) => {
+ request.get({
+ url: `https://api.bilibili.com/x/web-interface/newlist?ps=15&rid=${tid}&_=${+new Date()}`,
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': 'https://www.bilibili.com/'
+ }
+ }, (err, httpResponse, body) => {
+ let data;
+ try {
+ data = JSON.parse(body);
+ }
+ catch (e) {
+ data = {};
+ }
+
+ const list = data.data && data.data.archives;
+ let name = '未知';
+ if (list && list[0] && list[0].tname) {
+ name = list[0].tname;
+ }
+
+ const html = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: `bilibili ${name}分区`,
+ link: 'https://www.bilibili.com',
+ description: `bilibili ${name}分区`,
+ lastBuildDate: new Date().toUTCString(),
+ item: list && list.map((item) => ({
+ title: `${item.title} - ${item.owner.name}`,
+ description: `${item.desc}
`,
+ pubDate: new Date(item.pubdate * 1000).toUTCString(),
+ link: `https://www.bilibili.com/video/av${item.aid}`
+ })),
+ });
+ callback(html);
+ });
+ }
+ });
+};
\ No newline at end of file
diff --git a/routes/bilibili/video.js b/routes/bilibili/video.js
new file mode 100644
index 0000000000..c969e7a34e
--- /dev/null
+++ b/routes/bilibili/video.js
@@ -0,0 +1,58 @@
+const request = require('request');
+const art = require('art-template');
+const path = require('path');
+const base = require('../base');
+const mix = require('../../utils/mix');
+
+module.exports = (req, res) => {
+ const uid = req.params.uid;
+
+ base({
+ req: req,
+ res: res,
+ getHTML: (callback) => {
+ request.post({
+ url: 'https://space.bilibili.com/ajax/member/GetInfo',
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ 'Origin': 'https://space.bilibili.com'
+ },
+ form: {
+ mid: uid
+ }
+ }, function (err, httpResponse, body) {
+ const name = JSON.parse(body).data.name;
+ request.get({
+ url: `https://api.bilibili.com/x/v2/fav/video?vmid=${uid}&ps=30&tid=0&keyword=&pn=1&order=fav_time`,
+ headers: {
+ 'User-Agent': mix.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ }
+ }, function (err, httpResponse, body) {
+ let data;
+ try {
+ data = JSON.parse(body);
+ }
+ catch (e) {
+ data = {};
+ }
+
+ const html = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: `${name} 的 bilibili 空间`,
+ link: `https://space.bilibili.com/${uid}`,
+ description: `${name} 的 bilibili 空间`,
+ lastBuildDate: new Date().toUTCString(),
+ item: data.data && data.data.archives && data.data.archives.map((item) => ({
+ title: `${item.title} - ${item.owner.name}`,
+ description: `${item.desc}
`,
+ pubDate: new Date(item.pubdate * 1000).toUTCString(),
+ link: `https://www.bilibili.com/video/av${item.aid}`
+ })),
+ });
+ callback(html);
+ });
+ });
+ }
+ });
+};
\ No newline at end of file